容器管理
本节内容简介
回顾加本节内容
容器是Docker的一个基本概念,每个容器中都运行一个应用并为该应用提供完整的运行环境。本实验将详细学习Docker容器的创建,运行管理操作。需要依次完成下面几项任务:
- 创建第一个容器
- 查看容器信息
- 容器创建
- 管理容器运行状态
- 容器导出及导入
一、实验一:创建第一个容器
还记得上一节实验中我们如何创建一个持续运行的容器吗?在这里我们回顾下创建的步骤:
如果我们需要一个保持运行的容器呢,最简单的方法就是给这个容器一个可以保持的应用,比如bash
,运行 ubuntu 容器并进入容器的 bash:
$ docker run -t -i ubuntu /bin/bash
上面命令的说明:
-t
:分配一个pseudo-TTY
-i
:--interactive
参数缩写,表示交互模式,如果没有attach
保持 STDIN 打开状态ubuntu
:运行的镜像名称,默认为latest
标签/bin/bash
:容器中运行的应用
通过这个简单的命令,我们现在进入了新创建容器的bash中,在bash里执行的任何命令都不会影响到我们的宿主机,可以随意操作。你可以看到主机名和环境变量 HOSTNAME
都已经显示为容器的ID了。
在这个bash下,我们可以进行各种Ubuntu系统上的操作,当然因为Docker本身的限制,有些涉及到磁盘、网络、设备等Linux特权命令是无法执行的,可以试试reboot
命令,会提示你shutdown: Unable to shutdown system
。
如何退出这个bash呢?有两种方法,两种方法的效果完全不同:
- 直接
exit
,这时候 bash 程序终止,容器进入到停止状态 - 使用组合键退出,仍然保持容器运行,我们可以随时回来到这个bash中来,组合键是
Ctrl-p Ctrl-q
,你没有看错,是两组组合键,先同时按下Ctrl
和p,再按Ctrl
和q。就可以退出到我们的宿主机了。
上述第二种方法比较常用,此时使用 docker ps
查看,能看到容器仍然在运行中:
Ctrl+p和ctrl+q 离开容器,暂时退出容器但不关闭。
如果想再次回到刚才的bash中,只需要使用 docker attach
命令就可以再次连接到运行的bash里:
注意: 命令后面的参数是容器的ID,并不需要输入完整的数字,只要能唯一定位这个容器即可,通常输入4位就足够了。
我们创建了第一个容器后,将会先实践一些容器信息查看的命令。通过这些命令我们可以在宿主机上了解到容器的运行情况。
注意:下面的命令都是针对该容器执行的,参数中的容器ID请替换成你实际实验中创建的容器ID。
二、实验二:查看容器信息
1、查看容器列表 - docker ps
docker ps
命令最常用,可以列出所有容器的信息,默认情况下只显示运行状态的容器。
必要的参数在上一节实验中已经介绍过了,这里可以进行回顾。
几个最常用的参数:
-a
:查看所有容器,含停止运行的-l
:查看刚启动的容器-q
:只显示容器ID
我们查看所有容器的ID列表:
2、查看容器内进程信息 - docker top
docker top
命令查看容器中运行的进程信息,显示容器中进程的PID,UID,PPID,时间,tty等信息。
上图中的输出结果由于终端大小限制,造成列表压缩到两行。
3、查看容器输出信息 - docker logs
获取容器的输出信息可以使用 docker logs
命令,我们使用 docker attach
回到刚才创建的/bin/bash
容器中,写一个循环输出信息的脚本,然后再使用Ctrl-P Ctrl-Q
组合键退出。
在宿主机的终端中,我们可以用docker logs
命令查看输出信息。
docker logs
只会显示截止到当前的所有输出,如果想动态查看实时输出,也可以加-f
参数,类似tail
命令:
4、查看容器详细信息 - docker inspect
docker inspect
查看容器的细节信息,包括创建时间,操作命令,端口映射信息,IP地址等等。
这个命令不只可以查看容器的详细信息,也支持镜像的详细信息。默认输出JSON格式的信息,可以通过-f
指定输出的项目。
上述命令中我们查看了网络配置信息中的IP地址和Gateway地址。
5、查看容器的运行信息 - docker stats
docker stats
可以查看到运行状态容器的CPU,内存及网络使用率。在实际工作中,我们通常会把这个命令的输出连接到类似Logstash一类的服务用来分析。
这个命令的输出是实时刷新的(类似Linux上的top
命令),如果需要退出可以使用Ctrl-C
组合键。
6、查看容器中的修改 - docker diff
docker diff
查看容器中对镜像做了哪些变化。
实验过程如下:
- 先执行
docker diff
查看现有的容器中的变化,发现没有任何文件变化 - 连接到容器内部,
Ctrl-C
中断先前实验的死循环 - 再创建几个文件
- 退出到宿主机
- 再次使用
docker diff
命令查看是否有新的修改
输出的信息中A
表示添加,后面的三个新建文件的路径。可以尝试下修改或删除文件会有怎样的diff
输出。
7、连接到容器中 - docker attach
docker attach
可以进入到容器操作。当我们容器后台运行时,有需要的话也可以再次连接进入到容器中。
这个命令在上述的实验中已经多次用到了,不再提供单独的操作。
三、实验三:创建容器
创建一个容器的命令是 docker run
。还记得先前实验中学习的Hello, Shiyanlou
及/bin/bash
容器如何创建的吗?在上一节中我们学习了最基本的容器创建方式,本节内容我们将通过实例来学习更详细的docker run
参数。
docker run
命令的执行步骤:
- 查找镜像或下载镜像
- 创建容器
- 分配文件系统及虚拟网络(网桥,接口,IP地址),其中容器中的DNS默认挂载宿主机的
/etc/resolve.conf
和/etc/hosts
。 - 执行应用,默认执行镜像中指定的CMD参数,也可以在
docker run
后面跟应用来覆盖CMD命令。
如果容器中的应用执行完成,则容器进入到终止状态。
docker run
的参数非常多,本实验中我们设定要创建的容器配置:
- 设置容器名称
shiyanlou
(使用--name
,如果不加该参数,Docker会随机产生一个名字)。 - 设置容器的主机名
shiyanlou
(使用--hostname
参数) - 设定网络信息,这里只使用一个简单的参数设置MAC地址(
--mac-address
参数) - 设置资源限制,设置容器中最大的进程数,包括soft和hard两个限制值(使用
-ulimit nproc=...
等参数)
创建容器过程中也可以挂载数据卷,数据卷在下一节实验中会详细介绍。这里不过多涉及。
根据上述的需求我们通过查询 docker run --help
,使用相关参数,创建符合要求的容器:
docker run --name shiyanlou --hostname shiyanlou --mac-address 00:01:02:03:04:05 --ulimit nproc=1024:2048 -t -i ubuntu /bin/bash
进入容器中我们可以对一些参数进行验证:
容器中的 ulimit
不会有任何输出,查看实际的ulimit
信息可以在宿主机上使用docker inspect
查看:
四、实验四:容器运行状态
1、守护状态
首先需要了解的概念是容器的守护状态,类似于守护进程,需要为run
命令增加参数-d
,此时容器在后台以守护状态(Daemonized)形式运行。
创建一个守护状态的容器:
docker run -d ubuntu /bin/bash -c "while true; do echo 'hello shiyanlou'; sleep 1; done"
会启动一个守护状态的容器在后台运行,使用 docker attach
登录上去可以看到循环输出 hello shiyanlou
的字符串。
2、容器运行管理
本节实验中,我们需要练习启动,停止,重启容器的若干命令。这些命令用来管理从容器创建后到删除的整个生命周期。
停止容器 docker stop
停止运行状态的容器,进入到终止状态。停止状态的容器可以通过 docker ps -a
查看到。
首先使用 docker stop shiyanlou
命令停止名称为shiyanlou的容器:
使用docker ps -a
查看容器状态:
启动容器 docker start
启动停止状态的容器。再次启动名称为shiyanlou的容器:
重启容器 docker restart
可以将运行状态的容器终止,然后重新启动。
杀死容器 docker kill
跟进程相同,有的时候正常的终止操作不起作用时,我们需要使用 kill
命令杀死进程,在docker kill
可以处理异常的运行状态的容器,强制退出:
暂停和恢复容器 docker pause/unpause
类似Windows操作系统的睡眠,我们可以先临时将容器的运行挂起,不再使用CPU资源,当需要的时候再恢复成正常的运行状态。
先启动shiyanlou容器,再执行pause
操作:
恢复shiyanlou容器:
删除容器 docker rm
当一个容器不再需要时,我们可以删除这个容器。对于停止的容器直接执行docker rm 容器ID
,对于运行状态的容器也可以执行docker rm -f 容器ID强制删除
。
五、实验五:导出和导入容器
导出和导入容器操作可以将容器导出到压缩包,并可将压缩包导入到Docker系统中成为镜像,为容器的迁移和镜像的制作提供支持。
1、容器导出 docker export
导出容器快照到本地的tar包。导出后的文件可以拷贝到其他 Docker 服务器上执行导入命令形成新的镜像,我们在实验楼的环境中进行测试。
实验过程:
- 查看当前环境中的容器,选择需要导出的容器
- 查看该容器修改的内容
- 导出容器到tar包,保存到
/home/shiyanlou
目录 - 查看导出的tar包
需要注意的是,当容器导出后,容器仍然在Docker环境中运行,只是拷贝了一份内容到tar包。
2、容器导入 docker import
我们执行导入命令,将该文件加载到docker系统中,文件加载后会成为镜像,命令执行时需要制定导入后生成的镜像的名字:
cat shiyanlou.tar | docker import - shiyanlou:1.0
执行导入后,使用docker images
查看是否有新的镜像产生:
docker import 命令比较灵活,也可以直接从URL链接进行导入。所以可以记住这是一种创建镜像的方式,将容器导出后拷贝到目标服务器然后导入成镜像。
使用新镜像创建容器,查看是否与导出的容器内容一致:
六、 总结
- 创建第一个容器
- 查看容器信息
- 容器创建
- 管理容器运行状态
- 容器导出及导入
请务必保证自己能够动手完成整个实验,只看文字很简单,真正操作的时候会遇到各种各样的问题,解决问题的过程才是收获的过程。