前言

本人是参照于:https://yeasy.gitbooks.io/docker_practice/content/ 学习Docker,因每次翻查略有不便,把部分认为对于我比较重要的内容写在这里以作记录。

本文保持不定时更新:http://www.lucien.ink/archives/301/

安装Docker

安装完成 docker 之后需执行 sudo usermod -aG docker $(whoami) 来将当前用户加至 docker 的用户组下。

国内用户

阿里云镜像

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

DaoCloud 镜像

sudo curl -sSL https://get.daocloud.io/docker | sh

国外用户

sudo curl -sSL get.docker.com | sh

镜像加速

Docker Hub直接获取镜像实在是太慢了,类似于Linux里的换软件源,Docker也可以自定义镜像的来源,这里采用官方提供的国内加速服务。

配置镜像

Ubuntu 14.04、Debian 7 Wheezy

编辑/etc/default/docker文件,在其中的DOCKER_OPTS中配置加速器地址:

DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"

Ubuntu 16.04+、Debian 8+、CentOS 7

/etc/docker/daemon.json中写入如下内容(如果文件不存在的话新建该文件,一定要保证该文件符合 json 规范,否则 Docker 将不能启动)

{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ]
}

重启服务使镜像生效

sudo systemctl daemon-reload
sudo systemctl restart docker

获取镜像

从 Docker 镜像仓库获取镜像的命令是docker pull,其命令格式为:

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

具体的选项可以通过docker pull --help看到。

对于Docker Hub,如果不给出用户名,则默认为官方镜像。

docker pull ubuntu:16.04

上面的命令中没有给出Docker镜像仓库地址,因此将会从Docker Hub获取镜像。而镜像名称是ubuntu:16.04,因此将会获取官方镜像library/ubuntu仓库中标签为16.04的镜像。

容器

创建/运行容器

有了镜像之后,就可以创建或运行容器了。

据我目前的认知,如果本地没有指定的映像的时候Docker会自动下载镜像,在运行容器时如果没有指定容器则会自动创建一个容器。

docker run -dit -p 8080:80 ubuntu:16.04

执行这条命令来以守护态(保持在后台)运行那个我们刚才下载的镜像,其中-dit是守护态,-p 8080:80是将本地的8080端口映射至容器的80端口,ubuntu:16.04是镜像的名称。

$ docker run -dit -p 8080:80 ubuntu:16.04
229125e81ab57b10a4129c7b592bf10e353e7baaf4a33d16201b49139f701624

我们可以通过docker container ls来查看后台的所有容器。

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
229125e81ab5        ubuntu:16.04        "/bin/bash"         18 seconds ago      Up 17 seconds       0.0.0.0:8080->80/tcp   focused_lamarr

进入容器

执行docker exec -it <容器ID> bash就可以进入容器内部,看到熟悉的bash界面。

[root@CentOS-Server ~]$ docker run -dit -p 8080:80 ubuntu:16.04
229125e81ab57b10a4129c7b592bf10e353e7baaf4a33d16201b49139f701624

[root@CentOS-Server ~]$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
229125e81ab5        ubuntu:16.04        "/bin/bash"         18 seconds ago      Up 17 seconds       0.0.0.0:8080->80/tcp   focused_lamarr

[root@CentOS-Server ~]$ docker exec -it 229125e81ab5 bash

root@229125e81ab5:/$ cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.5 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.5 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

然后就可以开始随意瞎搞了。

终止容器

docker kill <容器ID>

可以终止一个运行中的容器。需要注意的是,除非你将更改应用至镜像,否则对每个容器的更改都是临时的(据我观察是这样的)。

容器快照的导入/导出

导出快照

如果要导出本地某个容器,可以使用docker export <容器ID> > <导出后的名字>.tar命令,通常称导出后的tar快照

[root@CentOS-Server ~]$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
afa433a465e7        ubuntu:16.04        "/bin/bash"         3 minutes ago       Up 3 minutes                            silly_pike

[root@CentOS-Server ~]$ docker export afa433a465e7 > test.tar

[root@CentOS-Server ~]$ ls
test.tar

这样一来容器就被导出到本地的test.tar中了。

导入快照

cat <快照名>.tar | docker import - <镜像名>[:标签]

[root@CentOS-Server ~]$ cat test.tar | docker import - test/ubuntu:1.0
sha256:6fa4015b56ca246babc800ed6420d4b3af08921e8e7ce64f0899fbacc8b2a390

[root@CentOS-Server ~]$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test/ubuntu         1.0                 6fa4015b56ca        9 seconds ago       183 MB
docker.io/ubuntu    16.04               578c3e61a98c        2 weeks ago         223 MB

这样一来我们刚才对容器做出的改变就被保存成了一个镜像。

镜像

通过 Dockerfile 构建镜像

Dockerfile 基本命令

命令解释

导出镜像

docker save [options] images [images...]

Example

docker save -o nginx.tar nginx:latest

其中:

-o 表示输出到文件,nginx.tar 为目标文件,nginx:latest 是源镜像名(name:tag)。

导入镜像

docker load [options]

Example

docker load -i nginx.tar

其中:

-i 表示从文件输入,nginx.tar 为目标文件。

重命名镜像

docker tag <old_image_tag | image_id> <new_image_tag>

删除镜像

docker rmi <image_tag | image_id>

删除 tag 的时候如果有其它的引用则只会删除 tag,如果没有引用会连同镜像一起删除。

其它命令集

$ docker ps // 查看所有正在运行容器
$ docker stop <容器ID>

$ docker ps -a // 查看所有容器
$ docker ps -a -q // 查看所有容器ID

$ docker stop $(docker ps -a -q) //  stop停止所有容器
$ docker rm $(docker ps -a -q) //   remove删除所有容器
最后修改:2020 年 11 月 03 日
谢谢老板!