记一次docker启动卡住的排查经历

  • 问题描述
  • 问题所在
  • 解决方案
  • 思考


问题描述

环境如下:

  • 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启动日志和调试日志中看不到相关的日志,害得花大量时间排查。
软件设计过程中要考虑可维护性,除了问题要方便排查才好。