【问题标题】:How does a docker container restart work?docker 容器重启是如何工作的?
【发布时间】:2020-06-23 00:23:42
【问题描述】:

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

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

编辑:

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

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

【问题讨论】:

    标签: docker containers


    【解决方案1】:

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

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

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

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

    【讨论】:

    • "但是如果它是一个交互式外壳并且你手动启动了后台进程,它们就会丢失。"这正是我需要的。谢谢!
    【解决方案2】:

    首先,根据Dockerfile best practices 中的指南,在一个容器中运行 100 个进程听起来不太好。只是要记住的事情;如果它适合你,那很好。

    如果这 100 个进程成为容器启动过程的一部分,那么您将在重新启动后让它们再次运行。这完全取决于您的容器应该做什么以及如何做,即您的 ENTRYPOINT 在做什么。

    restartstop,然后是 start。所以我想你的电脑会有一个非常松散的平行线。重新启动后,它将运行您拥有的那些启动程序,例如网络管理什么的。但它不会重新启动您的浏览器,除非您明确连接您的操作系统。

    如果作为容器运行的一部分,文件被写入磁盘,那么在重新启动后,您将拥有这些文件。这也是您可能不应该利用的东西,除非它真的适合您的用例。这是因为容器应该是ephemeral

    【讨论】:

      【解决方案3】:

      Docker 以内部格式存储所有上下文、变量等。要查看 Docker 对您的容器的了解,您可以运行 docker inspect 并了解容器的内部结构。

      尝试运行docker inspect --format='{{.GraphDriver.Data.LowerDir}}' Container_Id

      它将为您提供存储容器数据的路径。但是,您需要 root 访问权限才能打开该文件夹。

      用外行的话来说,Docker 重启是:Docker stop 其次是 Docker 开始。

      【讨论】:

      • 我的问题更多的是“如果我们登录到 docker 容器并启动一些后台进程(在 CMD 或 ENTRYPOINT 中不存在),它们会再次重新启动吗?”
      • 据我所知 - 可以使用 docker start 重新启动已停止的容器,并且之前的所有更改都完好无损。所以准确地说,Docker 有点记住你最初运行容器时的论点。如果你手动停止一个容器,它的重启策略会被忽略,直到 Docker 守护进程重启或者容器被手动重启。
      猜你喜欢
      • 1970-01-01
      • 2015-09-14
      • 2021-06-15
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-02
      相关资源
      最近更新 更多