如何修复docker:获得权限被拒绝的问题

Car*_*res 168 docker docker-compose

我在我的机器上安装了Docker,我有Ubuntu操作系统.比我安装了docker,当我跑

sudo docker run hello-world
Run Code Online (Sandbox Code Playgroud)

一切都没问题,但是我想隐藏这个词sudo以使命令更加简短.

如果我没有单词写命令 sudo

docker run hello-world
Run Code Online (Sandbox Code Playgroud)

这显示如下:

docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.35/containers/create: dial unix /var/run/docker.sock: connect: permission denied.See 'docker run --help'.
Run Code Online (Sandbox Code Playgroud)

当我尝试制作时,情况也是如此

docker-compose up
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

Gal*_*tor 260

升级后,我获得了拒绝许可.执行"mkb" 安装后步骤的步骤没有任何更改,因为我的用户已经在"docker"组中; 我重试了两次,没有成功.

在搜索时间之后,以下解决方案最终有效:

sudo chmod 666 /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)

解决方案来自Olshansk.

看起来升级已经没有足够的"docker"组权限重新创建套接字.

问题: 这个硬chmod打开安全漏洞,每次重启后,这个错误一次又一次地启动,你必须每次都重新执行上面的命令.我想要一劳永逸的解决方案.为此你有两个问题:

1)SystemD的问题:套接字只能由所有者"root"和"root"组创建.您可以使用此命令检查此第一个问题:

ls -l /lib/systemd/system/docker.socket
Run Code Online (Sandbox Code Playgroud)

如果每一个都很好,你应该看到'root/docker'不是'root/root'.

2)图形登录问题:https://superuser.com/questions/1348196/why-my-linux-account-only-belongs-to-one-group 您可以使用此命令检查第二个问题:

groups
Run Code Online (Sandbox Code Playgroud)

如果一切正确,您应该在列表中看到docker组.如果没有尝试该命令

sudo su $USER  -c groups
Run Code Online (Sandbox Code Playgroud)

如果你看到docker组,那是因为bug.

解决方案: 如果您设法获得图形登录的解决方法,则应该完成以下任务:

sudo chgrp docker /lib/systemd/system/docker.socket
sudo chmod g+w /lib/systemd/system/docker.socket
Run Code Online (Sandbox Code Playgroud)

但是如果你无法管理这个bug,那么一个不太糟糕的解决办法就是:

sudo chgrp $USER /lib/systemd/system/docker.socket
sudo chmod g+w /lib/systemd/system/docker.socket
Run Code Online (Sandbox Code Playgroud)

这项工作是因为您处于图形环境中,可能是计算机上唯一的用户.在这两种情况下你需要重启(或 sudo chmod 666 /var/run/docker.sock)

  • @Scott Stensland 我已经“按照文档”安装了 docker 很多次。我认为问题来自与另一个身份不明的包的不良交互。 (4认同)
  • 如果 docker 是按照 https://docs.docker.com/install/ 上的文档安装的,那么您永远不需要处理任何此类命令 (2认同)
  • 我在EC2-AWS上使用ubuntu 18并完美运行。所有其他人(sudo usermod -aG docker $ USER和其他东西)不起作用 (2认同)

小智 190

如果要以非root用户身份运行docker,则需要将其添加到docker组.

  1. 创建docker组.

    $ sudo groupadd docker
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将您的用户添加到docker组.

    $ sudo usermod -aG docker $USER
    
    Run Code Online (Sandbox Code Playgroud)
  3. 注销并再次登录并运行.

    $ docker run hello-world
    
    Run Code Online (Sandbox Code Playgroud)

取自docker官方文档:https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user

  • 我不得不重新启动Ubuntu 18才能工作 - 只需退出并重新登录就行不通了. (55认同)
  • 执行完所有三个步骤后,我仍然遇到此问题"( (54认同)
  • @heez可能不需要重新启动,重启docker对我来说已经足够了.`sudo systemctl restart docker` (15认同)
  • 重新启动docker对我不起作用,只有重新启动才起作用(Ubuntu 18.04) (8认同)
  • 谢谢.重新启动我的机器后,它对我有用 (7认同)
  • “newgrp docker”是我所缺少的。 (5认同)
  • 请注意,进入docker组实际上是授予root访问权限,而不执行常规的sudo策略和审核。有关详细信息和讨论,请参见GitHub [issue#9976](https://github.com/docker/docker/issues/9976)。 (3认同)
  • 它无需重新启动即可为我工作,但我必须重新启动docker并将用户切换到同一用户以刷新登录名。“ sudo systemctl restart docker”,然后“ su-{您的用户名}” (3认同)
  • @heez:`su-$ USER`可用于避免注销/按照[此问题](https://superuser.com/a/354475/173159)登录。 (2认同)
  • 另外`docker.help`命令建议执行`newgrp docker`,此后我不需要重新启动docker服务和计算机重新启动,更改后生效 (2认同)

tsv*_*iko 32

如果创建 docker 组并将用户添加到其中不起作用(最佳解决方案,如前面的答案中所述),那么这是第二好的替代方案:

sudo chown $USER /var/run/docker.sock 
Run Code Online (Sandbox Code Playgroud)

它的作用是将文件的所有权更改docker.sock为您的用户。

注意:使用 是一个非常糟糕的做法chmod 666,因为它授予几乎每个人访问和修改docker.sock文件的权限。


小智 22

只需要更改sock文件的权限即可。

sudo chmod 666 /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)

这肯定会起作用。

  • 这将打开一个安全漏洞,并且需要在每次重新启动后重做。 (16认同)

小智 21

  1. 添加码头工人组
$ sudo groupadd docker
Run Code Online (Sandbox Code Playgroud)
  1. 将当前用户添加到Docker组
$ sudo usermod -aG docker $USER
Run Code Online (Sandbox Code Playgroud)

3.将会话切换到Docker组

$newgrp - docker
Run Code Online (Sandbox Code Playgroud)
$docker run hello-world
Run Code Online (Sandbox Code Playgroud)

  • newgrp命令避免了我注销/重新启动,谢谢! (5认同)

Md.*_*sen 15

修复 Docker 问题:(权限被拒绝)

  • 如果docker组不存在则创建:sudo groupadd docker
  • 查看可用系统中的超级用户数量:grep -Po '^sudo.+:\K.*$' /etc/group
  • 在 Linux 命令 shell 中导出用户:export USER=demoUser
  • 将用户添加到 docker 组:sudo usermod -aG docker $USER
  • 运行以下命令/登录或注销:newgrp docker
  • 检查docker是否运行正常:docker run hello-world
  • 如果仍然出现错误,请重新启动:reboot

如果不起作用,请运行以下命令:

sudo chmod 660 /var/run/docker.sock

  • 不应该盲目使用`777` (9认同)
  • 如果 660 不起作用,您可能需要`sudo chgrp docker /var/run/docker.sock`,但请停止盲目地延续让 docker 访问世界的疯狂概念。这并不是像 @AkshayHegde 所说的那样,任何人都可以对“这些文件”做任何事情,而是任何人一旦控制了 docker 套接字,就可以对您的整个系统做任何事情 (2认同)

小智 14

您可以随时尝试https://docs.docker.com/install/linux/linux-postinstall/ docs 中的Manage Docker as a non-root user段落。

执行此操作后,如果问题仍然存在,则可以运行以下命令来解决它:

sudo chmod 666 /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)

  • 让每个人都可以读取或写入 docker 套接字(使用“chmod 666”)是一场安全灾难……永远不建议这样做。 (5认同)
  • 任何可以与 docker 套接字通信的人实际上都是主机系统上的“root”!例如,请参阅:https://fosterelli.co/privilege-escalation-via-docker 以及有关 docker 权限升级的许多其他资源。使套接字世界有效地可写赋予所有 UNIX 用户“root”权限。 (2认同)

0x3*_*bfc 13

  1. 将当前用户添加到docker
sudo usermod -aG docker $USER
Run Code Online (Sandbox Code Playgroud)
  1. 更改Docker套接字的权限以能够连接到Docker守护程序 /var/run/docker.sock
sudo chmod 666 /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)

  • 绝对不!永远不要给世界许可!docker套接字的权限应该是660,只要你的用户在`docker`组中,就可以了。 (3认同)
  • 这个解决方案对我来说适用于这个问题docker:尝试连接到位于unix:///var/run/docker.sock的Docker守护进程套接字时获得权限被拒绝:发布http://%2Fvar%2Frun%2Fdocker.sock/ v1.40/containers/create:拨打 unix /var/run/docker.sock:连接:权限被拒绝。 (2认同)

Car*_*res 10

为了解决这个问题,我搜索了我的 docker 和 docker-compose 安装在哪里。就我而言,docker/usr/bin/docker安装docker-compose/usr/local/bin/docker-compose路径中。然后,我在终端中写下:

到码头工人:

sudo chmod +x /usr/bin/docker
Run Code Online (Sandbox Code Playgroud)

docker-compose

sudo chmod +x /usr/local/bin/docker-compose
Run Code Online (Sandbox Code Playgroud)

现在我不需要在命令中写入 docker 这个词sudo

/******************************************************** **********************/

勘误表:

@mkasberg 评论了这个问题的最佳解决方案。我引用评论:

That might work, you might run into issues down the road. Also, it's a security vulnerability. You'd be better off just adding yourself to the docker group, as the docs say. sudo groupadd docker, sudo usermod -aG docker $USER. Docs: https://docs.docker.com/install/linux/linux-postinstall/

  • 这可能有效,但您可能会遇到问题。此外,这也是一个安全漏洞。正如文档所说,您最好将自己添加到“docker”组中。`sudo groupadd docker`、`sudo usermod -aG docker $USER`。 (2认同)

Qin*_*ang 10

在尝试连接到 unix:///var/run/docker.sock 上的 Docker 守护进程套接字时获得权限被拒绝:获取http://%2Fvar%2Frun%2Fdocker.sock/v1.40/images/json:拨号 unix /var/run/docker.sock: 连接:权限被拒绝

sudo chmod 666 /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题。

  • 绝对不!永远不要给世界许可!docker套接字的权限应该是660,只要你的用户在`docker`组中,就可以了。 (2认同)

San*_*noj 9

我用以下命令解决此错误:

$ sudo chmod 666 /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)

  • 绝对不!永远不要给世界许可!docker套接字的权限应该是660,只要你的用户在`docker`组中,就可以了。 (2认同)

ara*_*ran 9

我们总是忘记ACLs。见setfacl


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

  • 如果它抱怨找不到 facl,请使用 `sudo apt install acl` 安装 (2认同)

jmu*_*sch 8

ubuntu 21.04 systemd 套接字所有权

让我先说一下,在本地开发过程中,这是一个非常适合我的解决方案,我来这里寻找,ubuntu docker permission error所以我将其留在这里。

我不拥有 unix 套接字,所以我放弃了它。

sudo chown $(whoami):$(whoami) /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)

对于您的开发环境来说,另一个更持久的解决方案是修改 unix 套接字创建的用户所有权。这将为您的用户提供所有权,因此它将在重新启动之间保留:

sudo nano /etc/systemd/system/sockets.target.wants/docker.socket
Run Code Online (Sandbox Code Playgroud)

docker.socket:

[Unit]
Description=Docker Socket for the API

[Socket]
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=YOUR_USERNAME_HERE
SocketGroup=docker

[Install]
WantedBy=sockets.target
Run Code Online (Sandbox Code Playgroud)

  • 这是一个与其他解决方案完全不同的解决方案。 (2认同)