Cannot connect to the Docker daemon 怎么解决?守护进程连不上的 5 种原因
现象:任何 docker 命令都被拒
Cannot connect to the Docker daemon at unix:///var/run/docker.sock.
Is the docker daemon running?
一行结论:docker CLI 客户端活着,但它要对话的 dockerd 守护进程不在。客户端通过一个 Unix socket(或 TCP/SSH)找 daemon,找不到就报这个错。注意它和 permission denied 的区别——那是「socket 在但你不许碰」,本篇是「socket 压根不存在或后面没人」。
五种原因,按概率排序
1. 守护进程没启动(Linux 服务器最常见)
systemctl status docker
# ● docker.service - Docker Application Container Engine
# Active: inactive (dead) ← 没跑
sudo systemctl start docker
sudo systemctl enable docker # 顺手设开机自启
重启后忘了 enable、升级后服务挂了、OOM 把 daemon 杀了都会落到这里。先看状态再谈别的。
2. Docker Desktop 没开(macOS / Windows)
Docker Desktop 的 daemon 跑在虚拟机里,CLI 是独立的——App 没启动,CLI 照样存在,报错也一模一样。打开 Docker Desktop 等鲸鱼图标稳定即可。
3. WSL2:发行版集成被关了
Windows 上在 WSL2 里用 docker,需要 Docker Desktop 开启对当前发行版的集成(Settings → Resources → WSL Integration)。升级 Docker Desktop 后集成开关被重置是高频场景:
# 重启 WSL 后再试
wsl --shutdown
4. daemon.json 写错,daemon 起不来
/etc/docker/daemon.json 有语法错误或非法字段时,systemctl start docker 表面成功实际失败。看真实原因:
journalctl -u docker --since "10 minutes ago" | tail -20
# 常见输出:unable to configure the Docker daemon with file ...: invalid character
改回合法 JSON(注意最后一个键后面不能有逗号),再 restart。这也是配置镜像加速器、日志轮转时最容易踩的坑。
5. docker context 指错了 / rootless 环境变量没设
docker context ls
# NAME DESCRIPTION DOCKER ENDPOINT
# default * Docker Engine at unix:///var/run/... ← 星号是当前 context
如果星号落在 remote 或某个失效的 context 上,本地 daemon 再健康也连不上:docker context use default 切回来。
rootless 模式下 socket 在用户目录里(/run/user/<uid>/docker.sock),SSH 新开会话忘了 export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock 就会连到不存在的系统 socket。
诊断路线(两分钟走完)
# 1. 服务状态
systemctl status docker
# 2. 状态不对,看日志找死因
journalctl -u docker -n 30
# 3. 服务正常但仍报错,检查 socket 与 context
ls -l /var/run/docker.sock
docker context ls
# 4. 都正常?直接问 daemon
sudo curl -s --unix-socket /var/run/docker.sock http://localhost/version | head -c 200
第 4 步能拿到 JSON 说明 daemon 活着——报错出在你的用户权限上,去看另一篇:Docker permission denied 排查。
和相近错误的分界线
| 报错 | 含义 | 跳转 | |---|---|---| | Cannot connect to the Docker daemon | daemon 没在跑 / 找不到 | 本篇 | | permission denied ... docker.sock | socket 在,你的用户无权访问 | 权限问题篇 | | no space left on device | daemon 活着,磁盘满了 | 磁盘清理篇 | | port is already allocated | daemon 活着,端口被占 | 端口占用篇 |
排查清单
systemctl status docker— 服务 active 吗?- macOS/Windows — Docker Desktop 应用开了吗?WSL 集成开了吗?
journalctl -u docker -n 30— daemon.json 是否有语法错误?docker context ls— 星号在 default 上吗?- rootless —
DOCKER_HOST环境变量设了吗?
本文由 ToolVault 工具匣 提供。相关工具:Dockerfile 生成器、Linux 命令速查。相关阅读:Docker 权限问题排查、端口被占用 EADDRINUSE。访问 首页 查看更多开发者工具。
相关工具
相关文章
Permission denied (publickey) 怎么解决?Git 推送失败的 6 种原因与修复
git clone/push 报 Permission denied (publickey) fatal: Could not read from remote repository?覆盖公钥没生成、没加载进 agent、没添加到 GitHub/Gitee、多账号配错密钥、deploy key 权限、remote URL 写错六种根因,附 ssh -v 诊断方法。
npm ERR! ERESOLVE:peer dependency 冲突的四种解决策略
npm install 报 ERESOLVE unable to resolve dependency tree 怎么办?理解 peer dependency 的设计意图,掌握四种解决策略(版本修复 / legacy-peer-deps / overrides / dedupe)及其适用场景与风险。
error:0308010C digital envelope routines::unsupported 怎么解决?Node 17+ 跑老项目的三种修法
Node 17+ 启动 webpack 4 老项目报 error:0308010C:digital envelope routines::unsupported?根因是 OpenSSL 3.0 移除了 MD4 哈希。本文给出 --openssl-legacy-provider 临时方案、升级 webpack 5 根治方案和锁定 Node 16 的取舍。