Skip to content
DevOps2026-09-082 分钟阅读

Docker permission denied:/var/run/docker.sock 权限被拒的正确解法与安全代价

现象:加了 sudo 就能跑,不加就被拒

permission denied while trying to connect to the Docker daemon socket at
unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.sock/_ping":
dial unix /var/run/docker.sock: connect: permission denied

一行结论:docker.sock 这个 socket 文件属于 root:docker,你的用户既不是 root 也不在 docker 组。docker 是 C/S 架构:CLI 以你的用户身份去连 socket,daemon(通常 root 身份)那头验的不是镜像、不是仓库,就是「你有没有资格碰这个 socket」。

验证一下归属:

ls -l /var/run/docker.sock
# srw-rw---- 1 root docker 0 ... /var/run/docker.sock
#           ↑ 属主 root,属组 docker,其他人无权限(rwx 都没有)

修法:把用户加进 docker 组(一步)

sudo usermod -aG docker $USER
newgrp docker     # 当前终端立即生效,不用注销
docker ps         # 不加 sudo 试一下

newgrp 只对当前 shell 生效;彻底生效要注销重登(组信息在登录时加载,su - $USER 也行)。-a 参数千万别丢——不带 -a-G docker 会把你从其他所有组里移出去,sudo 组没了就锁死自己了。

三个常见的错误修法

1. chmod 777 /var/run/docker.sock

能跑,但等于把 daemon 的控制权发给机器上所有用户,而且 daemon 重启后 socket 重建、权限复原,问题「莫名复发」。别用。

2. 长期 sudo docker ...

能用但有两类代价:所有 docker 产物(volume 数据、build cache)默认落在 root 名下,之后不加 sudo 的脚本读不到;CI 脚本里到处 sudo 反而更难审计。

3. 改 socket 属主 chown $USER /var/run/docker.sock

和 777 同一性质——改的是系统组件的所有权,升级/重启后复原。

必须知道的安全代价:docker 组 ≈ root

加了 docker 组,等于拿到了免密 root 的等价权限

# 任何 docker 组用户都能这样拿到宿主机 root shell
docker run -v /:/host -it alpine chroot /host sh

所以:个人开发机加组没毛病;多用户生产服务器上,docker 组的授予要当成 sudo 权限一样走审批。更安全的替代:

  • rootless Docker:daemon 跑在你自己的用户下,socket 在 ~/.config/docker,无权限问题也无提权风险(代价:部分功能受限,如绑定 1024 以下端口需额外配置);
  • 精细授权:docker socket proxy(如 tecnativa/docker-socket-proxy)只放行白名单 API。

排查中容易混淆的相邻错误

| 报错 | 含义 | 方向 | |---|---|---| | permission denied ... docker.sock | socket 在,你无权访问 | 本篇 | | Cannot connect to the Docker daemon | socket 不存在 / daemon 没跑 | 守护进程篇 | | permission denied(pull 镜像时)| 仓库认证失败 | docker login,不是本篇 |

第三种最迷惑:报错里也有 permission denied,但发生在 docker pull 阶段,是** registry 私仓没登录**,和 socket 权限无关。

排查清单

  1. ls -l /var/run/docker.sock — 确认属组是 docker
  2. id — 输出里的组列表有 docker 吗?
  3. 没有 → sudo usermod -aG docker $USER && newgrp docker
  4. 加了组仍不行 → 注销重登(组信息登录时才刷新)
  5. 服务器场景 → 先读「安全代价」一节再决定是否加组
  6. 永远不用 chmod 777 / chown / 长期 sudo 这三个坑修法

本文由 ToolVault 工具匣 提供。相关工具:Dockerfile 生成器Linux 命令速查。相关阅读:Docker daemon 连不上排查SSH Permission denied (publickey) 排查。访问 首页 查看更多开发者工具。


广告