本文共 6295 字,大约阅读时间需要 20 分钟。
在上一小节讲到了有关docker镜像如何管理,接下来本章节主要围绕docker容器的管理:如何创建、启动、关闭、重启容器等与docker容器管理相关的操作。
1.1 容器创建
容器创建可以使用docker create命令来创建,例如根据现有centos镜像创建一个容器:[root@srv-xjwy-dns-node01 ~]# docker create -it centos:latest5257f30de0eed6d26913eb554bbad990c4d28bc7d2ad642804016f666b4acee8
使用docker create命令新建的容器是处于停止状态,可以使用docker start命令启动它。
1.2 容器启动
容器启动有两种方式:一是基于镜像新建一个容器并启动;另一种是将处于终止状态的容器重新启动,所需要的命令主要由docker run来完成,等价于先执行了docker create后再执行docker start命令,例如下面命令输出一个“hello world”后容器自动终止:[root@srv-xjwy-dns-node01 ~]# docker run centos:latest /bin/echo "hello world"hello world
可以看出这跟本地执行 /bin/echo "hello world“ 几乎感觉不出没任何区别。
需要注意的是:当利用docker run来创建并启动一个容器时,docker在后台会做以下几种标准操作:1.检查本地是否存在指定的镜像,不存在就从公有仓库下载;2.利用镜像新创建一个容器并启动;3.分配一个文件系统,并在只读的镜像层外挂载一层可读可写层;4.从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;5.从ip地址分配池中自动获取一个可用ip给容器;6.执行用户指定运行的应用程序;7.执行完毕后容器被终止;
注意:在日常使用中docker run 常常会结合以几种参数来创建启动一个容器:
1. 通过“-i”选项让docker容器标准输入保持打开;2. 通过“-t”选项让docker容器分配一个为终端(tty)并绑定到容器的标准输入上
例如,通过下面的命令启动了一个bash终端,允许用户进行交互:
[root@srv-xjwy-dns-node01 ~]# docker run -it centos:latest /bin/bash[root@2f65e4edf24c /]# ps PID TTY TIME CMD 1 pts/0 00:00:00 bash 13 pts/0 00:00:00 ps
发现在容器内只运行了bash应用,并没有运行其他不需要的进程,此时如果我们要退出容器可以使用“Ctrl+d”或者在容器内执行“exit”即可,此时容器会自动处于终止状态,这是因为对于容器来说,运行的应用程序结束了,容器就没有必要继续运行了,所以会处于终止状态。
1.3 容器后台运行
在很多应用场景,程序需要长期在后台运行,这时就需要让docker容器在后台以守护进程运行,这种情况下只需要通过添加“-d”选项来实现,例如我们新建一个容器并后台运行:[root@srv-xjwy-dns-node01 ~]# docker run -itd centos:latest /bin/sh -c "while true; do echo hello; sleep 1; done"b4df4f5b17da0c83e20b4f6fa6b27674df6e83d8c2d1026461138f4d178aa7d3
容器启动后会返回一个唯一的id,此时通过“docker ps -a”来查看容器信息,发现容器已经在后台运行,如下所示:
[root@srv-xjwy-dns-node01 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESb4df4f5b17da centos:latest "/bin/sh -c 'while..." About a minute ago Up About a minute eager_ritchie
如果想要获取容器的输出信息,即输出日志,使用“docker logs“,格式:”docker logs 容器id”即可查看容器logs,如下示例所示:
[root@srv-xjwy-dns-node01 ~]# docker logs b4hellohello......
2.1 容器停止、启动、重启
容器终止可以使用“docker stop”命令,命令格式为:”docker stop 容器id“ 首先它会向容器发送SIGTERM信号,然后等待一段时间后(如不指定默认为10s),再发送SIGKILL信号终止容器;另外当容器中指定的应用终结后,容器也会自动处于终止状态,如运行一个bash终端的容器在程序运行完后,用户通过exit或“Ctrl+d”来退出容器,列如通过docker stop停止一个在后台运行的容器:[root@srv-xjwy-dns-node01 ~]# docker stop b4b4[root@srv-xjwy-dns-node01 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESb4df4f5b17da centos:latest "/bin/sh -c 'while..." 12 minutes ago Exited (137) 12 seconds ago eager_ritchie
注意:也可以通过docker kill 容器id来终止容器,这种方式好比Linux系统中kill -kill或kill -9 强杀进程方式。
处于停止状态的容器可以使用docker ps -a -q命令查看,例如:
[root@srv-xjwy-dns-node01 ~]# docker ps -a -qb4df4f5b17da
同样处于停止状态的容器也可以通过docker start,docker restart来重新启动,例如启动刚才停止的docker容器:
[root@srv-xjwy-dns-node01 ~]# docker start b4df4f5b17dab4df4f5b17da[root@srv-xjwy-dns-node01 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESb4df4f5b17da centos:latest "/bin/sh -c 'while..." 3 hours ago Up 9 seconds eager_ritchie
或者重启该容器:
[root@srv-xjwy-dns-node01 ~]# docker restart eager_ritchieeager_ritchie
仔细观察可能会注意到这里启动的方式是docker start +容器id号,而重启却是docker restart +用的容器name,这是因为在第一次新建并运行一个容器时,docker自动会为容器取一个names,这里为eager_ritchie,所以不管使用的是容器id还是容器name都可以实现容器停止,启动,重启操作。
注意:
虽然创建容器的时候,系统默认会为容器分配一个容器名称,但为了好记可以使用“--name” 来重新定义容器的名称,这样做有很多好处,比如:起一个好记的名称方便管理,还有在停止启动容器时也可以使用容器名称操作等等操作。
2.2 容器删除
使用docker rm命令可以删除一个处于终止状态的容器,命令格式:docker rm [options] containern(docker rm +可选参数 +容器id或容器name),支持的选项参数如下:-f,--force=false 强制终止并删除一个正在运行的容器;-l,--link=false 删除容器的连接,但保留容器;-v,--volumes=false 删除容器挂载的数据卷;例如删除刚才处于终止状态的容器:
[root@srv-xjwy-dns-node01 ~]# docker rm b4df4f5b17da 或[root@srv-xjwy-dns-node01 ~]# docker rm eager_ritchie
如果要删除一个处于在运行的容器时,可以添加“-f”参数选项,docker会先发出一个SIGKILL信号强制关闭该容器,然后再执行docker rm操作删除该容器,例如:
[root@srv-xjwy-dns-node01 ~]# docker rm -f eager_ritchie
不过正确的做法应该是先关闭该容器,再执行docker rm 操作,以避免容器文件遗留问题。
2.2 容器登录
容器在以后台方式运行时,用户是无法看到容器的运行信息,有时候用户需要登录容器进行一些管理操作,这时就需要登录到容器,登录容器有多种方式,比如:docker attach,docker exec以及nsenter工具等,这里主要以前两种方式做示例。[root@srv-xjwy-dns-node01 ~]# docker attach b4hellohello
但有时使用docker attach登录容器并不方便,比如当使用多个窗口登录时,所有的窗口都会同步显示,这时如有一个窗口阻塞会导致其他窗口也阻塞,导致所有窗口都无法使用。
[root@srv-xjwy-dns-node01 ~]# docker exec -it b4 /bin/bash[root@b4df4f5b17da /]# ps -ef
3.1 容器导出
使用docker export可以将一个已经创建的容器导出到一个文件(不管此容器是否在运行),命令格式为: docker export conntainer 即(docker export +容器id或容器name);例如导出容器id为b4df4f5b17da的容器到宿主主机的/home/gamaxwin/目录下,并命令为test.tar文件[root@srv-xjwy-dns-node01 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESb4df4f5b17da centos:latest "/bin/sh -c 'while..." 4 hours ago Up 11 minutes eager_ritchie[root@srv-xjwy-dns-node01 ~]# docker export b4df4f5b17da >/home/gamaxwin/test.tar[root@srv-xjwy-dns-node01 ~]# ll /home/gamaxwin/test.tar-rw-r--r-- 1 root root 212082688 Dec 12 15:21 /home/gamaxwin/test.tar
3.2 容器导入
容器导入可以利用docker import命令导入,成为本地镜像仓库的镜像,例如刚才导出的test.tar文件导入到本地镜像,并为导入的镜像添加一个tag,tag名为centos:v1.0 :[root@srv-xjwy-dns-node01 ~]# cat /home/gamaxwin/test.tar |docker import - centos:v1.0sha256:bb7f65b08b2b2f6e29ec3fde71d66eef2efdc0bb9b5197090086d94ed1a9e4b0[root@srv-xjwy-dns-node01 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcentos v1.0 bb7f65b08b2b 2 seconds ago 204MBtest latest efb2aa048732 22 hours ago 204MBcentos latest 3fa822599e10 12 days ago 204MB
总结:既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
转载于:https://blog.51cto.com/blief/2049683