容器管理

本节内容简介

 回顾加本节内容

容器是Docker的一个基本概念,每个容器中都运行一个应用并为该应用提供完整的运行环境。本实验将详细学习Docker容器的创建,运行管理操作。需要依次完成下面几项任务:

  1. 创建第一个容器
  2. 查看容器信息
  3. 容器创建
  4. 管理容器运行状态
  5. 容器导出及导入

一、实验一:创建第一个容器

还记得上一节实验中我们如何创建一个持续运行的容器吗?在这里我们回顾下创建的步骤:

如果我们需要一个保持运行的容器呢,最简单的方法就是给这个容器一个可以保持的应用,比如bash,运行 ubuntu 容器并进入容器的 bash:

  $ docker run -t -i ubuntu /bin/bash

  

上面命令的说明:

  1. -t:分配一个 pseudo-TTY
  2. -i--interactive参数缩写,表示交互模式,如果没有 attach 保持 STDIN 打开状态
  3. ubuntu:运行的镜像名称,默认为latest 标签
  4. /bin/bash:容器中运行的应用

通过这个简单的命令,我们现在进入了新创建容器的bash中,在bash里执行的任何命令都不会影响到我们的宿主机,可以随意操作。你可以看到主机名和环境变量 HOSTNAME 都已经显示为容器的ID了。

在这个bash下,我们可以进行各种Ubuntu系统上的操作,当然因为Docker本身的限制,有些涉及到磁盘、网络、设备等Linux特权命令是无法执行的,可以试试reboot命令,会提示你shutdown: Unable to shutdown system

如何退出这个bash呢?有两种方法,两种方法的效果完全不同:

  1. 直接 exit,这时候 bash 程序终止,容器进入到停止状态
  2. 使用组合键退出,仍然保持容器运行,我们可以随时回来到这个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 查看容器中对镜像做了哪些变化。

实验过程如下:

  1. 先执行docker diff 查看现有的容器中的变化,发现没有任何文件变化
  2. 连接到容器内部,Ctrl-C中断先前实验的死循环
  3. 再创建几个文件
  4. 退出到宿主机
  5. 再次使用docker diff命令查看是否有新的修改

输出的信息中A 表示添加,后面的三个新建文件的路径。可以尝试下修改或删除文件会有怎样的diff输出。

7、连接到容器中 - docker attach

docker attach 可以进入到容器操作。当我们容器后台运行时,有需要的话也可以再次连接进入到容器中。

这个命令在上述的实验中已经多次用到了,不再提供单独的操作。

三、实验三:创建容器

创建一个容器的命令是 docker run。还记得先前实验中学习的Hello, Shiyanlou/bin/bash容器如何创建的吗?在上一节中我们学习了最基本的容器创建方式,本节内容我们将通过实例来学习更详细的docker run参数。

docker run命令的执行步骤:

  1. 查找镜像或下载镜像
  2. 创建容器
  3. 分配文件系统及虚拟网络(网桥,接口,IP地址),其中容器中的DNS默认挂载宿主机的/etc/resolve.conf/etc/hosts
  4. 执行应用,默认执行镜像中指定的CMD参数,也可以在docker run后面跟应用来覆盖CMD命令。

如果容器中的应用执行完成,则容器进入到终止状态。

docker run 的参数非常多,本实验中我们设定要创建的容器配置:

  1. 设置容器名称 shiyanlou(使用--name,如果不加该参数,Docker会随机产生一个名字)。
  2. 设置容器的主机名 shiyanlou(使用--hostname参数)
  3. 设定网络信息,这里只使用一个简单的参数设置MAC地址(--mac-address参数)
  4. 设置资源限制,设置容器中最大的进程数,包括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 服务器上执行导入命令形成新的镜像,我们在实验楼的环境中进行测试。

实验过程:

  1. 查看当前环境中的容器,选择需要导出的容器
  2. 查看该容器修改的内容
  3. 导出容器到tar包,保存到/home/shiyanlou目录
  4. 查看导出的tar包

需要注意的是,当容器导出后,容器仍然在Docker环境中运行,只是拷贝了一份内容到tar包。

2、容器导入 docker import

我们执行导入命令,将该文件加载到docker系统中,文件加载后会成为镜像,命令执行时需要制定导入后生成的镜像的名字:

  cat shiyanlou.tar | docker import - shiyanlou:1.0

执行导入后,使用docker images 查看是否有新的镜像产生:

docker import 命令比较灵活,也可以直接从URL链接进行导入。所以可以记住这是一种创建镜像的方式,将容器导出后拷贝到目标服务器然后导入成镜像。

使用新镜像创建容器,查看是否与导出的容器内容一致:

六、 总结

  1. 创建第一个容器
  2. 查看容器信息
  3. 容器创建
  4. 管理容器运行状态
  5. 容器导出及导入

请务必保证自己能够动手完成整个实验,只看文字很简单,真正操作的时候会遇到各种各样的问题,解决问题的过程才是收获的过程。