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

时间:2018-02-23 22:38:58

标签: docker docker-compose

我在我的机器上安装了Docker,我有Ubuntu操作系统。比我安装了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

我该如何解决这个问题?

28 个答案:

答案 0 :(得分:132)

升级后,我的权限被拒绝。 进行'mkb'post install steps的步骤没有任何改变,因为我的用户已经在'docker'组中了;我重试两次,但都没有成功。

经过一个小时的搜索,以下解决方案最终得以实现:

sudo chmod 666 /var/run/docker.sock

解决方案来自Olshansk

好像升级程序在没有docker组的足够权限的情况下重新创建了套接字。

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

1) SystemD 问题:仅使用所有者“ root”和组“ root”创建套接字。 您可以使用以下命令检查第一个问题:

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

如果这一切都很好,您应该看到“ root / docker”而不是“ 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

答案 1 :(得分:101)

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

  1. 创建泊坞组。

    $ sudo groupadd docker
    
  2. 将您的用户添加到泊坞窗组。

    $ sudo usermod -aG docker $USER
    
  3. 退出并再次登录并运行。

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

答案 2 :(得分:7)

  1. 将当前用户添加到docker
sudo usermod -aG docker $USER
  1. 更改docker socket的权限以能够连接 到docker daemon /var/run/docker.sock
sudo chmod 666 /var/run/docker.sock

答案 3 :(得分:7)

  1. 添加docker组
$ sudo groupadd docker
  1. 将当前用户添加到docker组
$ sudo usermod -aG docker $USER

3。切换到docker组的会话

$newgrp - docker
  1. 运行
$docker run hello-world

答案 4 :(得分:4)

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

sudo chmod 666 /var/run/docker.sock

这肯定会奏效。

答案 5 :(得分:3)

  

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

sudo chmod 666 /var/run/docker.sock

这解决了我的问题。

答案 6 :(得分:2)

使用此命令

sudo usermod -aG docker $USER

然后重新启动计算机,这对我有用。

答案 7 :(得分:2)

我们总是忘记 ACLs 。见setfacl


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

答案 8 :(得分:2)

这对我有用:

进入容器并修改文件的ACL

sudo usermod -aG docker $USER
sudo setfacl --modify user:$USER:rw /var/run/docker.sock

这是比使用 chmod 更好的解决方案。

答案 9 :(得分:1)

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

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

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

答案 10 :(得分:1)

我用 sudo 推荐试试这个推荐,没问题。sudo docker pull hello-worldsudo docker run hello-world

答案 11 :(得分: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

答案 12 :(得分:1)

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

如果问题仍然存在,请执行以下操作以解决此问题:

sudo chmod 666 /var/run/docker.sock

答案 13 :(得分:1)

此错误的魅力所在-

sudo chmod 666 /var/run/docker.sock

答案 14 :(得分: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

答案 15 :(得分: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 ~]$

答案 16 :(得分:0)

为了解决这个问题,我搜索了我的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

现在我不需要在我的命令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/

非常感谢!

答案 17 :(得分:0)

打开终端并输入此命令

sudo chmod 666 /var/run/docker.sock

答案 18 :(得分:0)

重启机器对我有用。

$ reboot

答案 19 :(得分:0)

我也遇到了类似的问题,但是我想要创建的容器需要将/var/run/docker.sock作为卷挂载(Portainer Agent),同时在不同的命名空间下运行它们。通常,容器并不关心容器从哪个名称空间开始的(这很重要),但是由于访问是从不同的名称空间进行的,因此必须加以规避。

在容器的运行命令中添加--userns=host可以使其使用正确的权限。

一个特定的用例,但是经过比我想承认的更多的研究时间,我只是认为如果其他人最终遇到这种情况,我应该与全世界分享它:)

答案 20 :(得分:0)

绝对不是问题所在,但由于它是在搜索错误消息时的第一个搜索结果,因此我将其保留在这里。

首先,使用以下命令检查docker服务是否正在运行:

systemctl status docker.service

如果它没有运行,请尝试启动它:

sudo systemctl start docker.service

...并再次检查状态:

systemctl status docker.service

如果尚未启动,请调查原因。可能是您修改了配置文件并出错(就像我在修改/etc/docker/daemon.json时所做的一样)

答案 21 :(得分:0)

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

答案 22 :(得分:0)

在 Linux 环境中,安装 dockerdocker-compose 后重启需要更好地工作 docker

$ reboot

重启docker

$ sudo systemctl restart docker

答案 23 :(得分:0)

Docker 守护进程绑定到 Unix 套接字而不是 TCP 端口。 默认情况下,Unix 套接字由用户 root 拥有,其他用户只能使用 sudo 访问它。 Docker 守护进程始终以 root 用户身份运行。

如果不想在 docker 命令前加上 sudo,请创建一个名为 docker 的 Unix 组并向其中添加用户。当 Docker 守护进程启动时,它会创建一个可供 docker 组成员访问的 Unix 套接字。

要创建 docker 组并添加您的用户:

  1. 创建 docker 组

     sudo groupadd docker
    
  2. 将您的用户添加到 docker 组

     sudo usermod -aG docker $USER
    
  3. 退出并重新登录,以便重新评估您的群组成员资格。

    如果在虚拟机上测试,可能需要重启虚拟机才能使更改生效。

    在 X Windows 等桌面 Linux 环境中,完全退出会话,然后重新登录。

    在 Linux 上,您还可以运行以下命令来激活对组的更改:

     newgrp docker 
    
  4. 验证您可以在没有 sudo 的情况下运行 docker 命令。下面的命令下载一个测试镜像并在容器中运行它。当容器运行时,它会打印一条信息性消息并退出

    docker run hello-world
    

如果您在将用户添加到 docker 组之前最初使用 sudo 运行 Docker CLI 命令,您可能会看到以下错误,这表明您的 ~/.docker/ 目录是使用不正确的权限创建的由于 sudo 命令。

   WARNING: Error loading config file: /home/user/.docker/config.json -
   stat /home/user/.docker/config.json: permission denied

要解决此问题,请删除 ~/.docker/ 目录(它会自动重新创建,但所有自定义设置都将丢失),或使用以下命令更改其所有权和权限:< /p>

sudo chown "$USER":"$USER" /home/"$USER"/.docker -R

sudo chmod g+rwx "$HOME/.docker" -R

可以在此处找到 linux 上 docker 的所有其他安装后步骤https://docs.docker.com/engine/install/linux-postinstall/

答案 24 :(得分:-1)

修复 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 777 /var/run/docker.sock

答案 25 :(得分:-2)

一个简单的技巧就是以“超级用户” 的身份执行。

要访问超级用户或root用户,请遵循:

user @ computer

$sudo su

输入密码后,您将位于 root @ computer

$docker run hello-world

答案 26 :(得分:-2)

chmod 0777 / home / huginn / mysql-data

这是我的解决方法。

答案 27 :(得分:-3)

sudo chmod 666 /var/run/docker.sock

这在我遇到错误甚至登录docker时对我有帮助 但是现在这在我的系统中可以正常工作。