连接 Docker 时报 permission denied:完整排查清单

连接 Docker 报权限拒绝按此清单排查:用户在不在 docker 组、会话是否重登、~/.docker 属主是否被 sudo 污染、SELinux 是否拦截、是否该用 rootless。逐项排除即可解决。

最佳实践
连接 Docker 时报 permission denied:完整排查清单封面

排查清单(按命中率排序):①groups 命令确认当前用户在 docker 组,不在就 sudo usermod -aG docker $USER;②加组后必须重新登录**(newgrp docker 只对当前终端生效);③曾用 sudo 跑 docker 导致 ~/.docker 属主是 root → chown 回来;④CentOS/RHEL 上检查 SELinux;⑤共享机器考虑 rootless 模式。**

① 组成员资格(最常见)

id                   # 当前进程实际组
id "$USER"           # 用户数据库组信息,可能与当前会话不同
ls -l /var/run/docker.sock  # 核对实际context/socket后查看

socket 文件 srw-rw---- root docker /var/run/docker.sock——组外用户连读写资格都没有。

② 会话刷新

加组后当前已登录的会话不会自动获得新组:

newgrp docker     # 当前终端立即生效
# 彻底方案:注销重登(GUI 会话尤其需要)

③ ~/.docker 属主污染

之前用 sudo docker 留下 root 属主的配置目录:

ls -la ~/.docker
sudo chown -R "$(id -u):$(id -g)" "$HOME/.docker"

症状是加组后仍报 ~/.docker/config.json permission denied。

④ SELinux(RHEL/CentOS/Fedora)

访问被拒但权限都对时:

getenforce                          # Enforcing 时重点怀疑
sudo ausearch -m avc -ts recent     # 看最近的拒绝记录

仅在确认卷的SELinux标签拒绝且适合重标记时考虑:z/:Z;不能把它用于所有socket问题或盲目重标记系统路径。

⑤ 容器内场景

容器里挂了 docker.sock 仍被拒:访问依据socket的数值GID/UID,而非容器内组名是否叫docker;可按最小权限授予对应组。user namespace/rootless和SELinux等仍可能限制,root也不是万能绕过。

⑥ 想彻底绕开:rootless Docker

dockerd-rootless-setuptool.sh install

普通用户跑自己的守护进程,不依赖 docker 组,安全边界更好;适合多用户共享机器。

常见问题(FAQ)

Q:加组重登后 CI 里还是失败?
A:CI runner 是服务进程,不经过登录流程,重启 runner 服务让它重新载组。

Q:chmod 666 docker.sock 一劳永逸行不行?
A:技术上能通,安全上等于把 root 送给所有用户,生产环境严禁。

Q:报错里 socket 路径不是 /var/run/docker.sock?
A:检查 DOCKER_HOST 与 docker context,也可能是rootless/Desktop或另一个本地socket,不一定是远端主机。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台