莫张周刘王 发表于 2022-6-23 10:23:36

【云原生】三、详细易懂的Docker 容器管理

文章目录



[*]前言
[*]一、Docker 命令
[*]二、Docker 帮助
[*]三、Management Commands
[*]四、命令选项
[*]五、容器生命周期管理
[*]六、创建容器
[*]七、启动容器
[*]八、停止容器
[*]九、重启容器
[*]十、暂停进程
[*]十一、恢复进程
[*]十二、查看容器列表
[*]十三、连接到正在运行中的容器
[*]十四、查看容器的元数据
[*]十五、容器日志管理
[*]十六、显示容器中的进程信息
[*]十七、查看文件修改
[*]十八、容器中执行命令
[*]十九、删除容器
[*]总结

前言

 容器是 Docker 的一个基本概念,每个容器中都运行一个应用并为该应用提供完整的运行环境。
 本文将详细学习 Docker 容器的创建,运行管理操作。
一、Docker 命令

 除了之前学习过的查看 Docker 版本信息之外,在 Docker 的命令组中还有一个较为常用的命令,查看系统的一些相关信息:
docker system info

# 或者使用命令
docker info 运行截图如下所示:
https://img-blog.csdnimg.cn/6d00227d6c8f4b7b8d6cb91de56d6db5.png
二、Docker 帮助

 我们可以直接通过 help 或者使用 man 手册的方式查看相关命令的详细说明,例如我们直接使用如下命令:
docker --help  我们可以看到运行结果如下图所示。如果之前有学习过 Docker 相关知识的读者,可能会发现一些不一样的地方。即下图中标出的 Management Commands 和 Commands。在 1.13 版本之前,Docker 并没有 Mangement Commands。
https://img-blog.csdnimg.cn/3d506d2a2ffb4afb989a7f64f4af48bc.png
三、Management Commands

 在 Docker 1.12 之前,大约有四十个左右的顶级命令,这些命令没有经过任何组织,显得十分混乱,对于新手来说,学习它们并不轻松。Docker 1.13 之后,将命令进行分组,就得到如上图中所示的 Management Commands。例如经常使用的容器的一些相关命令:
# 使用 Commands 分组中的命令创建一个新的容器
docker create
# 使用 Management Commands 分组中的命令创建一个新的容器
docker container create

# 显示容器列表
docker ps
docker container ls

# 在一个新的容器中运行一个命令
docker run
docker container run  如上所示,对于新的命令而言相比于旧命令明显更具有可读性。在这里我们将一些常用的命令,及其对应的 Management Commands 命令都列举出来,方便大家在后续的学习过程中可以进行参考。
https://img-blog.csdnimg.cn/9ac4debeee8c4dc7a63be2e2faaf3255.png
四、命令选项

 命令的选项有以下几种:长选项、短选项、复合选项、无选项。
 我们以 docker container ls,即 docker ps,它的作用是查看容器。
 可以先输入以下命令,获得提示信息:
docker container ls --help 命令执行后的结果如下:
https://img-blog.csdnimg.cn/c790ac5a4f5240fd8cb6198efcbd8997.png
 可以看到图中的-a和 --all 选项,他们的作用都是显示所有容器(包括未运行的容器)。短选项是以一个 - 开头,其后紧跟上一个字母或数字,比如-a。长选项是以两个 - 开头,其后跟一串单词,比如--all。
# 使用短选项
docker container ls -a
# 使用长选项
docker container ls --all  那什么是复合选项呢?
 当我们要使用多个短选项时,比如使用-a和 -q。从图中可以看到,这个选项只会显示容器的 ID,原本命令应该是docker container ls -a -q,这时我们可以简写为 docker container ls -aq,这里的选项 -aq 就是复合选项,它是 -a和 -q 的复合。
 对于 docker container ls 这个命令,我们还可以不使用选项。没有选项时,输出正在运行的容器。关于 docker container ls 在本文后面的内容中还会详细介绍,我们只需要记住它的简单功能就可以了。
五、容器生命周期管理

 首先,我们回顾在上一文使用到的 docker container run hello-world 命令,该命令的格式为:
# Management Commands
docker container run IMAGE ]

# 旧命令格式如下:
docker run IMAGE ]  上述两个命令的作用相同,docker container run命令会在指定的镜像 IMAGE 上创建一个可写的容器,因为镜像是只读的。然后,开始运行指定的命令 ]。
一些常用的配置项为:
--i或 --interactive, 交互模式。


[*]-t 或 --tty, 分配一个pseudo-TTY,即伪终端。
[*]-d 或--detach,在后台运行容器并输出容器的 ID 到终端。
[*]--rm 在容器退出后自动移除。
[*]-p 将容器的端口映射到主机。
[*]-v或 --volume, 指定数据卷。
 这些配置项对于上述的两个命令(Management Commands 和旧命令)都是有效的,在后面的内容不会再特殊说明。关于该命令的详细参数较多,并且大多数参数在很多命令中的意义是相同的,将在后面的内容中使用到时进行相应的介绍。
 我们指定 busybox 镜像,然后运行命令 echo "hello xiaoniuma"命令,如下所示:
https://img-blog.csdnimg.cn/70ec5bb43235475a9de62e075bfaeb0e.png
 在上图中,我们可以看到该命令执行的过程:


[*]对于指定镜像而言,首先会从本地查找,找不到时将会从镜像仓库中下载该镜像
[*]镜像下载完成后,通过镜像启动容器,并运行 echo "hello xiaoniuma"命令,输出运行结果之后退出。
 在执行命令之后,容器就会退出,如果我们需要一个保持运行的容器,最简单的方法就是给这个容器一个可以保持运行的命令或者应用,比如 bash,例如我们在 ubuntu 容器中运行 /bin/bash 命令:
docker container run \
    -i -t \
    ubuntu /bin/bash  对于交互式的进程而言(例如这里的 bash),必须将 -i和-t 参数一起使用,才能为容器进程分配一个伪终端,通常我们会直接使用 -it。
https://img-blog.csdnimg.cn/3e98c0faa40147b98e7bfa7eacdc3a7f.png
 如上所示,我们已经进入到分配的终端中了,这时如果我们需要退出 ·bash·,可以使用以下两种方式,它们的效果完全不同:


[*]直接使用 exit 命令,这时候 bash 程序终止,容器进入到停止状态。
[*]使用组合键退出,容器仍然保持运行的状态,可以再次连接到这个 bash 中,组合键是 ctrl + p和 ctrl + q。即先同时按下ctrl 和 p 键,再同时按 ctrl和 q 键,就可以让容器在后台运行。
 对于刚刚创建创建的容器,我们输入 exit退出容器,再使用 docker container ls -a 查看容器的状态,结果如下图所示:
https://img-blog.csdnimg.cn/e1d4259a89404a1a8cdfaea1a58e54e1.png
 然后我们新建一个容器,使用第二种方式退出,创建的方式和刚刚相同。使用 docker container ls -a 命令查看容器的状态,可以看到该容器仍然处于运行中:
https://img-blog.csdnimg.cn/7b9fa74185c34a3db2c21c2cc67ed241.png
 实际使用中,我们不必创建容器之后使用组合键 ctrl + p 和 ctrl + q 来让容器进入后台运行,通常以 -d 参数指定容器以后台模式运行:
# 以后台模式创建并运行一个容器
docker container run \
    -i -t -d \
    ubuntu /bin/bash  使用docker container ls -a命令查看容器的状态,可以看到这个容器已经在后台运行。
https://img-blog.csdnimg.cn/b8df4c60d4384170b63e476384a84385.png
六、创建容器

 严格意义上来讲,docker run 命令的作用并不是创建一个容器,而是在一个新的容器中运行一个命令。而用于创建一个新容器的命令为
# Management Commands
docker container create IMAGE

# 旧的命令格式如下:
docker create IMAGE  该命令会在指定的镜像 IMAGE 上创建一个可写容器层,并 准备 运行指定的命令。需要着重强调的是,这里是准备运行,并不是立即运行。即该命令只创建容器,并不会运行容器。
 一些常见的配置项如下所示:


[*]--name 指定一个容器名称,未指定时,会随机产生一个名字
[*]--hostname 设置容器的主机名
[*]--mac-address 设置 MAC 地址
[*]--ulimit 设置 ulimit 选项
 关于上述提到的ulimit,我们可以通过其对容器运行时的一些资源进行限制。ulimit 是一种 Linux 系统的内建功能,一些简单的描述,可以参考 通过 ulimit 改善系统性能 ,而对于在下面我们将要设置的部分值的含义,可以参考 How to set ulimit values。
 除此之外,关于创建容器,我们还可以设置有关存储和网络的详细内容,将会在下一节的内容中进行介绍。
 下面来看一个实例,我们指定容器的名字为 xiaoniuma01,主机名为xiaoniuma01,设置相应的 MAC 地址,并通过 ulimit 设置最大进程数(1024:2048 分别代表软硬资源限制,详细内容可以参考上面的链接),使用 ubuntu 的镜像,并运行 bash:
docker container create \
    --name xiaoniuma01 \
    --hostname xiaoniuma01 \
    --mac-address 00:01:02:03:04:05 \
    --ulimit nproc=1024:2048 \
    -it ubuntu /bin/bash https://img-blog.csdnimg.cn/995f64d87897485cbd54f943bdeb8ddd.png
 此时,容器创建成功后,会打印该容器的 ID,这里需要简单说明一下,在 Docker 中,容器的标识有三种比较常见的标识方式:


[*]UUID长标识符,例如 1f6789f885029dbdd4a6426d7b950996a5bcc1ccec9f8185240313aa1badeaff。
[*]UUID 短标识符,从长标识符开始,只要不与其它标识符冲突,可以从头开始,任意选用位数,例如针对上面的长标识符,可以使用 1f,1f678 等。
[*]Name 最后一种方式即是使用容器的名字。
在容器创建成功后,我们可以查看其运行状态,使用如下命令:
# 此时该容器并未运行,需要使用 -a 参数
docker container ls -a https://img-blog.csdnimg.cn/5564898a620b4790a4b6173bd68e2013.png
 新创建的容器的状态 (STATUS) 为 Created,并且其容器名被设置为对应的值,而之前没有指定名字的容器都是随机生成的名字。
七、启动容器

 容器的启动命令为:
# Management Commands
docker container start CONTAINER

# 旧的命令格式如下:
docker start CONTAINER  对于上面我们创建的容器 xiaoniuma01 而言,此时处于 Created 状态,需要使用如下命令启动它:
docker container start xiaoniuma01 https://img-blog.csdnimg.cn/f78730e9b733482d91d7fb2e1f3c7536.png
 此时,运行一个容器我们分成了两个步骤,即创建和启动,使用的命令如下:
# 创建docker container create \
    --name xiaoniuma01 \
    --hostname xiaoniuma01 \
    --mac-address 00:01:02:03:04:05 \
    --ulimit nproc=1024:2048 \
    -it ubuntu /bin/bash# 启动docker container start shiyanlou01  上述的两个命令如果我们使用 docker container run 只需要一步即可,即此时 run 命令同时完成了 create 及 start 操作:
docker container run \
    --name xiaoniuma01 \
    --hostname xiaoniuma01 \
    --mac-address 00:01:02:03:04:05 \
    --ulimit nproc=1024:2048 \
    -it ubuntu /bin/bash  除此之外,上面的 run 命令还完成一些其它的操作,例如没有镜像时会 pull 镜像,使用 -it 参数时完成了 attach 操作(后面会讲解该操作),使用 --rm 参数在容器退出后还会完成 container rm 操作。run 命令是一个综合性的命令,如果能够熟练的使用它可以简化很多步骤。
八、停止容器

 停止容器可以使用如下命令:
# Management Commands
docker container stop CONTAINER

# 旧的命令格式如下:
docker stop CONTAINER  刚刚我们启动了一个名为 xiaoniuma01 的容器,并且进入了交互式界面,这里我们先同时按下 ctrl 和 p 键,再同时按 ctrl 和 q 键,让这个容器进入到后台运行。
 此时我们使用 docker container ls -a 命令查看容器的状态,从下图可以看到,容器正在运行。输入 docker container stop xiaoniuma01,docker 返回了容器的 UUID,再次使用 docker container ls -a 命令查看容器的状态,发现容器已经停止运行了。
https://img-blog.csdnimg.cn/c23e979828794767bc2ab28bee94ed4a.png
九、重启容器

 重启容器可以使用如下命令:
# Management Commands
docker container restart CONTAINER

# 旧的命令格式如下:
docker restart CONTAINER  这里我们重启刚刚停止的容器 xiaoniuma01,然后再使用 docker container ls -a 命令查看容器,从下图中可以看到,容器又处于运行状态了。
https://img-blog.csdnimg.cn/e102087a53a54f0da25e9175029ea3b9.png
十、暂停进程

 暂停容器中进程的命令格式如下:
# Management Commands
docker container pause CONTAINER

# 旧的命令格式如下:
docker pause CONTAINER  这里还是使用 xiaoniuma01 这个容器,执行下述命令。
docker container pause xiaoniuma01
docker container ls -a  如下图所示,容器被暂停后,此时处于 Paused 状态。
https://img-blog.csdnimg.cn/6e58a9189e9d49a098c131a8f0d5fc61.png
十一、恢复进程

 恢复容器中进程的命令格式如下:
# Management Commands
docker container unpause CONTAINER

# 旧的命令格式如下:
docker unpause CONTAINER  使用 xiaoniuma01 这个容器,执行下述命令。
# 恢复容器中的进程
docker container unpause xiaoniuma01

# 查看容器列表
docker container ls -a  如下图所示,容器恢复后,此时处于运行状态。
https://img-blog.csdnimg.cn/3f529d82dd3a46368e527aa83221eff9.png
十二、查看容器列表

 查看容器列表可以使用如下命令:
# Management Commands
docker container ls

# 旧的命令格式如下:
docker ps  在使用命令时,我们可以使用一些可选的配置项 。


[*]-a 显示所有的容器。
[*]-q 仅显示 ID。
[*]-s 显示总的文件大小。
 默认情况下,直接使用该命令仅显示正在运行的容器,如下所示:
https://img-blog.csdnimg.cn/120526eebab34f558354d6a567846dd3.png
docker container ls  我们可以使用 -a 参数,来显示所有的容器,并加上 -s选项,显示大小,命令如下:
docker container ls -a -s https://img-blog.csdnimg.cn/2a8131a9f728456596ceeb07541acaf7.png
十三、连接到正在运行中的容器

 上述操作我们启动的容器运行于后台,所以,我们需要使用 attach 操作将本地标准输入输出流连接到一个运行中的容器,命令格式为:
# Management Commands
docker container attach CONTAINER

# 旧的命令格式如下:
docker attach CONTAINER  如下示例,我们启动容器,并使用连接命令:
docker container start xiaoniuma01

docker container attach xiaoniuma01  连接到容器后,查看相应的主机名(输入 hostname 命令)和 Mac 地址(输入 ifconfig 命令),可以判断我们连接到了刚刚创建的容器。
 如果提示无 ifconfig 命令,可以在容器中执行 apt update && apt install net-tools安装。
https://img-blog.csdnimg.cn/84c763d16b2344c0bf5ad95ca0af86c8.png
十四、查看容器的元数据

 查看容器的详细信息(即元数据)可以使用如下命令:
# Management Commands
docker container inspect CONTAINER

# 旧的命令格式如下:
docker inspect CONTAINER  例如我们查看刚刚创建的容器的详细信息就可以使用以下命令:
# 使用容器名
docker container inspect xiaoniuma01

# 使用 ID ,因生成的 ID 不同,需要修改为相应的 ID
docker container inspect 1f6789

docker container inspect 1f6  例如,我们查看刚刚创建的名为 xiaoniuma01 的容器的 MAC 地址,就可以使用如下命令:
docker container inspect xiaoniuma01 | grep "MacAddress" https://img-blog.csdnimg.cn/8d8ce8f67489408d85ce492b8a40175b.png
十五、容器日志管理

 获取容器的输出信息可以使用如下命令:
# Management Commands
docker container logs CONTAINER

# 旧的命令格式如下:
docker logs CONTAINER  常用的配置项有:


[*]-t 或 --timestamps 显示时间戳
[*]-f实时输出,类似于 tail -f
这里我们重新运行一个容器,让它在后台执行一个不断输出的脚本,命令如下:
docker container run \
    --name xiaoniuma02 \
    -i -t -d \
    ubuntu /bin/sh -c "while true; do echo hello xiaoniuma; sleep 2; done"   “while true; do echo hello world; sleep 2; done” 是一个脚本,它的功能是每 2 秒输出一次 “ hello shiyanlou ”,此处不讲解语法构成,感兴趣的读者可以自己了解相关知识。
 如下所示,我们查看刚刚创建的容器的日志,使用如下命令:
docker container logs -tf xiaoniuma02  我们可以使用组合键 Ctrl + c 来结束日志跟踪,其结果如下图所示。
https://img-blog.csdnimg.cn/b6d5b434adff42be898b58b28af3e339.png
十六、显示容器中的进程信息

 除了获取日志之外,还可以显示运行中的容器的进程信息,命令格式如下:
# Management Commands
docker container top CONTAINER

# 旧的命令格式如下:
docker top CONTAINER  例如查看刚刚创建的容器的进程信息:
docker container top xiaoniuma02 https://img-blog.csdnimg.cn/26dffe9f9b8a47e7bc0d01e0ee6ae04d.png
   需要注意的是,该命令对于并未运行的容器是无效的。
十七、查看文件修改

 查看相对于镜像的文件系统来说,容器中做了哪些改变,可以使用如下命令:查看相对于镜像的文件系统来说,容器中做了哪些改变,可以使用如下命令:
# Management Commands
docker container diff CONTAINER

# 旧的命令格式如下:
docker diff CONTAINER 我们先在 xiaoniuma01 中创建一个文件,执行以下命令:
# 重启容器
docker container restart xiaoniuma01

# 连接到容器中
docker container attach xiaoniuma01 进入容器中后,创建一个文件,并退出:
# 创建一个文件
touch ~/a.txt 现在我们在 xiaoniuma01 容器中创建一个文件,Ctrl+p Ctrl+q 退出当前容器,使用 docker container diff xiaoniuma01 命令查看到相应的修改:
https://img-blog.csdnimg.cn/560272cdf49d46518376b9ea52bceb85.png
https://img-blog.csdnimg.cn/8dc7f4e90e154d8c90bb26d3a919284f.png
十八、容器中执行命令

除了使用 docker container run 执行命令之外,我们还可以在一个运行中的容器中执行命令,使用如下格式:
# Management Commands
docker container exec CONTAINER COMMAND

# 旧的命令格式如下:
docker exec CONTAINER COMMAND 例如,我们在 xiaoniuma01 容器中执行 echo "test_exec"命令,就可以使用如下命令:
# 重启容器
docker container restart xiaoniuma01

# 执行命令
docker container exec xiaoniuma01 echo "test_exec" https://img-blog.csdnimg.cn/8daf9f7e21244f05a66b2b6419d2d72b.png
十九、删除容器

删除容器的命令:
# Management Commands
docker container rm CONTAINER

# 旧的命令格式如下:
docker rm CONTAINER 需要注意的是,在删除容器后,在容器中进行的操作并不会持久化到镜像中。
如果想删除之前创建的所有容器,可以使用以下命令:
docker container rm -f $(docker container ls -aq) docker container ls -aq 会输出所有容器的 UUID ,rm 命令可以根据 UUID 去删除容器。这里用来选项-f是因为还有在运行中的容器,所以需要强制删除。ls 列出的 UUID 传递给rm 进行删除。
https://img-blog.csdnimg.cn/18273be9e30e479a8e4ca8324b0bb033.png
如果 docker 版本为 1.13 及以上版本,还可以更方便的 prune。
docker container prune 常用的配置项有:


[*]-f 或 --force跳过警告提示
[*]--filter 执行过滤删除
如直接删除所有停止的容器:
docker container prune -f https://img-blog.csdnimg.cn/4ae45aace79e43fe8aeb08edbab31d3e.png
总结

本文讲解了


[*]容器命令基础
[*]创建容器
[*]容器的启动与停止
[*]容器中进程的暂停与恢复
[*]查看容器列表
[*]连接容器
[*]查看元数据
[*]显示进程信息
[*]查看文件修改
[*]容器中执行命令
[*]删除容器
下文讲解Docker 镜像管理

来源:https://blog.csdn.net/weixin_44009656/article/details/125192113
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 【云原生】三、详细易懂的Docker 容器管理