Docker 如何处理系统关闭?

Docker 如何处理系统关闭?

这个确切的问题之前已经被问过这里就这样在 Reddit 上。然而,真正的问题从未得到解答。

我的 Atlassian 服务在 Docker 容器内运行。但是,我想知道当我发出shutdown命令时会发生什么主人。它是尝试正常关闭容器,还是尝试立即杀死它们?不知何故,我似乎无法找到这方面的实际资源,也许是因为我对 docker 相当陌生。

想象一下以下情况:

  1. 我有正在运行的容器
  2. 我发出shutdown关闭命令主人 没有明确发布docker stop

docker在这种场景下会做什么呢?我可以安全地发出shutdown命令,并期望我的容器在执行其他操作之前先正常关闭吗?

就我而言,如果重要的话,我使用 Ubuntu Server 19.04 实例,但问题是针对更一般的场景/涵盖主要发行版。

答案1

您的容器应该像系统中的所有其他进程一样接收 SIGTERM。

问题是,获得 SIGTERM 的是容器中的主进程(由 ENTRYPOINT 启动的进程)。如果容器运行脚本来启动二进制文件,那么对于exec二进制文件来说,使其成为容器进程很重要,否则 shell 解释器会收到 SIGTERM,而 shell 解释器通常不会将其转发给子进程。

AFAIKdocker stop首先在容器上尝试 SIGTERM,并期望它在 10 秒内退出,如果没有,它会发送 SIGKILL。因此,如果你的容器很快停止,docker stop你应该没问题。

答案2

有理论方法(由@xenoid)和实践方法。

发出服务器关闭命令,并观察会发生什么情况。

  1. 控制台。虽然网络可以立即切断,但关闭过程可能仍需要相当长的时间。从控制台(一些托管提供商提供虚拟控制台)观察情况如何 - 关闭序列实际需要多长时间,同时会发生什么?

  2. 日志。据我所知,数据库容器常常令人担忧。它会被杀死,还是优雅地终止?真相就在日志中。仔细观察它们。如果您启动系统并看到这些带有关闭时间戳的日志,则说明您做得很好:

2023-08-11 14:43:21 0 [Note] InnoDB: Starting shutdown...
[...]
2023-08-11 14:43:21 0 [Note] mariadbd: Shutdown complete
  1. 关机定时配置。您还可以进一步研究如何更改重新启动计时参数。请参阅man systemd-system.conf并检查此段落:DefaultTimeoutStartSec=, DefaultTimeoutStopSec=, DefaultTimeoutAbortSec=, DefaultRestartSec=。默认值为 90 秒。

相关内容