马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一、这条报错到底在说什么
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企服评测-应用市场 编辑提示
|