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


299

我在装有Ubuntu OS的计算机上安装了Docker。安装完docker之后,当我运行时

sudo docker run hello-world

没关系,但是我想隐藏单词sudo以使命令更短。

如果我写的命令没有这个词 sudo

docker run hello-world

显示以下内容:

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'.

当我尝试制作时也是如此

docker-compose up

我该如何解决?



Answers:


434

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

  1. 如果不存在则创建docker组
$ sudo groupadd docker
  1. 将您的用户添加到docker组。
$ sudo usermod -aG docker $USER
  1. 运行以下命令或注销并再次登录并运行(这不起作用,您可能需要先重新引导计算机)
$ newgrp docker
  1. 检查docker是否可以在没有root的情况下运行
$ docker run hello-world

摘自Docker官方文档: manager-docker-as-a-non-root-user


70
执行所有三个步骤后,我仍然遇到这个问题”(
Anand

78
我必须在Ubuntu 18上重新启动才能正常工作-仅注销并重新登录无法正常工作。
heez

26
@heez可能不需要重新启动,对我来说,重新启动docker就足够了。 sudo systemctl restart docker
拉特尔

5
请注意,进入该docker组实质上是授予root访问权限,而不执行常规的sudo策略和审核。有关详细信息和讨论,请参见GitHub 问题#9976
raehik

13
重新启动docker对我不起作用,只有重新启动才有效(Ubuntu 18.04)
Joakim Tall

359

升级后,我获得了拒绝的权限。执行“ mkb” 安装后步骤的步骤没有任何更改,因为我的用户已经在“ docker”组中;我重试两次,但均未成功。

经过一个小时的搜索,以下解决方案最终生效了:

sudo chmod 666 /var/run/docker.sock

解决方案来自奥尔尚斯克

看起来升级没有权限为docker组重新创建了套接字。

问题

此硬chmod会打开安全漏洞,并且在每次重新启动后,都会一次又一次地出现此错误,您每次都必须重新执行上述命令。我想要一劳永逸的解决方案。为此,您有两个问题:

  • 1)问题SystemD:仅使用所有者“ root”和组“ root”创建套接字。

    您可以使用以下命令检查第一个问题:

    ls -l /lib/systemd/system/docker.socket
    

    如果这一切都很好,您应该看到' root/docker'not' root/root'。

  • 2)图形登录问题https : //superuser.com/questions/1348196/why-my-linux-account-only-belongs-to-one-group

    您可以使用以下命令检查第二个问题:

    groups
    

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

    sudo su $USER  -c groups
    

    如果您看到docker组,则是因为该错误。

解决方案

如果您设法获得图形登录的解决方法,则应该执行以下操作:

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

但是,如果您无法管理此错误,则可能是一个不错的解决方案:

sudo chgrp $USER /lib/systemd/system/docker.socket
sudo chmod g+w /lib/systemd/system/docker.socket

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


2
如果docker是根据docs.docker.com/install上的文档安装的, 则您无需处理任何此类命令
Scott Stensland

4
@Scott Stensland我已经按照doc多次安装了docker。我认为问题出在与另一个身份不明的软件包之间的不良互动。
Galigator

1
在docker-in-docker中,我错误地从主机:ro上挂载了/var/run/docker.sock,而没有在末尾...只要我补充说我很好就可以了
jakebrinkmann

2
我在EC2-AWS上使用ubuntu 18并完美运行。所有其他(sudo usermod -aG docker $ USER和其他东西)均不起作用
cherah30

1
谢谢,它已在Ubuntu 18.04 LTS中修复。重塑并添加到
地块中

32
  1. 添加码头工人组
$ sudo groupadd docker
  1. 将您当前的用户添加到Docker组
$ sudo usermod -aG docker $USER
  1. 将会话切换到Docker组
$ newgrp - docker
  1. 运行示例进行测试
$ docker run hello-world

newgrp命令提示输入密码,并且不接受我的用户密码。而是su - $USER设法避免注销/登录。
bluenote10

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

15

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

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



2

为了解决该问题,我搜索了docker和docker-compose的安装位置。就我而言,docker已安装在/usr/bin/dockerdocker-compose已安装在/usr/local/bin/docker-compose路径。然后,我在终端中编写以下代码:

到码头工人:

sudo chmod +x /usr/bin/docker

docker-compose

sudo chmod +x /usr/local/bin/docker-compose

现在,我不需要在命令泊坞窗中写上单词 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/

非常感谢!


2
那可能行得通,您可能会遇到很多问题。另外,这是一个安全漏洞。docker如文档所述,最好将自己添加到该组中。sudo groupadd dockersudo usermod -aG docker $USER
mkasberg

嘿@mkasberg!谢谢你的评论!我做了一个勘误表,引用了您的解决方案。非常感谢!
卡洛斯·安德列斯

1

lightdm和kwallet带有一个似乎在登录时未通过补充组的错误。为了解决这个问题,我还sudo usermod -aG docker $USER必须在旁边注释掉

auth optional pam_kwallet.so
auth optional pam_kwallet5.so

#auth optional pam_kwallet.so
#auth optional pam_kwallet5.so

/etc/pam.d/lightdm 重新启动之前,使docker-group实际生效。

错误:https//bugs.launchpad.net/lightdm/+bug/1781418以及此处:https//bugzilla.redhat.com/show_bug.cgi?id = 1581495



1

认真的家伙。不要在您的组中添加Docker或修改套接字posix(无需强化SELinux),这是制作root privesc的一种简单方法。只要在您的.bashrc中添加一个别名,它就更简单,更安全了:alias dc ='sudo docker'。


1

您可以按照以下步骤操作,这将为您工作:

  1. 创建一个码头工人组 sudo groupadd docker
  2. 将您的用户添加到该组 sudo usermod -aG docker $USER
  3. 列出组以确保通过运行此命令成功创建docker组 groups
  4. 还运行以下命令来更改docker组的会话 newgrp docker
  5. 更改文件docker.sock的组所有权sudo chown root:docker /var/run/docker.sock
  6. 更改.docker目录的所有权 sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
  7. 最后 sudo chmod g+rwx "$HOME/.docker" -R

测试之后,您可以运行 docker ps -a


我想要一个不需要重启的答案。这是唯一的答案。“技巧”是指向chowndocker.sock文件的。
Potherca

1

在安装docker,创建'docker'组并将其添加用户之后,编辑docker服务单元文件:

sudo nano /usr/lib/systemd/system/docker.service

在[服务]部分中添加两行:

SupplementaryGroups=docker    
ExecStartPost=/bin/chmod 666 /var/run/docker.sock

保存文件(Ctrl-X,y,Enter)

运行并启用Docker服务:

sudo systemctl daemon-reload
sudo systemctl start docker
sudo systemctl enable docker

0

在Centos上安装Docker之后。在以下命令下运行时,出现以下错误。

[centos@aiops-dev-cassandra3 ~]$ docker run hello-world
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.soc k/v1.40/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.

更改docker.socket的组和权限

[centos@aiops-dev-cassandra3 ~]$ ls -l /lib/systemd/system/docker.socket
-rw-r--r--. 1 root root 197 Nov 13 07:25 /lib/systemd/system/docker.socket
[centos@aiops-dev-cassandra3 ~]$ sudo chgrp docker /lib/systemd/system/docker.socket
[centos@aiops-dev-cassandra3 ~]$ sudo chmod 666 /var/run/docker.sock
[centos@aiops-dev-cassandra3 ~]$ ls -lrth /var/run/docker.sock
srw-rw-rw-. 1 root docker 0 Nov 20 11:59 /var/run/docker.sock
[centos@aiops-dev-cassandra3 ~]$

使用以下docker命令进行验证

[centos@aiops-dev-cassandra3 ~]$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

[centos@aiops-dev-cassandra3 ~]$

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.