近年來,以Docker和kubernetes為代表的容器技術日新月異,但我們在容器的使用過程中,也會碰到各種困擾和難題。本文針對Docker容器部署、維護過程中,產生的問題和故障,做出有針對性的說明和解決方案,希望可以幫助到大家去快速定位和解決類似問題故障。
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
原因: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服務無法正常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
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 $
15、
chown socket at step GROUP: No such process
原因:docker無法找到Group組信息,docker組有可能被誤刪除,
解決方式:
groupadd docker
16、
Post http:///var/run/docker.sock/v1.XXX /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 https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io
原因:Docker倉庫無法訪問
解決方式:
修改Docker倉庫源為國內或者自建的倉庫源
修改/etc/docker/daemon.json
19、推送本地鏡像報錯
The push refers to a repository [XXXX] Get https://xxx/v1/_ping: 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 logs 容器名,查看異常日志
查看/var/log/messages
原因:內存跑滿,引起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
重啟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
原因:container-selinux版本低或者是沒安裝的原因
解決方式:
wget -O /etc/yum.repos.d/CentOS-Base.repo
http://mirrors.aliyun.com/repo/Centos-7.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 https://pypi.douban.com/simple 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
原因:容器掛載數據卷,無法直接刪除
解決方式:
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
添加以下內容
48、
docker數據庫相關報錯
使用Docker創建mysql容器閃退
Database is uninitialized and password option is not specified
解決方式:
docker run -d -e MYSQL_ROOT_PASSWORD=[密碼] -p 3306:3306 mysql鏡像
為避免出現各種奇怪且偶發的問題,運維和開發人員應該有規范的去使用docker容器,最大程度的去避免因為使用不當而引起的故障,參考以下:
Docker使用規范建議
盡量使用最近1-2年的新的穩定的docker版本
不要去安裝今年前很老的版本,大量的bug已經被新版本更新解決掉了
盡量不要去創建非常大的鏡像,比如5G10G以上的
鏡像要盡量輕量化,去除不必要的軟件,數據等
容器內掛載宿主機配置,使用只讀
容器需要-v 宿主機的配置文件,盡量使用ro只讀
數據要掛載宿主機物理硬盤或存儲節點上
不要直接在容器里run,避免容器宕機引起數據丟失
應用日志一定要掛到宿主機上
不要直接打印到容器內,避免只能docker logs方式查看,避免去vulume目錄里查看日志
不要只使用latest標簽
Tag要有個管理標准,可以根據tag查找對應版本
不要使用容器ip,配置里更不能寫死(默認172.17.0.x)
容器重啟后,ip很可能會變
盡量不要在單容器內跑多進程
容器不是虛擬機,盡量做到1個容器,1個進程
跨環境鏡像保持一致
不論是測試,UAT,生產環境,盡量保持同一個鏡像,不要變更,環境變更只需要變更環境變量參數做區分
一定監控docker容器,即使發現問題
建議使用prometheus監控容器
一定要限制docker容器的資源
尤其是CPU,內存,硬盤空間,甚至是網絡等,避免侵占宿主機的硬件資源