温馨提示×

Docker在CentOS上的故障排查方法

小樊
39
2025-12-25 06:24:20
栏目: 智能运维

Docker在CentOS上的故障排查方法

一 快速定位流程

  • 检查运行状态与版本:执行systemctl status dockerdocker version,确认守护进程是否存活、客户端与服务端版本是否匹配。若提示无法连接,多半是守护进程未启动。
  • 查看服务日志:使用journalctl -u docker.service -b(或journalctl -xeu docker.service)定位启动失败的具体报错;部分系统也会写入**/var/log/docker.log**。
  • 校验内核与基础依赖:执行uname -r确认内核≥3.10;必要时更新系统并安装必要组件(如yum-utils、device-mapper-persistent-data、lvm2)。
  • 核对配置文件:检查**/etc/docker/daemon.json语法与路径权限;CentOS 7上也可同时核查/etc/sysconfig/docker**中的代理、存储路径等配置。
  • 验证网络与防火墙:确认firewalld/iptables未阻断Docker网络(如docker0与端口2375/2376);必要时在排障阶段短暂关闭防火墙验证。
  • 资源与文件系统:用df -h、free -m、top排查磁盘、内存与CPU压力;异常关机后考虑文件系统检查。

二 常见故障与修复对照表

症状 可能原因 快速修复
Cannot connect to the Docker daemon at unix:///var/run/docker.sock Docker未启动或socket异常 systemctl start docker;若/var/run/docker.sock为目录,rm -rf /var/run/docker.sock 后重启
Unit docker.service failed to load: No such file or directory 包未装或服务文件缺失 重新安装Docker CE;确认/usr/lib/systemd/system/docker.service存在
failed to start docker.service: unit docker.service is masked 服务被mask systemctl unmask docker.service 与 docker.socket 后启动
docker0: iptables: no chain/target/match by that name iptables链缺失(重启后常见) 重启Docker(systemctl restart docker)或重建iptables规则
Error initializing graphdriver: driver not supported / 启动卡住 存储驱动不兼容或异常 /etc/docker/daemon.json 设置"storage-driver": “overlay2” 后重启
Permission denied 挂载目录不可访问 SELinux策略限制 临时 setenforce 0 验证;或改用Z/ :Z挂载选项、调整SELinux策略
Job for docker.service failed(配置错误) daemon.json语法错误或路径不可写 校验JSON语法,修正配置并重启
container name “xxx” is already in use 容器名冲突 docker stop && docker rm 或换名启动
安装时报 Requires: container-selinux >= 2.9 依赖版本过低 安装/更新 container-selinux 后重装Docker CE

三 存储驱动与网络关键点

  • 存储驱动:优先使用overlay2。在**/etc/docker/daemon.json**中设置{“storage-driver”: “overlay2”},保存后重启Docker;如仍异常,检查内核是否支持并考虑升级。
  • 网络连通:排查docker0网桥与自定义网络是否正常;验证firewalld/iptables规则未阻断容器通信;排障时可短暂停止防火墙验证,但生产环境应改为精确放通策略。
  • 资源与文件系统:磁盘满、inode耗尽或异常关机导致的文件系统问题,都会引发Docker启动或运行异常;先清理空间、修复文件系统,再重启服务。

四 高风险操作与回退建议

  • 清理数据目录:执行**systemctl stop docker && rm -rf /var/lib/docker/***会删除所有镜像、容器与卷,仅在确认可丢失数据时作为最后手段,并务必先备份。
  • 调整SELinux:临时setenforce 0仅用于定位;长期应通过正确的SELinux策略或挂载选项(如Z/ :Z)解决,避免直接禁用SELinux。
  • 变更防火墙:排障时可短暂停止firewalld验证,但应恢复并配置精确规则,避免长期暴露风险。

五 一键排查脚本示例

  • 复制以下脚本保存为docker-diag.sh,执行:bash docker-diag.sh
#!/usr/bin/env bash
set -Eeuo pipefail

echo "===== 系统信息 ====="
uname -r
echo "内核版本: $(uname -r)"

echo -e "\n===== Docker版本 ====="
docker version 2>/dev/null || echo "Docker未安装或守护进程未运行"

echo -e "\n===== 服务状态 ====="
systemctl is-active --quiet docker && echo "Docker运行中" || {
  echo "Docker未运行,状态:"
  systemctl status --no-pager -l docker || true
}

echo -e "\n===== 服务日志(最近50行) ====="
journalctl -u docker.service -b --no-pager -n 50 || echo "无法读取journal日志"

echo -e "\n===== 配置文件检查 ====="
if [[ -f /etc/docker/daemon.json ]]; then
  echo "daemon.json内容:"
  jq . /etc/docker/daemon.json 2>/dev/null || cat /etc/docker/daemon.json
else
  echo "未找到 /etc/docker/daemon.json"
fi

echo -e "\n===== 资源与挂载 ====="
df -h | head -n 10
free -m
mount | grep docker || echo "未检测到docker挂载点"

echo -e "\n===== 防火墙状态 ====="
systemctl is-active --quiet firewalld && echo "firewalld运行中" || echo "firewalld未运行"

0