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 秒。

相關內容