問題描述
環境如下:
- centos7.6
- linux 3.10
- docker任意版本
問題:yum安裝完docker之後systemctl start docker一直卡住,docker ps,docker images等都是卡住,strace發現都是卡住在網絡等待,排查docker daemon日誌沒有發現可疑點或者有異常日誌但隨着異常日誌排查並沒有解決問題,重裝docker,重啓設備未解決問題。
重啓系統,重裝docker都解決不了,決定花時間好好排查。
問題所在
找一臺docker正常運行的機器進行對比排查,以期能夠找到問題點
正常機器 systemctl status docker 結果如下:
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2019-11-01 12:00:18 HKT; 4 days ago
Docs: http://docs.docker.com
Main PID: 28808 (dockerd-current)
CGroup: /system.slice/docker.service
├─28808 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userl...
└─28816 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/l...
異常機器 systemctl status docker 結果如下:
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: activating (start) since Tue 2019-11-05 20:38:18 CST; 6s ago
Docs: http://docs.docker.com
Main PID: 449215 (dockerd-current)
CGroup: /system.slice/docker.service
├─449215 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --user...
├─449268 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/...
└─451211 /usr/sbin/iptables --wait -t nat -D PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
很顯然異常機器多了一條:
/usr/sbin/iptables --wait -t nat -D PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
ps查看,就是iptables卡死(處於D狀態):
ps aux | grep iptables
root 205480 0.0 0.0 18304 752 ? D 20:54 0:00 /usr/sbin/iptables --wait -t nat -D PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
由上基本得出是iptables卡住導致docker卡住,這是docker啓動過程中要建立iptables策略爲後續docker網絡做準備,這個過程失敗導致卡住。
解決方案
iptables不能創建,基本上可以猜測是安全策略導致的。諮詢相關人員解決即可,比如我這裏是將/etc/modprobe.d/目錄下iptables和nat相關黑名單放開就可以了。
思考
想吐槽一句爲啥iptabes卡住在docker啓動日誌和調試日誌中看不到相關的日誌,害得花大量時間排查。
軟件設計過程中要考慮可維護性,除了問題要方便排查纔好。