这个确切的问题之前已经被问过这里就这样和在 Reddit 上。然而,真正的问题从未得到解答。
我的 Atlassian 服务在 Docker 容器内运行。但是,我想知道当我发出shutdown
命令时会发生什么主人。它是尝试正常关闭容器,还是尝试立即杀死它们?不知何故,我似乎无法找到这方面的实际资源,也许是因为我对 docker 相当陌生。
想象一下以下情况:
- 我有正在运行的容器
- 我发出
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)和实践方法。
发出服务器关闭命令,并观察会发生什么情况。
控制台。虽然网络可以立即切断,但关闭过程可能仍需要相当长的时间。从控制台(一些托管提供商提供虚拟控制台)观察情况如何 - 关闭序列实际需要多长时间,同时会发生什么?
日志。据我所知,数据库容器常常令人担忧。它会被杀死,还是优雅地终止?真相就在日志中。仔细观察它们。如果您启动系统并看到这些带有关闭时间戳的日志,则说明您做得很好:
。
2023-08-11 14:43:21 0 [Note] InnoDB: Starting shutdown...
[...]
2023-08-11 14:43:21 0 [Note] mariadbd: Shutdown complete
- 关机定时配置。您还可以进一步研究如何更改重新启动计时参数。请参阅
man systemd-system.conf
并检查此段落:DefaultTimeoutStartSec=, DefaultTimeoutStopSec=, DefaultTimeoutAbortSec=, DefaultRestartSec=
。默认值为 90 秒。