經典乾貨:Docker 常見故障排查處理

ITPUB社群發表於2023-01-30



【導讀】本文針對Docker容器部署、維護過程中,產生的問題和故障,做出有針對性的說明和解決方案,希望可以幫助到大家去快速定位和解決類似問題故障。

【作者】曹如熙,上海逸橙網路科技有限公司高階運維leader。具有超過十年的網際網路運維及五年以上團隊管理經驗,多年容器雲的運維,尤其在Docker和kubernetes領域非常精通。


Docker是一種相對使用較簡單的容器,我們可以透過以下幾種方式獲取資訊:

1、透過docker run執行命令,或許返回資訊

2、透過docker logs 去獲取日誌,做有針對性的篩選

3、透過systemctl status docker檢視docker服務狀態

4、透過journalctl -u docker.service 檢視日誌

以下是整理的docker容器類問題故障,分為9個類

一、啟動類故障

1、

docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

原因:Docker未正常啟動

解決方式:

systemctl start docker

2、

can't create unix socket /var/run/docker.sock: is a directory

原因:docker.sock不能建立

解決方式:

rm -rf /var/run/docker.sock

然後重新啟動docker

3、

Job for docker.service failed. Failed to start Docker Application

經典乾貨:Docker 常見故障排查處理

原因:Selinux引起

解決方式:

/etc/sysconfig/selinux , 把 selinux 值改為disabled

重啟docker解決

4、

docker: Error response from daemon:

/var/lib/docker/overlay/XXXXXXXXXXXXXXXXXXXXXXX: no such file or directory.

原因:docker沒有指定目錄或檔案

解決方式:

systemctl stop docker

rm -rf /var/lib/docker/*

systemctl start docker

重啟run映象啟動容器

5、

docker: Error response from daemon: Conflict. The container name "XXX" is already in use by container "XXX". You have to remove (or rename) that container to be able to reuse that name.

原因:docker name重名

解決方式:

改名容器或者刪除重建容器

6、

Error: Connection activation failed: No suitable device found for this connection

原因:網路卡配置問題

解決方式:

重啟網路卡

7、

系統重啟後docker無法啟動

報錯為:docker0: iptables: No chain/target/match by that name

原因:docker服務iptables問題

解決方式:

重啟docker服務system restart docker

8、

Error starting daemon: error initializing graphdriver: driver not supported

使用overlay2儲存驅動啟動docker daemon報錯

原因:daemon缺少配置

解決方式:

新增配置:

/etc/docker/daemon.json

{"storage-driver": "overlay2",

"storage-opts": ["overlay2.override_kernel_check=true"]}

9、

Failed to start docker.service: Unit docker.service is masked.

未知原因:docker 被mask

解決方式:

systemctl unmask docker.service

systemctl unmask docker.socket

systemctl start docker.service

10、

Failed to start docker.service: Unit is not loaded properly: Invalid argument.

經典乾貨:Docker 常見故障排查處理

未知原因:docker服務無法正常load

解決方式:

解除安裝docker, 刪除docker.service

重新安裝docker

11、

docker-compose啟動容器時報錯:

/usr/lib/python2.7/site-packages/requests/init.py:80: RequestsDependencyWarning: urllib3 (1.22) or chardet (2.2.1) doesn't match a  supported version! RequestsDependencyWarning)

未知原因:pip相應元件版本不支援

解決方式:

pip uninstall urllib3

pip uninstall chardet

pip install requests

12、docker容器重啟故障

強殺docker程式後,重啟docker。docker中的容器無法啟動並報錯

docker restart XXXXXXX Error response from daemon: Cannot restart container XXXXXXX: container "XXXXXXXXXXXXXXXX": already exists

原因:舊容器未安全退出

解決方式:

docker-containerd-ctr --address /run/docker/containerd/docker-containerd.sock --namespace c rm <容器hash_id>

docker start 容器

13、

docker重啟錯誤-重啟命令一直卡住

systemctl restart docker 卡住

未知原因:可能是啟動的容器數量過多,或者磁碟IO問題

解決方式:

systemctl start docker-cleanup.service

systemctl start docker

二、許可權問題報錯

14、

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock

解決方式:

檢視 /var/run/docker.sock所在使用者組

將使用者重新加入docker組中,usermod -aG docker ${USER}

15、

chown socket at step GROUP: No such process

經典乾貨:Docker 常見故障排查處理

原因:docker無法找到Group組資訊,docker組有可能被誤刪除,

解決方式:

groupadd docker

16、

Post /auth: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?

原因:非Root使用者管理Docker時,許可權不足

解決方式:

groupadd docker

usermod -a -G docker user

17、

docker commit映象時報錯

Error processing tar file(exit status 1): unexpected EOF

原因:可能是許可權問題引起

解決方式:

chmod +x 加一個執行許可權

三、映象和倉庫問題報錯

18、

Get dial tcp: lookup registry-1.docker.io

原因:Docker倉庫無法訪問

解決方式:

修改Docker倉庫源為國內或者自建的倉庫源

修改/etc/docker/daemon.json

19、推送本地映象報錯

The push refers to a repository [XXXX] Get http: server gave HTTP response to HTTPS client

原因:docker registry未採用https服務所致

解決方式:

/etc/docker/daemon.json 檔案寫入:

{ "insecure-registries":[""] }

20、

/usr/bin/docker-current: Error response from daemon: oci runtime error: container_linux.go: starting container process caused "exec: \"/bin/bash\": executable file not found in $PATH".

原因:Docker映象自身問題或者Docker引擎版本比較低導致

解決方式:

可以升級Docker版本服務

21、構建映象,執行chown -R非常慢

原因:Docker使用寫時複製策略,所以chown命令執行時,會將上層映象檔案全部複製到當前層,然後再修改許可權,再寫入檔案系統。

解決方式:

不應該使用chown -R 這類大批次修改檔案的命令

22、docker build構建映象的時候報錯:

Message from syslogd kernel:unregister_netdevice: waiting for lo to become free. Usage count = 1

原因:docker engine版本過高

解決方式:

docker engine版本需要和docker內部映象的核心版本匹配

23、

docker: Error response from daemon: containerd: container did not start before the specified time-out.ERRO[0133] error getting events from daemon: context canceled

原因:修改完docker root dir,重啟後,下載映象報錯

解決方式:

重啟docker服務

或者重啟伺服器

四、資源問題報錯

25、

Docker no space left on device

原因:空間不足

解決方式:清理空間,刪除未被使用的容器,映象等資源

docker system prune -a

26、

/var/lib/docker/containers 佔用過大

原因:日誌檔案佔用過大

解決方式:

cat /dev/null > *-json.log

或者

增加dockerd啟動引數,/etc/docker/daemon.json

{"log-driver":"json-file",

"log-opts": {"max-size":"2G", "max-file":"10"}

27、

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

原因:系統引數預設配置過小

解決方式:

修改/etc/sysctl.conf裡面的vm.max_map_count 調大

28、

Got starting container process caused "process_linux.go:301:

running exec setns process for init caused \"exit status 40\"": unknown.

from time to time

原因:可能是cache問題引起

解決方式:

echo 1 > /proc/sys/vm/drop_caches

29、

docker本機啟動多臺容器導致出現後續容器啟動失敗

原因:檢視硬碟空間是否滿,如果不是硬碟空間問題引起

解決方式:

vim /etc/sysctl.conf

新增引數 fs.aio-max-nr = 1048576

sysctl -p

30、Docker啟動異常,狀態反覆restarting

經典乾貨:Docker 常見故障排查處理

Docker logs 容器名,檢視異常日誌

檢視/var/log/messages

經典乾貨:Docker 常見故障排查處理

原因:記憶體跑滿,引起OOM

解決方式:

釋放記憶體後,再啟動容器

五、版本不相容報錯

31、

overlayfs: Can't delete file moved from base layer to newly created dir even on ext4

原因:Centos 提供的檔案系統 XFS 和 Overlay 相容問題導致,

解決方式:

這個問題的修復在核心 4.4.6以上

32、

docker: Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused "process_linux.go:297: getting the final child's pid from pipe caused \"read init-p: connection reset by peer\"": unknown.

原因:Docker版本和作業系統版本不匹配

解決方式:

重新安裝和作業系統核心支援的docker 版本

六、網路或埠問題報錯

33、

WARNING: IPv4 forwarding is disabled. Networking will not work.

原因:ipv4網路無法轉發

解決方式:

/usr/lib/sysctl.d/00-system.conf

在最後一行新增net.ipv4.ip_forward=1

重啟network服務。刪除錯誤的容器,再次建立新容器

34、

Creating network "xxxxxxx" with the default driver

原因:docker閘道器衝突

啟動容器、docker-compose啟動容器後,斷網問題

解決方式:

配置 docker-compose.yml內給啟動的容器配置引數network_mode: "bridge"

35、

Unable to find a node that satisfies the following conditions [port xxxx]

原因:當容器使用埠對映(docker run -p xxxx:xxxx或 compose模板中的

ports)之後 系統會在宿主機上建立一個port,透過NAT來訪問容器的指定port。如果宿主機上的埠被容器或者系統程式佔用,就會導致埠分配失敗。

解決方式:

清除佔用埠的容器或者程式,或調整容器埠對映的宿主機埠避免衝突

36、

Error response from daemon: service endpoint with name xxx already

原因:埠已經被佔用

解決方式:

重啟docker容器

37、

docker: Error response from daemon: driver failed programming external connectivity on endpoint XXXXX: Bind for 0.0.0.0:80 failed: port is already allocated

原因:容器埠衝突

解決方式:

更換宿主機繫結埠

七、Docker安裝報錯

38、安裝docker報Requires: container-selinux >= 2.9

經典乾貨:Docker 常見故障排查處理

原因:container-selinux版本低或者是沒安裝的原因

解決方式:

wget -O /etc/yum.repos.d/CentOS-Base.repo

yum install epel-release

yum makecache

yum install container-selinux

39、安裝docker-compose時報錯

“ImportError: 'module' object has no attribute 'check_specifier'”

原因:setuptools版本問題

解決方式:

升級setuptools到30.1.0版本以上版本

pip install --upgrade setuptools

40、安裝docker-compose時報錯

DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.

原因:python2.7提示升級

解決方式:

pip install -i docker-compose

八、Docker刪除報錯

41、docker刪除容器報錯

Error response from daemon:Driver overlay failed to remove root filesystem xxxxx: remove/var/lib/docker/overlay2/xxxxx/merged: device or resource busy

經典乾貨:Docker 常見故障排查處理

原因:容器掛載資料卷,無法直接刪除

解決方式:

grep docker /proc/*/mountinfo | grep xxxxx

kill程式後

再重新刪除容器

42、狀態dead的容器刪除報錯

Error response from daemon: Driver aufs failed to remove root filesystem XXXXXXXXXXXXXXXX: aufs: unmount error after retries: /var/lib/docker/aufs/mnt/xxxxxxxx: device or resource busy

原因:dead狀態容器無法刪除,還在佔用資源

解決方式:

docker rm -fv 容器id 過幾分鐘後會自動刪除

43、docker刪除映象報錯

Error response from daemon: conflict: unable to remove repository reference "XXXX" (must force) - container XXXX is using its referenced image YYYY

原因:映象正在被某容器使用

解決方式:

需要刪除相關ID容器後,才能刪除映象

44、docker刪除映象報錯

Error response from daemon: conflict: unable to delete XXXXXXXXXX (must be forced) - image is referenced in multiple repositories

原因:映象login push 了遠端其他倉庫

解決方式:

如果不需要此映象, docker rmi -f 強刪

45、docker刪除映象報錯

Error response from daemon: conflict: unable to delete XXX (cannot be forced) - image has dependent child images

原因:存在依賴於父映象的子映象

解決方式:

強制刪除映象或者批次刪除容器,再刪除映象

九、其他報錯

46、docker: Error response from daemon: driver failed programming external connectivity on end-point XXXXXXX: (iptables failed: iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0 -p tcp -d 172.17.0.2 --dport 8080 -j ACCEPT: iptables: No chain/target/match by that name.

原因:防火牆問題引起

解決方式:

關閉防火牆,重啟docker

47、

執行docker info出現如下警告

WARNING: bridge-nf-call-iptables is disabled

WARNING: bridge-nf-call-ip6tables is disabled

原因:配置問題引起,需要啟用bridge-nf-call-iptables

解決方式:

vi /etc/sysctl.conf

新增以下內容

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.bridge.bridge-nf-call-arptables = 1

48、

docker資料庫相關報錯

使用Docker建立mysql容器閃退

Database is uninitialized and password option is not specified

經典乾貨:Docker 常見故障排查處理

解決方式:

docker run -d -e MYSQL_ROOT_PASSWORD=[密碼] -p 3306:3306 mysql映象

為避免出現各種奇怪且偶發的問題,運維和開發人員應該有規範的去使用docker容器,最大程度的去避免因為使用不當而引起的故障,參考以下:

Docker使用規範建議

  1. 儘量使用最近1-2年的新的穩定的docker版本

    不要去安裝今年前很老的版本,大量的bug已經被新版本更新解決掉了

  2. 儘量不要去建立非常大的映象,比如5G10G以上的

    映象要儘量輕量化,去除不必要的軟體,資料等

  3. 容器內掛載宿主機配置,使用只讀

    容器需要-v 宿主機的配置檔案,儘量使用ro只讀

  4. 資料要掛載宿主機物理硬碟或儲存節點上

    不要直接在容器裡run,避免容器當機引起資料丟失

  5. 應用日誌一定要掛到宿主機上

    不要直接列印到容器內,避免只能docker logs方式檢視,避免去vulume目錄裡檢視日誌

  6. 不要只使用latest標籤

    Tag要有個管理標準,可以根據tag查詢對應版本

  7. 不要使用容器ip,配置裡更不能寫死(預設172.17.0.x)

    容器重啟後,ip很可能會變

  8. 儘量不要在單容器內跑多程式

    容器不是虛擬機器,儘量做到1個容器,1個程式

  9. 跨環境映象保持一致

    不論是測試,UAT,生產環境,儘量保持同一個映象,不要變更,環境變更只需要變更環境變數引數做區分

  10. 一定監控docker容器,即使發現問題

    建議使用prometheus監控容器

  11. 一定要限制docker容器的資源

    尤其是CPU,記憶體,硬碟空間,甚至是網路等,避免侵佔宿主機的硬體資源

本文出自容器雲大賽課程《容器雲平臺的日常故障處理》



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2933263/,如需轉載,請註明出處,否則將追究法律責任。

相關文章