如何修复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

我该如何解决这个问题?

882171 次浏览

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

到docker:

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/

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

  1. 如果docker组不存在,请创建该组
$ sudo groupadd docker
  1. 将您的用户添加到docker组。
$ sudo usermod -aG docker $USER
  1. 登录到新的docker组(以避免必须注销/重新登录;但如果不够,请尝试重新启动):
$ newgrp docker
  1. 检查docker是否可以在没有root的情况下运行
$ docker run hello-world

如果仍有错误,请重新启动

$ reboot

警告

docker组授予与root用户等效的权限。有关这如何影响系统安全性的详细信息,请参阅Docker守护程序攻击表面。

摘自docker官方留档:管理-docker-as-a-non-root-user

升级后,我的权限被拒绝了。执行'mkb'安装后步骤的步骤不会改变任何东西,因为我的用户已经在'docker'组中;我重试了两次都没有成功。

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

sudo chmod 666 /var/run/docker.sock

解决方案来自奥尔尚斯克

看起来升级重新创建了套接字,而没有为“docker”组提供足够的权限。

问题

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

  • 1)问题:#0:套接字将仅使用所有者'root'和组'root'创建。

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

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

    如果每个this都很好,你应该看到'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组,那是因为bug。

解决方案

如果您设法获得图形登录的解决方法,这应该完成工作:

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

但是如果你不能管理这个bug,一个不那么糟糕的解决方案可能是这样的:

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

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

Lightdm和k钱包带有bug,似乎无法在登录时通过补充组。为了解决这个问题,我还在sudo usermod -aG docker $USER旁边,不得不注释掉

auth optional pam_kwallet.soauth optional pam_kwallet5.so

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

/etc/pam.d/lightdm重新启动之前中,对于docker-group实际有效。

bug:https://bugs.launchpad.net/lightdm/+bug/1781418,这里:https://bugzilla.redhat.com/show_bug.cgi?id=1581495

  1. 将当前用户添加到docker
sudo usermod -aG docker $USER
  1. 更改docker套接字的权限以便能够连接到docker守护进程/var/run/docker.sock
sudo chmod 666 /var/run/docker.sock
  1. 添加docker组
$ sudo groupadd docker
  1. 将当前用户添加到docker组
$ sudo usermod -aG docker $USER
  1. 会话切换到docker组
$ newgrp - docker
  1. 运行一个示例来测试
$ docker run hello-world

使用此命令

sudo usermod -aG docker $USER

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

我使用命令解决此错误:

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

尝试连接到Unix的Docker守护进程套接字时权限被拒绝://var/run/docker.sock:获取超文本传输协议://%2Fvar%2Frun%2Fdocker.sock/v1.40/images/json:拨号unix /var/run/docker.sock:连接:权限被拒绝

sudo chmod 666 /var/run/docker.sock

这解决了我的问题。

说真的,伙计们。不要在你的组中添加Docker或修改套接字位置(没有强化的SELinux),这是一个简单的方法来创建根隐私c。只需在你的. bashrc中添加一个别名,它更简单更安全:alias dc='sudo docker'。

sudo chmod 666 /var/run/docker.sock

这帮助我,而我得到错误甚至登录到Docker但现在这在我的系统中完全正常。

在Centos上安装Docker后。在运行以下命令时,我遇到了以下错误。

[centos@aiops-dev-cassandra3 ~]$ docker run hello-worlddocker: 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.socksrw-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-worldUnable to find image 'hello-world:latest' locallylatest: Pulling from library/hello-world1b930d010525: Pull completeDigest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5fStatus: 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 theexecutable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client, which sent itto 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 ~]$

你总是可以尝试https://docs.docker.com/install/linux/linux-postinstall/文档中的Manage Docker as a non-root user段落。

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

sudo chmod 666 /var/run/docker.sock

你可以遵循这些步骤,这将为你工作:

  1. 创建docker组sudo groupadd docker
  2. 将您的用户添加到此组sudo usermod -aG docker $USER
  3. 列出组以确保通过运行此命令groups成功创建docker组
  4. 还运行以下命令以更改docker groupnewgrp docker的会话
  5. 更改文件docker.socksudo 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

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

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

在[Service]部分添加两行:

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

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

运行并启用Docker服务:

sudo systemctl daemon-reloadsudo systemctl start dockersudo systemctl enable docker

只需打开终端并输入此命令

sudo chmod 666 /var/run/docker.sock

重启机器对我有用。

$ reboot

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

--userns=host添加到容器的run命令使其能够使用获得正确的权限。

相当具体的用例,但经过更多的研究时间比我想承认我只是想我应该与世界分享,如果别人最终在这种情况下:)

一个简单的hack是作为“超级用户”执行。

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

user@computer

$sudo su

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

$docker run hello-world

这绝对不是问题的情况,但由于它是谷歌搜索错误消息时的第一个搜索结果,我将把它留在这里。

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

systemctl status docker.service

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

sudo systemctl start docker.service

…并再次检查状态:

systemctl status docker.service

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

它只需要更改袜子文件的权限。

sudo chmod 666 /var/run/docker.sock

这肯定会奏效。

这项工作对我来说:

进入容器并修改文件的ACL

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

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

我们总是忘记ACLs。见setfacl


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

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. 注销并重新登录,以便重新评估您的组成员身份。

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

    在桌面Linux环境(如X Windows)上,完全注销会话,然后重新登录。

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

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

    docker run hello-world

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

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

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

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/

我用sudo推荐尝试这个推荐,还可以。sudo docker pull hello-worldsudo docker run hello-world

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

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

如果它不起作用,请运行此命令:

sudo chmod 660 /var/run/docker.sock

最直接的解决方案是输入

sudo chmod 666 /var/run/docker.sock然而,这种方法会破坏任何可能存在的系统安全性,并向所有人开放Docker套接字。如果你能接受这一点——例如:你机器的唯一用户——那么就使用它。

然而,每次引导机器时都需要它,您可以通过添加

start on startuptaskexec chmod 666 /var/run/docker.sock

/etc/init/docker-chmod.conf文件。

ubuntu 21.04 system d套接字所有权

让我前言,这对我来说是一个非常合适的解决方案,在本地开发期间,我在这里寻找ubuntu docker permission error,所以我就把它留在这里。

我没有Unix套接字,所以我选择了它。

sudo chown $(whoami):$(whoami) /var/run/docker.sock

您的开发环境的另一个更持久的解决方案是修改unix套接字创建的用户所有权。这将赋予您的用户所有权,因此它将在重新启动之间坚持:

sudo nano /etc/systemd/system/sockets.target.wants/docker.socket

docker.socket:

[Unit]Description=Docker Socket for the API
[Socket]ListenStream=/var/run/docker.sockSocketMode=0660SocketUser=YOUR_USERNAME_HERESocketGroup=docker
[Install]WantedBy=sockets.target

在Linux环境中,安装dockerdocker-compose后需要重新启动,以更好地避免此问题。

$ sudo systemctl restart docker

我尝试了所有描述的方法,但没有任何帮助可以解决问题。解决方案是在运行selenoid和selenoid-用户界面时使用--use驱动程序参数。下面是我的Dockerfile的完整列表。

FROM selenoid/chromeUSER rootRUN apt-get updateRUN apt-get -y install docker.ioRUN curl -s https://aerokube.com/cm/bash | bashRUN ./cm selenoid start --vnc --use-driversRUN ./cm selenoid-ui start --use-driversEXPOSE 4444 8080CMD ["-conf", "/etc/selenoid/browsers.json", "-video-output-dir", "/opt/selenoid/video/"]

在我的例子中,尝试运行docker命令的过程本身(CI服务器代理)无法运行它,但是当我尝试从同一个用户中运行相同的命令时,它起作用了。

重新启动运行CI服务器代理的守护进程解决了这个问题。

之前在代理中命令不起作用的原因是因为代理在我安装docker并授予docker组权限之前就已经运行了,并且代理进程使用了缓存的旧权限并且失败了。重新启动进程会丢弃缓存并使事情解决。

如果创建docker组并将您的用户添加到其中不起作用(最好的解决方案,在前面的答案中描述),那么这个是第二好的选择:

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

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

注意:使用chmod 666是一个非常糟糕的做法,因为它实际上为每个人提供了访问和修改docker.sock文件的权限。