Docker 容器的生命周期
什么是容器?
通俗地讲,容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容 器有初建、运行、停止、暂停和删除五种状态。 虽然容器的本质是主机上运行的一个进程,但是容器有自己独立的命名空间隔离和资 源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息, 这是容器与直接运行在主机上进程的本质区别。 容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。 运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个 容器层,该层允许修改镜像的整个副本。
容器与镜像的关系类似于程序与代码的关系。代码(镜像)是静态的,包含了程序运行所需要的所有指令和数据;而程序(容器)是动态的,是代码在特定环境下的运行实例。通过镜像创建容器,我们可以方便地部署和管理应用程序,并确保每个应用程序都在一致和隔离的环境中运行。
在学习容器的常见命令之前,我们先来看看容器的生命周期吧!
容器的生命周期是容器可能处于的状态:
- created:初建状态。
- running:运行状态。
- stopped:停止状态。
- paused:暂停状态。
- deleted:删除状态。
各个生命周期的转换关系如图所示:

- docker create:创建容器后,不立即启动运行,容器进入初建状态。
- docker run:创建容器,并立即启动运行,进入运行状态。
- docker start:容器转为运行状态。
- docker stop:容器转入停止状态。
- docker kill:容器在故障时,执行 kill,容器将进入停止状态,这种操作容易丢失数据,除非必要,否则不建议使用。
- docker restart:重启容器,容器转入运行状态。
- docker pause:容器进入暂停状态。
- docker unpause:取消暂停状态,容器进入运行状态。
- docker rm:删除容器,容器进入删除状态。
- killed by out-of-memory:宿主机内存被耗尽,也被成为 OOM:非计划终止,这是会杀掉占用内存最多的容器。
- container process exited:出现容器被终止后,将进入是否应该 restart 的选择。
- yes:需要重启,容器执行 start 命令,转为运行状态。
- no:不需要重启,容器转为停止状态。
Docker 在处理 OOM 事件分为 3 中情况:
-
如果容器中的应用耗尽了主机系统分配给容器的内存限额,就会触发 OOM 事件。 例如,在容器当中,部署了一个 web 服务。假设主机分配给此容器的内存上限为 1G, 当脚本申请的内存大于 1G 时,此容器就会触发 OOM 事件。而在这种情况下,此容器将会被强制关闭。 但需要注意的是,此时关闭容器的并非是 Docker Daemon,而是宿主机操作系统。因 为一个容器其实就是一组运行在宿主机操作系统当中的进程,宿主机操作系统通过 cgroups 对这组进程设定资源上限,当这些进程申请的资源到达上限时,触发的是宿 主机操作系统的内核 OOM 事件,因此最终是由宿主机内核来关闭这些进程.
-
如果用户不想关闭这个容器,那么可以选择 --oom-kill-disable 来禁用 OOM-Killer。 使用此参数时,仍需要注意,如果使用 -m 设置了此容器内存上限,那么当容器到达内存资源上限时,主机不会关闭容器,但也不会继续向此容器继续分配资源,此时容器 将处于 hung 状态。只需要将最坏的情况封闭在一定范围之内,而不至于蔓延出去。
-
如果用户使用了 --oom-kill-disable,但也没有使用 -m 来设定上限,因而此时此容器将会尽可能多地使用主机内存资源。换言之,主机内存有多大,它就将用多大。
容器异常退出
每个容器内部都存在一个 Init 进程,容器中其他所有进程都是此进程的子进程。运行 的容器是因为 Init 进程在运行,如果一个子进程因为某种原因造成了退出,那么其父 进程也会同步退出,直至 Init 进程也退出。当 Init 进程退出时,也就代表着此容器被关 闭。ocker 目前没有办法知道此时的进程退出属于正常退出还是异常退出。当出现容器 关闭情况时,Docker Daemon 会尝试再次重新将此容器由 Stopped 状态转为 Running 状态。只有设置了–restart 参数的容器,Docker Daemon 才会去尝试启动,否则容器 会保持停止状态。
容器暂停
Docker“剥夺”了此容器的 CPU 资源。而其他资源,如 Memory 资源、Network 资源等还保留未动。如此一来,失去了 CPU 资源的进程,是不会被主机内核系统所调度的,所以此容器就处于“冰封”状态。
Docker Container (容器) 常见命令
docker run
-
功能:创建一个新的容器并运行一个命令。
-
语法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG ...] -
别名:
docker container run # 因为是属于容器的命令所以有这个 container,Docker 对命令进行了分类嘛 -
参数:
- -d:后台运行容器,并返回容器的 ID。
- -i:以交互模式运行容器,通常与 -t 选项同时使用。
- -P:随机端口映射,容器内部的端口随机映射到主机的端口。
- -p:指定端口映射,格式为:主机(宿主)端口:容器端口。
- -t:为容器分配一个伪输入终端,通常与 -i 选项同时使用。
- –name:为容器指定一个名称。
- -h:指定容器的 hostname。
- -e:设置环境变量。
- –cpuset-cpus:绑定容器到指定的 CPU 上运行。例如: –cpuset-cpus=“0,1,2” 或者 –cpuset-cpus=“0-2” 就是将容器绑定到 0-2 这三个 CPU 上面运行。
- -m:设置容器能够使用的内存的最大值。
- –rm:当容器退出的时候自动删除它,即容器退出的时候不会进入 Exited 状态,而是直接进入 Delete 状态。
-
演示:
如下图:我们使用 -d 选项让一个容器后台运行。使用 docker ps 命令可以看到容器正在运行!

busybox 是一个非常小的 Linux 发行版,它包含了许多基本的 UNIX 工具。当仅使用 busybox 镜像而不指定任何命令时,容器启动后会立即退出,因为它没有默认的前台进程来保持容器运行。你需要提供一个命令来让容器持续运行,例如 top。
如下图:我们使用 -i 选项运行一个容器,可以看到我们输入 ls 命令能够正常执行,能进行交互,只是交互的方式不友好!

上面就是仅使用 -i 选项的效果,当我们仅使用 -t 选项的时候,会为我们创建一个伪终端,但是没有加上 -i 选项就不能交互了!

因此,我们需要 -t -i 选项一起使用,才能达到理想的交互效果!

如下图:我们使用 nginx 镜像启动一个容器,-P 是随机端口映射,我们想要访问到 nginx 的主页就要看一下这个随机映射的端口是什么!

我们使用 docker ps 命令查看正在运行的容器,发现是主机的 32768 端口映射到了容器的 80 端口。在我们的服务器放行了 32768 的前提下,我们就能够使用公网 IP 加上端口号访问容器中启动的 nginx 服务啦!在本例中就是:47.108.251.0:32768

显然,这种随机映射的方式很不友好,我们在启动一个容器的时候,应该指定端口映射,而不是让系统来随机分配,这个时候我们就可以使用 -p 选项啦!

我们指定主机的 80 端口映射到容器的 80 端口,这样我们就可以使用 80 端口来访问容器中启动的 nginx 服务啦!

如下图:我们在运行容器的时候给容器指定一个名称。

如下图,我们可以使用 -h 选项指定容器的 hostname。

如下图:我们可以使用 -e 选项添加环境变量!

当我们使用 --rm 选项启动容器的时候,当容器退出的时候,我们使用 docker ps 命令是看不到我们之前启动的这个容器的,直接被删除了嘛!
如下图:并没有看到 NAME 为 test_–rm 的容器!

docker run 命令是由很多很多选项的哈!大家需要了解全部的选项可以到 docker hub 的官网上了解!
docker ps
- 功能:列出容器。
- 语法:
docker ps [OPTIONS] - 别名:
docker container ls docker container list docker container ps - 参数:
- -a:显示所有的容器,包括没有运行的。
docker ps默认只列出处于running状态的容器嘛。 - -f:根据过滤条件显示容器。下面是常用的过滤条件:
- status:状态可以是下面的任意一个:
created,restarting,running,removing,paused,exited, 或者dead。例如:docker ps -f status=running - name:根据容器的名字作为过滤条件。
- id:根据容器 id 作为过滤条件。
- status:状态可以是下面的任意一个:
- –format:指定返回的文件模板。json 或者 table 等等。
- -l:显示最近的一个容器。
- -n:列出最近创建的 n 个容器。
- –no-trunc:不截断输出。
- -q:只显示容器编号。
- -s:显示文件的大小。
- -a:显示所有的容器,包括没有运行的。
- 演示:
这个命令就不演示啦,大家可以自己试一试。
docker create
- 功能:创建一个新的容器但是不启动它。
- 语法:
docker create

本文围绕Docker容器展开,介绍了容器的生命周期,包括初建、运行、停止等状态及转换关系。详细讲解了容器常见命令,如docker run、docker ps等的功能、参数和使用示例。还分享了容器批量处理技巧、交互模式,并解答了docker create、docker run等命令的区别等常见问题。
最低0.47元/天 解锁文章
4033

被折叠的 条评论
为什么被折叠?



