遇到Job for docker.service failed这个错误提示时,很多运维同学的第一反应可能是"又来了"。这个看似简单的报错背后,往往隐藏着各种配置问题。我最近在给客户部署私有镜像仓库时就踩过这个坑,当时修改完daemon.json后,Docker就直接罢工了。
先说说典型场景:当你修改了Docker配置(比如添加私有仓库地址、调整存储驱动),或者系统意外重启后,执行systemctl start docker时突然看到这个错误。这时候千万别慌,跟着我一步步来排查。首先记住两个救命命令:
bash复制systemctl status docker -l # 查看详细服务状态
journalctl -xe -u docker # 查看系统日志
第一次看到Active: failed (Result: exit-code)这个状态时,我也是一头雾水。后来才发现这些信息其实很有用。比如下面这段典型输出:
bash复制● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Tue 2024-01-30 21:14:36 CST; 12h ago
Docs: https://docs.docker.com
Process: 4110 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=1/FAILURE)
Main PID: 4110 (code=exited, status=1/FAILURE)
关键信息有三处:
Process: 4110 ExecStart=... 显示Docker启动时使用的完整命令(code=exited, status=1/FAILURE) 说明进程异常退出我遇到过最坑的情况是日志里什么都没写,这时候就需要更深入的排查了。
当systemctl的状态信息不够详细时,journalctl就是我们的秘密武器。这个命令能显示完整的系统日志,我习惯用:
bash复制journalctl -u docker --no-pager -n 100
这里的-n 100表示显示最近100行日志,足够定位大部分问题了。
常见错误模式包括:
insecure-registies拼写错误(正确应该是insecure-registries)这个配置文件可以说是Docker的"阿喀琉斯之踵",90%的启动问题都出在这里。分享几个我踩过的坑:
json复制// 错误示例(注意逗号和多出的引号)
{
"insecure-registries": ["myregistry:5000",],
"debug": true"
}
这种格式错误会导致Docker完全无法启动。建议每次修改后都用jq工具验证:
bash复制jq empty /etc/docker/daemon.json && echo "Valid JSON"
这是我犯过的典型错误:
json复制{
"insecure-registies": ["registry.local:5000"] // 错误拼写
}
正确的参数名应该是insecure-registries(少了个r)。这种错误通常会在日志中明确提示。
某些参数不能同时使用,比如:
json复制{
"storage-driver": "overlay2",
"storage-opts": ["overlay2.override_kernel_check=true"],
"iptables": false // 这个参数可能导致Kubernetes网络异常
}
bash复制# 使用jq工具验证JSON语法
sudo jq . /etc/docker/daemon.json
# 如果没有jq,可以用Python简单检查
python -m json.tool /etc/docker/daemon.json
当怀疑是配置问题时,可以先将配置文件移走:
bash复制sudo mv /etc/docker/daemon.json /etc/docker/daemon.json.bak
sudo systemctl restart docker
如果Docker能正常启动,就能确定问题出在配置文件上。
建议采用二分法排查:
启用debug模式获取更详细日志:
bash复制sudo dockerd --debug
这个命令会在前台运行Docker并输出详细日志,方便实时查看问题。
经过多次踩坑后,我总结出几个经验:
sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak最后分享一个我常用的健康检查脚本:
bash复制#!/bin/bash
if ! systemctl is-active --quiet docker; then
echo "Docker is down! Attempting to restart..."
systemctl restart docker
sleep 5
if systemctl is-active --quiet docker; then
echo "Restart succeeded"
else
echo "Restart failed, sending alert"
# 这里添加你的告警逻辑
fi
fi