报错 Cannot connect to the Docker daemon 怎么解决?
报 Is the docker daemon running 时先核对 context 与实际端点,再按 rootful、rootless、Desktop 或远程环境检查服务、API 连通与权限。本文给出完整排查链。
排查主线:这个错误表示 Docker 客户端连不上守护进程。先用 docker context show、docker context inspect 和 DOCKER_HOST/DOCKER_CONTEXT 核对实际端点,再按环境检查。对本机 rootful systemd 服务:①sudo systemctl status docker 看守护进程在不在跑,没在跑就 start;②sudo docker info 验证该端点是否响应API;③sudo 能连、普通用户不能连 → 先确认两者使用同一端点,再检查权限;rootless 服务应在用户会话用 systemctl --user 排查。
第一步:守护进程在跑吗
sudo systemctl status docker
active (running)→ 跳到第二步inactive/failed→ 启动它:
sudo systemctl start docker
sudo systemctl enable docker # 顺便设置开机自启
启动失败就看日志找原因:
sudo journalctl -u docker --since "10 min ago"
常见失败原因:磁盘满、配置文件(/etc/docker/daemon.json)语法错、存储驱动不兼容。
第二步:守护进程本身正常吗
sudo docker info
能输出系统信息只说明该端点可响应,不能证明存储、网络和容器全都健康;sudo 可能使用不同 context 和环境,不能直接判定普通用户权限错误;sudo 都连不上,回到第一步深挖守护进程日志。
第三步:解决权限
sudo usermod -aG docker $USER
newgrp docker # 或注销重登
docker ps # 免 sudo 验证
常见 rootful socket 为 root:docker、权限 660,但应检查实际端点、数字 UID/GID 和安全策略;仅在确认组权限不足时按上例授权。
其他环境的表现
- Mac/Windows(Docker Desktop):没有 systemctl,报这个错通常是 Desktop 应用没启动或启动中——打开 Docker Desktop 等鲸鱼图标稳定。
- WSL2:确认用的是 Docker Desktop 的 WSL 集成,或 WSL 发行版内的 docker 服务已启动。
- 远程守护进程:设了
DOCKER_HOST环境变量时客户端连的是远端,检查该变量与远端可达性(echo $DOCKER_HOST)。
常见问题(FAQ)
Q:重启机器后才出现这个错?
A:docker 服务没设开机自启,sudo systemctl enable docker。
Q:daemon.json 改完启动失败?
A:先用 python3 -m json.tool 检查 JSON,再用支持的 dockerd --validate --config-file=/etc/docker/daemon.json 检查配置语义,并排查与启动参数重复的选项。
Q:磁盘满会导致守护进程起不来吗?
A:会。df -h 确认,先 docker system prune(如果能起)或清理 Docker 管理目录之外已确认可删除的文件;不要手动删除 /var/lib/docker 内部文件,这可能破坏镜像、容器和卷数据。