解决Docker权限拒绝问题

解决Docker权限拒绝问题

技术背景

在Ubuntu机器上安装Docker后,当运行docker run hello-worlddocker-compose up等命令时,可能会遇到permission denied错误。这是因为Docker守护进程默认绑定到一个Unix套接字(通常是/var/run/docker.sock),该套接字由root用户拥有,其他用户只有使用sudo才能访问。

实现步骤

方法一:将用户添加到docker组

  1. 创建docker组(如果不存在)
1
sudo groupadd docker
  1. 将当前用户添加到docker组
1
sudo usermod -aG docker $USER
  1. 登录到新的docker组
1
newgrp docker
  1. 检查是否可以在不使用root权限的情况下运行Docker
1
docker run hello-world
  1. 如果仍然出错,重启系统
1
reboot

方法二:修改docker.sock的权限

1
sudo chmod 666 /var/run/docker.sock

但这种方法会带来安全风险,并且每次重启后权限会恢复,需要重新执行该命令。

方法三:修改docker.socket的组和权限

1
2
sudo chgrp docker /lib/systemd/system/docker.socket
sudo chmod g+w /lib/systemd/system/docker.socket

之后需要重启系统。

方法四:使用ACL

1
sudo setfacl -m user:$USER:rw /var/run/docker.sock

如果提示facl未找到,可使用sudo apt install acl进行安装。

方法五:更改docker.sock的所有权

1
sudo chown $USER /var/run/docker.sock

核心代码

将用户添加到docker组

1
2
3
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

修改docker.sock权限

1
sudo chmod 666 /var/run/docker.sock

使用ACL

1
sudo setfacl -m user:$USER:rw /var/run/docker.sock

最佳实践

  • 安全性优先:尽量避免使用chmod 666这种开放所有权限的方法,推荐将用户添加到docker组。
  • 检查配置:在修改权限或组之前,先检查当前的配置,如sudo ls -l /var/run/docker.sock
  • 重启服务:在修改配置后,尝试重启Docker服务sudo systemctl restart docker,而不是直接重启系统。

常见问题

重启系统后问题仍然存在

可能是因为系统启动时重新创建了docker.sock文件,权限又恢复了。可以考虑修改docker.socket的配置,使其在启动时使用正确的权限。

添加用户到docker组后仍然报错

可能需要重新登录或重启系统,让组的更改生效。也可以尝试使用newgrp docker切换到新的组。

使用ACL时提示错误

可能是系统未安装acl工具,使用sudo apt install acl进行安装。


解决Docker权限拒绝问题
https://119291.xyz/posts/2025-04-22.solve-docker-permission-denied-issue/
作者
ww
发布于
2025年4月23日
许可协议