根本原因是当前用户无权访问/var/run/docker.sock;推荐解法是将用户加入docker组:sudo usermod -ag docker $user,再执行newgrp docker或新开终端验证。
安装 docker engine 后运行 docker ps 或 docker run hello-world 报错 permission denied while trying to connect to the docker daemon socket,根本原因是当前用户无权访问 /var/run/docker.sock 这个通信通道。最稳妥、推荐的解法是把用户加入 docker 组,而不是频繁用 sudo 或暴力改权限。
把用户加入 docker 组(推荐)
这是官方文档明确推荐的方式,兼顾安全与便利:
- 确认
docker组是否存在:运行getent group docker,若无输出,先创建:sudo groupadd docker - 将当前用户加入该组:
sudo usermod -aG docker $USER - 让组权限立即生效(无需重启):
newgrp docker,或直接新开一个终端窗口 - 验证是否成功:
docker run --rm hello-world,能正常输出即表示已解决
检查 Docker 服务是否运行
权限正确但服务没启,也会报类似错误:
- 查看状态:
systemctl status docker - 如未运行,启用并启动:
sudo systemctl enable docker && sudo systemctl start docker - 部分系统还需启用 socket:
sudo systemctl enable docker.socket && sudo systemctl start docker.socket
避免不安全的临时方案
以下方法虽能“快速通过”,但存在明显隐患,不建议长期使用:
-
sudo docker ...:每次都要输密码,且绕过权限隔离,易误操作 -
sudo chmod 666 /var/run/docker.sock:开放所有用户读写,破坏最小权限原则,重启后失效或需重设 - 直接修改
docker.socket的SocketUser为当前用户:可能引发 systemd 权限冲突,维护成本高
其他可能干扰的因素
如果加组+启服务后仍失败,可顺次排查:
- SELinux(RHEL/CentOS):运行
sestatus,若为enforcing,临时设为permissive测试是否拦截:sudo setenforce 0 - AppArmor(Ubuntu):检查
dmesg | grep -i apparmor是否有拒绝日志 - 用户会话未刷新:即使执行了
usermod,旧终端仍沿用旧组信息,必须新开终端或运行newgrp docker - 多用户环境:确保你操作的是登录用户本身,而非通过
su切换的用户($USER可能不是实际登录者)











