Docker容器的典型声明周期为创建、管理到停止,直到最终删除。
以下操作均是使用root用户,更多命令以及相关说明,参考官网 https://docs.docker.com/reference/ 或者Linux平台的man命令查看,以下仅仅是简介
1、确保容器运行正常
查看docker程序是否存在,功能是否正常
docker info
该命令返回所有容器和镜像(镜像即是Docker用来构建容器的“构建块”)的数量、Docker使用的执行驱动和存储驱动(execution and storage driver),以及Docker的基本配置。
Containers: 1
Running: 0
Paused: 0
Stopped: 1
Images: 1
Server Version: 18.03.1-ce
Storage Driver: devicemapper
Pool Name: docker-253:0-750760-pool
Pool Blocksize: 65.54kB
Base Device Size: 10.74GB
......
docker是基于客户端-服务器架构的,它有一个docker程序,既能作为客户端,也能作为服务器端。作为客户端时,docker程序向Docker 守护进程发送请求,如上面请求守护进程自身信息,然后再对返回的请求结果进行处理。
2、运行容器
docker run -i -t centos /bin/bash
运行此命令后便启动了一个容器,之前我应启动过centos,如果你第一次启动可能有所不同,但最终结果运行相同
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
8ba884070f61: Already exists
Digest: sha256:8d487d68857f5bc9595793279b33d082b03713341ddec91054382641d14db861
Status: Downloaded newer image for centos:latest
[root@d3f041015c5b /]#
以上命令告诉Docker执行docker run
命令,并指定了 -i 和 -t 两个命令行参数。-i 标志保证容器的STDIN是开启的,尽管还未附着(附着在后面介绍)到容器中。-t 标志告诉Docker为要创建的容器分配一个伪tty终端,这样新创建的一个容器才能提供一个交互式shell。若要创建一个我们能与之进行交互交互的容器,这两个参数是最基本的参数了。
下面,告诉Docker基于什么镜像来创建容器,上面使用的centos镜像。centos镜像可以称为“基础”(base)镜像,它由 Docker公司提供,保存在 Docker Hub Registry上。你可以用 centos基础镜像(以及类似的 fedora、 debian、 ubuntu等镜像)为基础,在你选择的操作系统上构建自己的镜像。这里,我们基于此基础镜像启动了一个容器,并且没有对容器进行任何改动
启动时,Docker会检查本地是否存在centos镜像,如果本地还没有该镜像的话,那么 Docker就会连接官方维护的 Docker Hub Registry,査看 Docker Hub中是否有该镜像。 Docker一旦找到该镜像,就会下载该镜像并将其保存到本地宿主机中。
随后,Docker在文件系统内部用这个镜像创建了一个新容器。该容器拥有自己的网络、IP地址,以及一个用来和宿主机进行通信的桥接网络接口。最后,我们告诉 Docker在新容器中要运行什么命令,在本例中我们在容器中运行/bin/bash命令启动了一个 Bash shell。
3、使用容器
启动容器后,我们已经以root用户登录到了容器中,容器的ID为d3f041015c5b,这与在容器中运行hostname命令一致。这个容器就是一个最精简的centos系统了。
此时,你可以在容器中运行 cat /etc/hosts
、ps -aux
以及yum
安装软件等命令。总之,你可以在容器中做任何你想做的事情。当所有工作结束后,你可以输入exit,就可以返回宿主机的命令行提示符了。此时容器就处于停止运行状态了,容器虽然停止了运行,但是容器还是存在的,可以使用:
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d3f041015c5b centos "/bin/bash" 41 minutes ago Exited (0) 7 seconds ago priceless_blackwell
bd78ea139f35 centos "/bin/bash" 43 minutes ago Exited (0) 43 minutes ago pedantic_stallman
308d470fc531 centos "/bin/bash" 15 hours ago Exited (0) 15 hours ago jolly_golick
查看当前系统中容器的列表,注意
- -a 代表列出所有容器,包括停止的和运行的。不添加任何选项标志,默认只能看到正在运行的容器。
- -l 标志会列出最后一次运行的容器,包括正在运行的和已经停止的。
- -n x 可以显示最后x个容易,无论容器是运行的还是停止的。
- -q 标志标识只需要返回容器ID,不返回其他信息
从输出结果中我们可以看到关于这个容器的很多有用信息:ID、用于创建该容器的镜像、容器最后执行的命令、创建时间以及容器的退出状态(在上面的例子中,退出状态是0,因为容器是通过正常的exit命令退出的)。我们还可以看到,每个容器都有一个名称。
注意,有三种方式可以指代唯一容器:短UUID(如f7cdac22a02)、长UUID(如f7cbaac22a02e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778)或者名称(如priceless_blackwell)。
4、容器命名
Docker会为创建的每一个容器自动生成一个随机的名称。如果想为容器指定一个名称,可以用–name标志来实现,如
docker run --name self-container -i -t centos /bin/bash
合法的容器名称只能包含以下字符:小写字母a-z、大写字母A~Z、数字0-9、下划线、圆点、横线(如果用正则表达式来表示这些符号,就是[a-2A-20-9_.-])。
在很多 Docker命令中,都可以用容器的名称来替代容器ID,后面我们将会看到。容器名称有助于分辨容器,当构建容器和应用程序之间的逻辑连接时,容器的名称也有助于从逻辑上理解连接关系。具体的名称(如web、db)比容器ID和随机容器名好记多了。推荐大家都使用容器名称,以更加方便地管理容器。
容器的命名必须是唯一的。如果我们试图创建两个名称相同的容器,则命令将会失败。如果要使用的容器名称已经存在,可以先用 docker rm
命令删除已有的同名容器后,再来创建新的容器。
5、重新启动已经停止的的容器
启动
docker start containerName/ID
重启
docker restart containerName/ID
6、附着到容器
容器重新启动后,会沿用docker run命令时指定的参数来运行,因此容器重新启动后会运行一个交互式会话shell。我们可用通过
docker attach containerName/ID
重新附着到容器的会话上。
7、创建守护式容器
除了交互式运行的容器( Interactive container),我们也可以创建长期运行的容器。守护式容器( demonized container)没有交互式会话,非常适合运行应用程序和服务。大多数时候我们都需要以守护式来运行我们的容器。下面是启动一个守护式容器
docker run --name daemon_test -d centos /bin/bash -c "while true; do echo hello world; sleep 1; done"
上面的 docker run命令使用了 -d 参数,因此 Docker会将容器放到后台运行。容器要运行的命令里使用了一个 while循环,该循环一直打印hello world,直到容器或其进程停止运行。使用上面的这些参数,可以发现 docker run命令并没有像上一个容器将主机的控制台附着到新的 shell会话上,而是仅仅返回了一个容器ID而已,我们还是在主机的命令行之中。如果我们执行 docker ps命令,看到一个正在运行的容器:
0a9bc58bf5c7 centos "/bin/bash -c 'while…" 2 minutes ago Up 2 minutes daemon_test
为了探究容器内部在做什么,我们可以使用docker logs命令来获取容器日志:
docker logs containerName/ID
类比tail指令,还可以执行以下命令:
docker logs -f containerName/ID
docker logs --tail 10 containerName/ID
docker logs --tail 0 -f containerName/ID
docker logs -ft containerName/ID # -t 标识为每条日志项添加时间戳
8、查看容器内进程
docker top containerName/ID
9、在容器内部运行进程
在 Docker1.3之后,可以通过 docker exec命令在容器内部额外启动新进程。可以在容器内运行的进程有两种类型:后台任务和交互式任务。后台任务在容器内运行且没有交互需求,而交互式任务则保持在前台运行。对于需要在容器内部打开shel的任务,交
互式任务是很实用的。
docker exec -d containerName/ID commond
-d 标志表明需要运行一个后台进程,-d标志之后,指定的是要在内部执行这个命令的容器的名字以及要执行的命令。通过 docker exec后台命令,我们可以在正在运行的容器中进行维护、监控及管理任务。
docker exec -i -t containerName/ID commond
-t 和 -i 标志为我们执行的进程创建了TTY并捕捉STDN。接着我们指定了要在内部执行这个命令的容器的名字以及要执行的命令。
docker exec
是docker1.3引入的,早期版本不支持该命令。对于早期版本,参考nsenter
命令。
10、停止守护式容器
docker stop containerName/ID
stop命令会向Docker容器进程发送SIGTERM信号,如果想快速停止,可以使用docker kill
命令,向容器进程发送SIGKILL信号。
11、自动停止容器
如果由于某种错误而导致容器停止运行,我们还可以通过 --restart 标志,让Docker自动重新启动该容器。–restart 标志会检查容器的退出代码,并据此来决定是否要重启容器。默认的行为是Docker不会重启容器
docker run --restart=always --name containerName -d centos bin/bash -c "while true; do echo hello world; sleep 1; done"
–restart 标志被设置为 always。无论容器的退出代码是什么,Docker都会自动重启该容器。除了always,我们还可以将这个标志设为on-failure,这样,只有当容器的退出代码为非0值的时候,才会自动重启。另外,on-failure还接受一个可
选的重启次数参数,如下
docker run --restart=on-failure:5 --name containerName -d centos bin/bash -c "while true; do echo hello world; sleep 1; done"
上面标识,当容器退出代码非0时,Docker会尝试重启该容器,最多重启5次。
12、深入容器
除了通过docker ps
获取容器的信息,还可以使用docker inspect
来获得更多容器信息。
docker inspect ContainerName/ID
该命令会对容器进行详细的检查,然后返回其配置信息,名称、命令、网络配置以及很多有用的数据。
-f 或者–format 标志来选定查看结果
docker inspect --format '{{ .State.Running }}' containerName/ID
上面这条命令会返回容器的运行状态。我们还能获取其他有用的信息,如容器IP地址
docker inspect --format '{{ .NetworkSettings.IPAddress }}' containerName/ID
format或者-f 标志远非表面看上去那么简单。该标志实际上支持完整的Go语言模板。用它进行查询时,可以充分利用Go语言模板的优势。可以同时指定多个容器,并显示每个容器的输出结果,如:
docker inspect --format '{{ .Name }} {{ .NetworkSettings.IPAddress }}' containerName containerName1
注意,除了查看容器,你还可以通过浏览/var/lib/docker
目录来深入了解 Docker的工作原理。该目录存放着 Docker镜像、容器以及容器的配置。所有的容器都保存在/var/lib/docker/containers
目录下。
13、删除容器
docker rm containerName/ID
注意,只能删除已经停止运行的容器,运行中容器需要先停止再删除。目前,还没有命令一次删除所有容器,可以通过以下代码实现:
docker rm $(docker ps -a -q)
参考资料:《第一本Docker书》