报错在说什么
这是客户端连不上守护进程时的通用报错,全文含 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?。常见根因有四个:守护进程没启动、套接字路径不对(rootless 实例)、context 指向了别的引擎、DOCKER_HOST 环境变量被改过。它和 permission denied 是两类问题,后者说明套接字存在但当前用户没有权限。
基本信息
| 典型报错 | Cannot connect to the Docker daemon ... Is the docker daemon running? |
|---|---|
| 常见根因 | 服务未启动 / 套接字路径不符 / context 指向错误 / DOCKER_HOST 被覆盖 |
| 与权限报错的差别 | permission denied 属另一类,套接字存在但无访问权限 |
| 排查顺序 | 服务状态 → 套接字 → context → 环境变量 |
| 适用平台 | Linux 服务器、Docker Desktop(Windows/macOS)、rootless 实例 |
典型使用场景
- 服务器重启后首次执行 docker 命令就报此错,先确认服务是否开机自启
- 切换远程引擎后忘记切回来,本机命令全部失败
- CI runner 上守护进程权限或路径与预期不符
- rootless 环境用普通用户执行命令时找不到套接字
- 桌面端 Docker Desktop 未启动,命令在本地终端直接报错
五步定位
五步定位
systemctl status docker --no-pager | head -20 # 1. 守护进程是否在运行
docker context ls # 2. 当前 context 指向哪个引擎
ls -l /var/run/docker.sock # 3. 默认套接字是否存在
ls -l /run/user/$(id -u)/docker.sock # 4. rootless 实例的套接字路径
echo "DOCKER_HOST=$DOCKER_HOST" # 5. 环境变量是否被改过
sudo systemctl start docker # 确认没启动再拉起
journalctl -u docker -n 50 --no-pager # 起不来时读第一行报错原因检查项与判读
| 检查项 | 正常表现 | 异常含义 |
|---|---|---|
| systemctl status docker | active (running) | inactive/failed 说明守护进程没起来 |
| docker context ls | 星号在 default 或预期 context | 星号落在远程或旧 context 上说明指向错误 |
| /var/run/docker.sock | 存在,属主 root:docker | 不存在多为服务未启动或处于 rootless 模式 |
| DOCKER_HOST | 通常为空 | 指向旧地址或失效的 tcp 地址会连不上 |
桌面端 Docker Desktop 未启动时同样报这句话,先看托盘图标是否 Running,再去排查容器内的 Linux 服务。
rootless 模式的套接字在 /run/user/<uid>/docker.sock,只按 /var/run/docker.sock 排查会得出「服务不存在」的错误结论。
同一台机器上并存发行版安装的引擎与桌面版或其他替代实现时,可能同时存在多个套接字,先确认命令实际连的是哪一个:把 which docker 与 docker context ls 的结果一起看。