docker服务崩溃时,应从systemd状态、containerd日志、存储驱动、内核线索四层排查:先用systemctl is-active docker和ps aux | grep dockerd确认进程状态,再通过journalctl -u containerd和docker info检查驱动,结合dmesg定位overlayfs或oom等内核级故障。

安装 Docker 后若服务崩溃,不能只盯着 /var/log/docker.log 或简单执行 docker logs——因为服务本身已不可用,容器日志命令会直接报错“cannot connect to the docker daemon”。真正有效的排查,要从系统级状态、守护进程行为、底层驱动和内核线索四层切入。
确认 Docker 服务真实状态,区分“崩溃”与“假死”
先验证 systemd 是否还能感知 dockerd 进程:
- 运行
systemctl is-active docker:若返回activating或长时间无响应,说明 systemd 已失去对进程的控制,大概率是僵死或内核级阻塞 - 执行
ps aux | grep dockerd:若进程存在但 CPU 占用为 0、RSS 内存持续上涨、或堆栈卡在futex_wait_queue_me等系统调用中,表明它已被底层驱动挂起 - 测试 Unix 套接字连通性:
curl --unix-socket /var/run/docker.sock http://localhost/version:超时或 connection refused 比任何日志都更早暴露通信链路中断
绕过 Docker 日志,查 containerd 和存储驱动状态
Docker 守护进程严重依赖 containerd,而 containerd 直接对接内核存储与 cgroup。崩溃常始于这一层:
- 查看 containerd 实时日志:
journalctl -u containerd --no-pager -n 100,重点搜索failed to mount、failed to create snapshot、cannot set memory limit—— 这些是 overlay2 或 cgroup v2 初始化失败的明确信号 - 检查存储驱动是否正常初始化:
docker info | grep -E "(Storage Driver|Driver Status)";若显示overlay2但Driver Status为空或报invalid argument,说明驱动加载失败,需检查/var/lib/docker/overlay2是否损坏、被只读挂载,或所在文件系统(如 ext4)出现错误 - 验证 cgroup 版本兼容性:
cat /proc/1/cgroup看路径是否含unified(表示 cgroup v2),再比对docker info | grep "Cgroup";若主机启用 cgroup v2,但daemon.json中强制配置"exec-opts": ["native.cgroupdriver=systemd"],会导致 dockerd 启动数分钟后静默退出
抓取内核级线索,定位驱动级故障源头
当 journalctl 日志断更,dmesg 往往保留着最后的内核告警,是定位崩溃根源的黄金窗口:
- 立即执行
dmesg -T | tail -50,重点关注:overlayfs: failed to get index dir(overlay2 元数据损坏)、ext4 error(文件系统异常)、memory: out of memory(OOM 杀死 dockerd 进程)、nf_conntrack: table full(网络连接跟踪耗尽) - 结合
lsmod | grep overlay确认 overlay 模块是否已加载;若未加载,尝试modprobe overlay,并检查/etc/modules-load.d/是否配置开机自动加载 - 查看
/proc/sys/fs/inotify/max_user_watches和max_user_instances,值过低会导致 overlay2 在大量文件监控场景下触发内核拒绝服务
回溯守护进程启动日志,定位配置类失败
若服务根本无法启动,应聚焦其初始化阶段的失败痕迹:
- 用
journalctl -u docker --no-pager -n 200查看最近启动尝试的完整输出,特别注意level=error行,常见错误包括:failed to start daemon: could not find a supported filesystem(存储驱动不支持)、failed to load listeners: failed to create listener unix:///var/run/docker.sock: permission denied(socket 权限或 SELinux 限制) - 检查
/etc/docker/daemon.json配置合法性,可用jq . /etc/docker/daemon.json校验 JSON 格式;典型错误配置如"storage-driver": "invalid-driver"、"bip": "invalid.cidr"、或 insecure-registries 指向不可达地址 - 确认依赖组件版本匹配:Docker 24+ 要求
containerd.io >= 1.7.0,runc >= 1.1.0;版本错配会导致 dockerd 启动时 panic 并退出











