permission denied while trying to connect to the Docker daemon socket

[复制链接]
发表于 2026-10-6 10:47:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

一、这条报错到底在说什么

Docker 装完,第一次敲 docker ps 或者 docker run 就弹出一串 permission denied while trying to connect to the Docker daemon socket,这是新手最常遇到的一类报错。它的含义其实很直白:Docker 是一个常驻的守护进程(daemon),它对外只开一个 Unix 套接字,默认是 /var/run/docker.sock;而访问这个套接字需要对应权限,当前登录的用户没有,于是被拒了。

注意这不是镜像没拉下来,也不是仓库地址写错,跟网络基本没关系。绝大多数情况只差一步:把当前用户加进 docker 组。

二、先确认服务本身活着

在动手改权限之前,先排除掉"守护进程压根没起来"这个可能:

sudo systemctl status docker
sudo systemctl status docker.socket

如果显示 inactive 或者 failed,那就先把它拉起来:

sudo systemctl start docker
sudo systemctl enable docker

再看一眼套接字文件在不在、属主是谁,这一条能直接印证报错来源:

ls -l /var/run/docker.sock

正常输出里 docker.sock 的属主是 root:docker,权限一般是 srw-rw----。注意这里的 g 组就是 docker 组,只要你的用户在这个组里就能读写。

三、核心解法:把用户加进 docker 组

3.1 先看自己在不在这个组里

groups

输出里没有 docker 这一项,就需要往下加。

3.2 加组

sudo usermod -aG docker $USER

那个 -aG 是"追加到附加组",千万别只写 -G,那会把用户从其他附加组里一并踢出去,是把事情搞复杂的最常见写法。

3.3 让组变更生效

组成员关系只在登录时读取一次,所以必须重新登录:

  • 图形界面:注销当前用户再登录。
  • 纯命令行:退出重新 SSH 登录一次。
  • 图省事也可以直接 newgrp docker 在当前 shell 里临时生效,但开新终端又会失效,不建议作为长期方案。

四、验证是否修好

docker ps
docker info

这两条能正常输出表头或概要信息,说明权限通了。再顺手跑一个最轻量的命令确认整体链路没问题:

docker run --rm hello-world

五、如果还是不行,按这个顺序继续排查

5.1 改完没重新登录

这是第一嫌疑。加了组没退出重登,权限是不生效的,重新连一次再试。

5.2 用的是 sudo 之外的老账号

如果机器上存在多个用户,或者你切到了 root 之外的另一个账户,那 usermod 加的可能是别人。用 whoami 和 id 确认当前身份。

5.3 套接字路径不对(非标准安装)

比如手动改过 daemon 配置、把容器运行时换成了 rootless 模式、或者用的是 podman 之类的替代方案,套接字路径就不是 /var/run/docker.sock。用这条命令看客户端认的是哪儿:

docker context ls

5.4 SELinux / AppArmor 拦截

在开了 SELinux 的系统上,即便组权限对了也可能被策略挡住,可以查一下审计日志日志:

ausearch -m avc -ts recent
sudo journalctl -u docker | tail -n 50

5.5 加组后被系统里的 sudo 规则覆盖

少数情况下运维会给 docker 组配好 sudo,但被 sudoers 里的其他规则覆盖,用 sudo -l 看一下当前用户的权限全貌。

六、关于 docker 组权限本身的提醒

需要明确一点:加入 docker 组等于拿到了和 root 很接近的能力——因为能操作 docker.sock 就能启动一个挂载宿主根目录的容器,等价于拿到宿主机控制权。所以这件事别随手加到每一个能登录机器的账号上,尤其是在多台人共用一台构建机的环境里。更稳妥的做法是给需要日常 docker 操作的人单独建一个受限账号,跑 CI 的用户再用专门的 runner 账号。

七、小结

整条排查链路很短:先 systemctl status docker 确认守护进程活着,再用 ls -l /var/run/docker.sock 确认套接字属组和报错对得上,然后 usermod -aG docker $USER 追加用户、退出重新登录、docker ps 验证。九成的权限问题在这一步就结束了;剩下的再依次考虑非标准套接字路径、SELinux/AppArmor 策略和 sudo 规则覆盖。最后别忘了 docker 组的权限等级,别把它当成一个普通权限随手发。

qidao123.com企服评测-应用市场 编辑提示

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表