題 `docker stop`和`docker kill`有什麼區別?


有什麼區別 docker stop 和 docker kill

Afaik,兩人都將停止一個正在運行的容器。是那個嗎 docker stop 嘗試以正確的方式停止進程在容器內運行 docker kill 會發送一個殺死信號嗎?怎麼會這樣呢 docker stop 知道如何正確停止運行過程。 (因為這與處理過程不同)


89
2018-05-21 12:54


起源




答案:


是不是docker停止嘗試以正確的方式停止進程在容器內運行,而docker kill會發送一個kill信號?

基本上是的,差異是微妙的,但在概述中 命令行 參考:

  • 碼頭工人停下來停止正在運行的容器發送SIGTERM,然後在寬限期後發送SIGKILL)[...]容器內的主要進程將接收SIGTERM,並在寬限期後,SIGKILL。 [強調我的]
  • 碼頭殺死殺死一個正在運行的容器發送SIGKILL或指定的信號)[...]容器內的主進程將發送SIGKILL,或使用選項--signal指定的任何信號。 [強調我的]

所以 stop 嘗試通過發送標準來觸發正常關閉 POSIX信號  SIGTERM,而 kill只是默認殺死進程(但也允許發送任何其他信號):

SIGTERM信號被發送到進程以請求終止。與SIGKILL信號不同,它可以被進程捕獲,解釋或忽略。這允許進程執行良好的終止釋放資源並在適當時保存狀態。應該注意,SIGINT幾乎與SIGTERM相同。

雖然沒有以任何方式強制執行,但通常期望進程處理 SIGTERM 優雅並根據他們的職責做正確的事情 - 由於優雅的關機嘗試花費的時間比寬限期更長,這很容易失敗,如果數據完整性是最重要的(例如數據庫),這是需要考慮的事情;見例如海登少校 SIGTERM與SIGKILL 有關更詳細的解釋:

一旦收到SIGTERM,應用程序就可以確定它想要做什麼。雖然大多數應用程序將清理其資源並停止,但有些可能不會。應用程序可以配置為在收到SIGTERM時執行完全不同的操作。此外,如果應用程序處於錯誤狀態,例如等待磁盤I / O,則可能無法對發送的信號執行操作。


85
2018-05-22 14:12



因此,如果我想對容器進行通用關閉過程,我將不得不在supervisor / runit進程中捕獲SIGTERM? - CMCDragonkai
這裡的最佳做法是什麼?我明白為什麼要用 docker kill 在關機期間手動節省一些時間,但在腳本中,嘗試正常關機並不總是更好 docker stop?我還在看很多 docker kill但是在腳本中。 - Dennis


docker kill 將突然停止主入口點進程/程序

docker stop 會試著優雅地阻止它(會禮貌地問:P)

在這兩種情況下,文件系統更改都將被保留(在停止或終止時),所以如果你 docker start <container> 然後它會從那裡繼續。


6
2018-04-29 14:24



......但是如果是的話 docker kill 主進程在內存中仍然存在的任何掛起的文件系統更改都將丟失,因此文件系統可能最終損壞? - Arjan
顯然,由於是一個突然停止,只有在殺戮時的變化將持續存在。任何待處理的東西都將丟失。我的觀點是docker kill並不是真的...殺死容器,它停止了進程。比如當你關閉電腦而不是關機時 - awkwardarts


除了之前添加的答案

賽跑 docker events 後 docker stop 顯示事件

  • kill(信號15):信號15 = SIGTERM

賽跑 docker events 後 docker kill 顯示事件

  • kill(信號9):信號9 = SIGKILL
  • 死(退出代碼137)

docker stop 在殺死進程之前有一個超時。默認值為10秒。

這張桌子 有更多的細節。


0
2017-11-03 07:51