docker服務(wù)假死的解決方法
問題描述
在使用docker部署服務(wù)時,偶爾會遇到docker服務(wù)假死的情況,使用的命令如下:
- docker ps 顯示容器狀態(tài)正常,但是對外服務(wù)已經(jīng)不可用不可訪問
- docker stats 沒有任何反應(yīng)
- docker stop CONTAINER_ID 也沒有任何反應(yīng)
- docker restart CONTAINER_ID 也沒有任何反應(yīng)
- docker exec -it --user root CONTAINER_ID /bin/bash 也沒有任何反應(yīng)
- docker logs CONTAINER_ID --tail 111 -f 也沒有任何反應(yīng)
- docker-compose stop/down 命令也提示響應(yīng)超時,不可用
問題排查
之前沒有遇到過這種問題,也是第一次,于是就各種信息都看一下,各種可能性也都考慮到位
猜測這種情況,可能是由于容器內(nèi)部的問題導(dǎo)致服務(wù)無法正常運行,或者Docker守護進程本身出現(xiàn)了問題。
- 查看容器內(nèi)部日志(我的容器日志也沒有問題)
- 使用以下命令查看容器內(nèi)的stdout和stderr輸出,以獲取有關(guān)容器內(nèi)部問題的更多信息。
docker logs CONTAINER_ID
- 使用-f選項可以實時跟蹤日志
docker logs -f CONTAINER_ID
- 檢查宿主機資源: 使用以下命令檢查宿主機的資源使用情況,確保資源(CPU、內(nèi)存)沒有被耗盡(我的沒有問題)
docker stats
- 查看Docker守護進程狀態(tài)(我的容器依然處于運行狀態(tài))
- 檢查Docker守護進程的運行狀態(tài),確保它沒有出現(xiàn)問題。
sudo systemctl status docker
- 如果守護進程出現(xiàn)問題,可以嘗試重啟Docker服務(wù)
sudo systemctl restart docker
- 手動停止和啟動容器: 嘗試手動停止和啟動容器,看是否能夠解決問題。(我的問題么有解決啊??)
docker stop CONTAINER_ID docker start CONTAINER_ID
- 檢查端口沖突: 確保容器所使用的端口沒有被其他進程占用。(不可能,絕對不可能.jpg)
- 查看系統(tǒng)日志: 查看系統(tǒng)日志以獲取更多關(guān)于系統(tǒng)或Docker的問題的信息。(說實話么有看出來什么問題)
dmesg | grep -i docker
- 查看網(wǎng)絡(luò)配置(正常的網(wǎng)絡(luò)狀況,網(wǎng)絡(luò)配置也沒有修改)
- 檢查Docker網(wǎng)絡(luò)配置,確保網(wǎng)絡(luò)正常。
docker network ls
- 查看容器的網(wǎng)絡(luò)配置
docker inspect CONTAINER_ID | grep NetworkMode
查看防火墻設(shè)置: 如果使用防火墻,確保容器所需的端口沒有被阻塞。
嘗試重啟Docker服務(wù): 如果以上方法都沒有解決問題,可以嘗試重啟整個Docker服務(wù)。(終極大招,管用?。?/p>
sudo systemctl restart docker
問題解決
終極殺招-最粗暴的解決方法
- 重啟docker(慎用):
sudo systemctl restart docker
要注意,這個操作會把所有的docker服務(wù)無差別的重啟,慎用
手動清理假死的docker服務(wù)
- 找到假死的docker服務(wù):執(zhí)行
docker ps
命令找到容器ID【CONTAINER_ID】 - 先嘗試使用docker自帶的命令停止容器:
docker stop 【CONTAINER_ID】
發(fā)現(xiàn)停不掉 - 手動查找docker目錄下的容器信息
- docker默認目錄:/var/lib/docker
- 所有docker容器的信息都掛載在/var/lib/docker/containers目錄下
- 通過【CONTAINER_ID】找到該假死服務(wù)的目錄
ll /var/lib/docker/containers | grep 【CONTAINER_ID】
cd /var/lib/docker/containers
- 刪除該容器
rm -rf 目錄名
這里刪除可能會報下面的錯誤,因為你的容器還掛載了其他目錄,信息如下: rm:無法刪除"/var/lib/docker/containers/目錄名/secrets":設(shè)備或資源忙無法刪除"/var/lib/docker/containers/目錄名/shm": 設(shè)備或資源忙
這個時候查一下容器對應(yīng)的掛載目錄
cat /proc/mounts |grep "docker" |grep "【CONTAINER_ID】"
然后先取消掛載
umount /data/sys/var/docker/containers/掛載目錄/secretsumount /data/sys/var/docker/containers/掛載目錄/shm
如果這一步 unmout 不了,可以嘗試找到使用該目錄的進程
lsof |grep "掛載目錄"
如果有相關(guān)進程,記錄相關(guān)的進程號直接 kill -9 進程號
ll /var/lib/docker/containers | grep 【CONTAINER_ID】
這個時候再重新執(zhí)行刪除目錄命令
cd /var/lib/docker/containers
rm -rf 目錄名
這個時候就可以刪掉了
- 再次嘗試通過docker的命令停止容器
docker stop 【CONTAINER_ID】
或
docker rm -f 【CONTAINER_ID】或docker kill --signal=SIGINT 【CONTAINER_ID】
如果還是無法停掉改服務(wù),可以按如下步驟:
使用linux進程管理命令來結(jié)束容器進程
先找到該進程:
ps -ef | grep【CONTAINER_ID】
強制殺掉篩選出來的進程信息:
kill -9 PID
- 再次檢查docker服務(wù)狀態(tài)
docker ps
先可以看到該服務(wù)已經(jīng)被干掉了。
如果說按照這個操作依然無法解決docker假死問題,那么我還是建議大家采用上面最粗暴的方式去解決,但是要注意,這個操作會把所有的docker服務(wù)無差別的重啟。
以上就是docker服務(wù)假死的解決方法的詳細內(nèi)容,更多關(guān)于docker服務(wù)假死的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
docker中通過nginx+confd動態(tài)生成配置的解決方案
這篇文章主要介紹了docker:nginx+confd動態(tài)生成配置,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03dockerfile結(jié)合go應(yīng)用程序的簡單應(yīng)用代碼示例
Dockerfile文件是一個包含了指令和參數(shù)的文本文件,用于自動化構(gòu)建Docker鏡像,這篇文章主要給大家介紹了關(guān)于dockerfile結(jié)合go應(yīng)用程序的簡單應(yīng)用,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-03-03通過Dockerfile構(gòu)建Docker鏡像的方法步驟
這篇文章主要介紹了通過Dockerfile構(gòu)建Docker鏡像的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02docker kubernetes dashboard安裝部署詳細介紹
這篇文章主要介紹了docker kubernetes dashboard安裝部署詳細介紹的相關(guān)資料,需要的朋友可以參考下2016-10-10