關於一類docker容器閃退問題定位

背景:正在學習docker期間,接到一個任務,經過docker部署一個應用A。該應用A相似於以前部署的應用B,結果很天然地犯了形而上學的錯誤。docker

 

思路:基於dockerfile+docker-compose.yml來部署。bash

基本操做:編寫dockerfile,製做基礎鏡像;docker-compose.yml做端口映射,數據卷掛載等操做。less

出現問題:docker-compose up時,建立容器。docker ps看到容器的狀態爲restart狀態,而不是正常的up。學習

難點:容器外部docker logs沒能查看到容器應用運行的任何日誌信息。同時因容器不斷處於restart態,沒法進入容器內查看應用運行的任何日誌信息。區塊鏈

定位:測試

一、懷疑是docker-compose.yml中設置的內存太少,把內存大小限制設置爲4G,沒能決定問題。排除內存不夠緣由。spa

二、檢查docker-compose.yml端口映射,確保沒有與現有應用端口衝突。排除端口問題。rest

三、檢查docker-compose.yml中數據卷的掛載及CMD的命令執行參數。排除數據掛載及命令參數問題。日誌

四、懷疑是應用的執行權限問題,但是在不做修改狀況下,docker容器中默認用的就是root權限。排除權限問題生命週期

五、本地非docker容器內運行該應用,一切正常。排除程序自身問題。

六、容器中先後臺進程的影響,A是前臺,B後臺。(最終元兇)

出現問題緣由:dockerfile中的CMD命令,是容器啓動後運行的第一條命令,其PID爲1。而Docker容器僅在它的1號進程運行時,會保持運行。若是1號進程退出了,Docker容器也就退出了。而咱們要部署的應用屬於後臺進程,容器運行時,pid爲1的進程不是A,而是bash,這個bash執行完指令後就掛了。同時由於容器中設置的restart策略爲unless-stopped,所以會看到容器一直處於restart態。做爲驗證,將本來在容器中運行正常的B應用,在其CMD的執行參數中加上&,會看到B容器應用也一直處於restart態。

解決:在運行A應用後增長&&tail -f XXX.log,至此容器運行正常,進入A容器內進行相關區塊鏈測試符合預期。

結論:容器生命週期和其內部PID爲1的進程一致。

相關文章
相關標籤/搜索