首頁 > 運維 > Docker > 為什麼有時docker kill殺不死運行的容器

為什麼有時docker kill殺不死運行的容器

發布: 2020-03-31 14:18:17
原創
4791 人瀏覽過

為什麼有時docker kill殺不死運行的容器

Docker Kill主要流程

1、Docker引擎透過containerd使用SIGKILL發向容器主進程,等待一段時間後,如果從containerd收到容器退出訊息,那麼容器Kill成功。

2、在上一個步驟中如果等待逾時,Docker引擎將跳過Containerd自己親自動手透過kill系統呼叫向容器主程序發送SIGKILL訊號。如果此時kill系統呼叫回傳主進程不存在,那麼Docker kill成功。否則引擎將一直死到containerd通過引擎,容器退出。

當出現問題時刻,宿主機上發現大量的stress進程(實際上是容器的進程)處於D狀態,而係統反應變慢。問題可以這樣解釋:

1、Docker kill透過containerd間接向容器主進程發送SIGKill訊號以後,由於系統回應慢,容器內部子進程(stress)處於D狀態,那麼在逾時時間內containerd沒有上報容器退出。 Docker kill走到了直接發送Sigkill階段

2、在此階段前,容器內部主程序退出了,所以系統呼叫kill 發送SIGKILL很快就回傳進程不存在了。引擎認為自己把容器殺死了,Docker kill成功回來了。

3、在一定時間後容器子程序從D狀態中恢復,它們退出了,containerd上報容器退出,引擎清理資源,此時Docker ps看到容器才是退出狀態。

容器主/子進程處於D狀態

進程D狀態表示進程處於不可中斷睡眠狀態,一般都是在等待IO資源。當然有些時候如果系統IO出現問題,那麼將會有大量的進程處於D狀態。在這種狀態,訊號是無法將進程喚醒;只有等待進程自己從D狀態返回。而且在常規內核中,如果某個進程一直處於D狀態,那麼理論上除了重啟系統那麼沒有任何方法或手段將它從D中接回。

更多相關教學課程,請關注PHP中文網docker教學欄位。

以上是為什麼有時docker kill殺不死運行的容器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板