系统补丁更新后 Docker 容器无法启动,通常是因为内核模块、防火墙规则或服务依赖发生了变化。建议优先检查 Docker 服务状态和系统日志,确认是否是防火墙重置或存储驱动不兼容导致的问题。
先说结论:大多数情况下是防火墙规则丢失或内核更新导致驱动不匹配,按顺序检查服务状态、日志和网络配置即可修复。
- 先确认 Docker 服务是否活跃,排除服务未启动的情况
- 先处理防火墙和 iptables 规则冲突,这是更新后最常见的原因
- 再验证容器能否正常拉起,确保业务端口可访问
命令速用版
如果希望快速排查,可以按顺序执行以下命令查看关键状态:
systemctl status docker
journalctl -u docker.service -n 50 `--no-pager`
docker ps -a
docker start <container_id>
为什么会这样
系统补丁更新往往涉及内核升级或网络组件重置。Docker 依赖特定的内核模块(如 overlay2)和 iptables 规则来管理网络隔离。当系统更新后,原有的 iptables 规则可能被防火墙服务重置,导致 Docker 链丢失;或者新内核与旧版 Docker 存储驱动不兼容,使得守护进程无法初始化。此外,SELinux 策略更新也可能阻止 Docker 访问挂载目录。
分步处理
1. 检查 Docker 服务状态
首先确认 Docker 守护进程是否运行。如果服务本身 failed,容器自然无法启动。
执行 sudo systemctl status docker,如果显示 inactive 或 failed,尝试 sudo systemctl restart docker。
2. 查看详细错误日志
服务启动失败通常有具体原因。使用 sudo journalctl -u docker.service 查看日志。
重点关注 ERROR 或 failed 关键字,以下是更新后常见的报错片段及含义:
# 存储驱动错误
error creating overlay mount to /var/lib/docker/overlay2/...
# 网络初始化失败
iptables failed: iptables `--wait` -t nat -A DOCKER ...
# 权限拒绝
permission denied while trying to connect to the Docker daemon socket
3. 检查防火墙与 iptables
更新后防火墙服务重启可能清除 Docker 规则。检查 iptables 中是否有 DOCKER 链:
sudo iptables -L -n | grep DOCKER
如果没有,重启 Docker 服务通常会自动重建规则:sudo systemctl restart docker。
如果防火墙软件(如 firewalld)在 Docker 之后启动,需调整启动顺序或重启 Docker。若规则仍丢失,可尝试重载防火墙配置:
sudo firewall-cmd `--reload`
sudo systemctl restart docker
4. 确认存储驱动兼容性
执行 docker info | grep Storage 查看当前驱动。如果内核更新导致 overlay2 不可用,可能需要修改 /etc/docker/daemon.json 指定驱动。
配置示例:
{
"storage-driver": "overlay2"
}
注意:修改存储驱动通常会导致原有容器数据无法挂载,操作前务必备份 /var/lib/docker 目录,必要时需清空该目录才能生效。
5. 检查权限与 SELinux
如果是 CentOS/RHEL 系统,SELinux 可能阻止访问。临时测试可执行 setenforce 0,若恢复则需调整 SELinux 策略或容器挂载参数。
安全警告:测试完成后,务必执行 setenforce 1 恢复 SELinux 安全策略,避免系统长期处于不安全状态。
怎么验证是否生效
执行 docker ps 查看运行中容器列表,确认目标容器状态为 Up。
使用 docker logs <container_id> 查看容器内部日志,确认无启动报错。
如果容器提供网络服务,使用 curl 或浏览器访问映射端口,确认连通性。
常见坑
1. 不要盲目执行 docker system prune -a,这会删除所有停止的容器和未使用的镜像,可能导致数据丢失。
2. 卸载重装前务必备份 /var/lib/docker 目录,否则现有镜像和容器数据会丢失。
3. 内核版本过低(如低于 3.10)可能无法支持新版 Docker 特性,需确认系统内核满足要求。
4. 修改存储驱动前未备份数据,导致容器无法挂载原有卷。
5. 临时关闭 SELinux 后忘记恢复,留下系统安全隐患。
参考来源
更多细节可查阅 Docker 官方文档。