问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

小白快速上手 Docker 02 | Docker 容器生命周期

创作时间:
作者:
@小白创作中心

小白快速上手 Docker 02 | Docker 容器生命周期

引用
CSDN
1.
https://m.blog.csdn.net/weixin_42627385/article/details/142699302

Docker容器的生命周期包括创建、运行、暂停、停止和删除等状态。本文将详细介绍这些状态的转换过程,并通过具体的Docker命令示例帮助读者理解每个状态的含义和操作方法。

容器生命周期

下图显示了容器生命周期的简化状态。

  • Created
  • Running
  • Paused
  • Stopped
  • Deleted

现在让我们逐一讨论容器生命周期的每个状态:

创建状态(Created)

这是容器生命周期的第一个状态,在这个阶段,容器被创建但尚未启动。

通过运行docker create命令,我们可以在指定的镜像上创建一个薄的可写层,并准备运行主进程(由 CMD 和/或 ENTRYPOINT 定义)。需要注意的是,在创建状态下,容器已经存在,但并没有开始执行。

例如,以下命令使用nginx:alpine镜像创建一个名为app1的容器:

docker create --name app1 nginx:alpine

如果创建成功,终端会打印出新容器的ID。

运行状态(Running)

顾名思义,运行状态表示容器正在主动运行。在这个阶段,主进程已经开始执行。对于已经创建或停止的容器,我们可以使用docker start命令来启动它。

例如,要启动之前创建的app1容器,我们可以运行:

docker start app1

如果你不想先创建再启动容器,可以直接使用docker run命令,这样可以同时完成这两个步骤。以下命令将在后台创建并启动一个名为app2的容器:

docker run -d --name app2 nginx:alpine

暂停状态(Paused)

在某些情况下,我们可能需要暂停正在运行的容器。可以使用docker pause命令来暂停指定容器中所有的进程。

暂停时,容器的状态保持完整,包括磁盘和内存的内容。

需要注意的是,暂停的容器并不知道自己已经被暂停。

要暂停app1,可以运行:

docker pause app1

要恢复暂停的容器,我们可以使用docker unpause命令:

docker unpause app1

停止状态(Stopped)

停止状态表示容器不再主动运行其主进程。在该状态下,容器的磁盘部分会保留下来,但内存部分会被清除。这是暂停状态和停止状态之间的主要区别。

容器可以通过四种主要方式停止:

  • 使用docker stop命令。
  • 使用docker kill命令。
  • 当主容器进程退出或完成时。
  • 遇到“内存不足异常”(OOME)时。

让我们分别讨论一下 这几种方式。

1. 使用docker stop命令

此命令非常简单:

docker stop app1

当执行此命令时,主容器进程会接收到一个 SIGTERM 信号,允许其安全地关闭。如果在默认的宽限期(通常为 10 秒)内进程没有结束,系统会强制发送一个 SIGKILL 信号,立即终止进程。

2. 使用docker kill命令

与docker stop不同,docker kill直接将SIGKILL信号发送到主容器进程:

docker kill app2

这意味着docker stop允许容器安全终止(在宽限期内),而则docker kill立即终止进程。docker kill还可以使用–signal或-s发送任何信号,而不仅仅是 SIGKILL。例如,发送 SIGINT 信号:

docker kill -s SIGINT app1
3. 当主进程退出/完成时

如果容器的主进程已退出或完成,则容器可以自动停止。

这可能是因为主进程遇到异常、中断,或者在某个时刻执行的任务完成(而不是像服务器那样无限循环)。例如:

docker run alpine echo "hi"

在此命令中,echo "hi"在 alpine 容器内执行,打印“hi”后立即退出,导致容器自动停止。

4. 当遇到“内存不足异常”(OOME)时

如果容器尝试使用超过系统可用内存的数量,可能会遇到内存不足异常(OOME)。在这种情况下,某些容器甚至 Docker 守护进程可能会被加载终止。为了避免这种情况,确保应用在拥有足够内存的主机上运行是非常重要的。可以通过以下命令限制容器的最大内存使用:

docker run -m 50m redis:alpine

通过这个命令,Redis容器的内存使用不会超过50MB,超出部分可能会导致OOME。

已删除状态(Deleted)

对于状态或停止状态的容器可以使用docker rm命令删除。这将导致与容器相关的所有数据被删除,包括进程、文件系统、卷和网络映射创建。例如,要删除已经停止的app1容器,可以运行:

docker rm app1

如果容器正在运行或暂停时尝试删除,会收到错误提示说明,容器需要先停止。如果您确定要强制删除正在运行的容器,可以使用:

docker rm -f app1

容器生命周期高级部分

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号