首页 > 解决方案 > docker 容器重启是如何工作的?

问题描述

例如,当 docker 容器有 100 个进程正在运行并且我们使用重新启动容器docker restart container-name时,docker 如何重新启动所有这 100 个进程?

它会存储所有流程详细信息并重新启动它们吗?

编辑:

以下可以被认为是我想要回答的具体问题:

启动容器后,我使用登录到容器docker exec -it container-name bash并启动一些后台进程。然后我退出容器并执行 adocker restart或 astop后跟 a start。我会让那些手动启动的进程自动再次运行吗?

标签: dockercontainers

解决方案


一个 Docker 容器有一个主要进程。 docker restart做两件事:

  1. 它相当于docker stop. 它将 SIGTERM 发送到其主进程(仅);如果在 10 秒内没有终止,它会发送 SIGKILL。如果主进程还有子进程,它们也会被强制终止
  2. 它相当于docker start. 在已经存在的容器中,它运行容器的命令,通过连接其入口点和命令列表构建。

请注意,这两个都集中在一个过程上。如果该进程是像 supervisord 这样的专用进程管理器,则该docker stop序列有望使主管优雅地停止它正在管理的每个进程,并且您会没事的。如果它是一个启动一堆后台进程并忽略它们的 shell 脚本,它们就会在没有任何警告的情况下被杀死。类似地,如果主容器进程知道如何启动它的子进程,那么docker start就会导致这种情况再次发生,但如果它是一个交互式 shell 并且你手动启动了后台进程,它们就会丢失。

Docker 没有任何类型的“快照”机制。一般模型是容器总是从一个干净且已知的状态开始,并且可以从那里重建他们需要的任何东西。它更适合这个模型到docker rm一个停止的容器和docker run一个新的容器,而不是再次尝试docker start它。


推荐阅读