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

Posted

技术标签:

【中文标题】如何修复 docker:获得权限被拒绝问题【英文标题】:How to fix docker: Got permission denied issue 【发布时间】:2018-08-04 01:28:22 【问题描述】:

我在装有 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

我该如何解决这个问题?

【问题讨论】:

Running docker without sudo on Ubuntu 14.04的可能重复 docs.docker.com/install/linux/linux-postinstall/… 在 docker 组中添加用户并分配权限 这能回答你的问题吗? docker.sock permission denied 这能回答你的问题吗? Docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock 【参考方案1】:

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

    如果 docker 组不存在,则创建它
$ sudo groupadd docker
    将您的用户添加到 docker 组。
$ sudo usermod -aG docker $USER
    运行以下命令或注销并再次登录并运行(这不起作用,您可能需要先重新启动计算机)
$ newgrp docker

    检查 docker 是否可以在没有 root 的情况下运行
$ docker run hello-world

如果仍然出现错误则重新启动

$ reboot

警告

docker 组授予与 root 用户等效的权限。有关这如何影响系统安全性的详细信息,请参阅Docker Daemon Attack Surface.。

取自 docker 官方文档: manage-docker-as-a-non-root-user

【讨论】:

执行完所有三个步骤后我仍然有这个问题"( 我必须在 Ubuntu 18 上重新启动才能正常工作——简单地注销并重新登录是行不通的。 @heez 可能不需要重新启动,重新启动 docker 对我来说就足够了。 sudo systemctl restart docker 请注意,在docker 组中基本上授予root 访问权限,而无需执行常规的sudo 策略和审核。有关详细信息和讨论,请参阅 GitHub issue #9976。 重新启动 docker 对我不起作用,只有重新启动(Ubuntu 18.04)【参考方案2】:

升级后,我的权限被拒绝。 执行“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

【讨论】:

如果 docker 是按照docs.docker.com/install 上的文档安装的,那么您永远不需要处理任何此类命令 @Scott Stensland 我已经多次安装 docker '根据文档'。我认为问题来自与另一个身份不明的包的不良交互。 在 docker-in-docker 中,我错误地从主机挂载 /var/run/docker.sock,而最后没有 :ro...只要我补充说我很好去 我在 EC2 - AWS 上使用 ubuntu 18 并且运行良好。所有其他(sudo usermod -aG docker $ USER 和其他东西)都不起作用 谢谢,它已在 Ubuntu 18.04 LTS 中修复。重述和添加到地面没有【参考方案3】:
    添加泊坞窗组
$ sudo groupadd docker
    将当前用户添加到 docker 组
$ sudo usermod -aG docker $USER
    将会话切换到 docker 组
$ newgrp - docker
    运行示例进行测试
$ docker run hello-world

【讨论】:

newgrp 命令提示输入密码,但不接受我的用户密码。相反,su - $USER 努力避免注销/登录。【参考方案4】:
    将当前用户添加到docker
sudo usermod -aG docker $USER
    更改 docker socket 的权限,使其能够连接 到 docker 守护进程/var/run/docker.sock
sudo chmod 666 /var/run/docker.sock

【讨论】:

您的解决方案适用于该问题:获取权限被拒绝,谢谢 这个解决方案为我解决了这个问题 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.40/containers/create:拨打unix /var/run/docker.sock:连接:权限被拒绝。【参考方案5】:

我用命令解决了这个错误:

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

【讨论】:

我正在使用 ubuntu 18.04 lts 服务器,我使用了这个命令,重新启动,但仍然出现错误:( 每次启动机器时都需要再次运行它,如果您希望它在启动时自动运行,请按照以下步骤操作:***.com/a/69269302/14043328【参考方案6】:

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

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

sudo chmod 666 /var/run/docker.sock

【讨论】:

使 docker 套接字对所有人(使用chmod 666)都可读或可写是一场安全灾难......永远不建议这样做。 @AaylaSecura 感谢您的提醒,但您能否简要解释一下为什么可读或可写套接字是灾难? 任何可以与 docker 套接字对话的人实际上是主机系统上的root!例如:fosterelli.co/privilege-escalation-via-docker 和许多其他关于 docker 权限提升的资源。使套接字世界可写有效地赋予所有 UNIX 用户root 特权。 不要分配666 权限。 660640 应该绰绰有余。【参考方案7】:

在尝试连接到 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

这解决了我的问题。

【讨论】:

【参考方案8】:

我们总是忘记ACLs。见setfacl


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

【讨论】:

如果它抱怨没有找到facl,请使用sudo apt install acl安装 我收到“setfacl: Option -m: Invalid argument near character 6”这个错误。【参考方案9】:

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

【讨论】:

不应盲目使用777 @Akshay Hedge 为什么?我使用了777 选项,它起作用了? @PurushothamanSrikanth 777 意味着任何人都可以对这些文件做任何事情 不要使用777!使用660640【参考方案10】:

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

sudo chmod 666 /var/run/docker.sock

这肯定会奏效。

【讨论】:

这会打开一个安全漏洞,需要在每次重启后重做。【参考方案11】:

为了解决这个问题,我搜索了我的 docker 和 docker-compose 安装在哪里。在我的例子中,docker 安装在 /usr/bin/docker 中,docker-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/

【讨论】:

这可能行得通,您可能会遇到问题。此外,这是一个安全漏洞。正如文档所说,您最好将自己添加到docker 组中。 sudo groupadd docker, sudo usermod -aG docker $USER. 嘿@mkasberg!谢谢你的评论!我做了一个勘误表来引用你的解决方案。非常感谢!【参考方案12】:

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

【讨论】:

也许你可以谈谈:podman.io。但是以 root 运行似乎是开发人员的用例。【参考方案13】:

重启机器对我有用。

$ reboot

【讨论】:

【参考方案14】:

这对我有用:

进入容器并修改文件的 ACL

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

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

【讨论】:

【参考方案15】:

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

【讨论】:

【参考方案16】:

使用这个命令

sudo usermod -aG docker $USER

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

【讨论】:

【参考方案17】:

您可以按照以下步骤操作,这对您有用:

    创建一个docker组sudo groupadd docker 将您的用户添加到此组sudo usermod -aG docker $USER 列出组以确保通过运行此命令成功创建 docker 组groups 运行以下命令也可以更改 docker 组 newgrp docker 的会话 更改文件 docker.socksudo chown root:docker /var/run/docker.sock 的组所有权 更改 .docker 目录的所有权sudo chown "$USER":"$USER" /home/"$USER"/.docker -R 终于sudo chmod g+rwx "$HOME/.docker" -R

测试后你可以运行docker ps -a

【讨论】:

我想要一个不需要重启的答案。这是提供这一点的唯一答案。 “诀窍”是chown docker.sock 文件。【参考方案18】:

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

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

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

    创建 docker 组

     sudo groupadd docker
    

    将您的用户添加到 docker 组

     sudo usermod -aG docker $USER
    

    退出并重新登录,以便重新评估您的群组成员资格。

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

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

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

     newgrp docker 
    

    验证您是否可以在不使用 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/ 目录(它会自动重新创建,但所有自定义设置都会丢失),或者使用以下命令更改其所有权和权限:

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/

【讨论】:

【参考方案19】:

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

【讨论】:

【参考方案20】:

最直接的解决方案是输入

sudo chmod 666 /var/run/docker.sock 每次启动机器时。但是,这种方法会破坏任何可能存在的系统安全性,并向所有人开放 Docker 套接字。如果您可以接受 - 例如:您机器的唯一用户 - 然后使用它。

尽管如此,每次启动机器时都需要它,您可以通过添加使其在启动时运行

start on startup
task
exec chmod 666 /var/run/docker.sock

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

【讨论】:

666 是权限过多。 660640 应该绰绰有余【参考方案21】:

在 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 ~]$

【讨论】:

【参考方案22】:

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

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

在 [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

【讨论】:

【参考方案23】:

我也遇到了类似的问题,但是我想要创建的容器需要将 /var/run/docker.sock 挂载为卷(Portainer 代理),同时在不同的命名空间下运行它。通常一个容器不关心它是从哪个命名空间开始的——这就是重点——但由于访问是从不同的命名空间进行的,所以必须避免这一点。

在容器的运行命令中添加--userns=host 使其能够使用获得正确的权限。

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

【讨论】:

【参考方案24】:

问题肯定不是这样,但由于它是谷歌搜索错误消息时的第一个搜索结果,所以我将其留在这里。

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

systemctl status docker.service

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

sudo systemctl start docker.service

...并再次检查状态:

systemctl status docker.service

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

【讨论】:

【参考方案25】:

在 Linux 环境下,安装 dockerdocker-compose 后需要重新启动才能更好地工作 docker

$ reboot

重新启动泊坞窗

$ sudo systemctl restart docker

【讨论】:

【参考方案26】:

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

sudo chmod 666 /var/run/docker.sock

【讨论】:

这会破坏任何可能存在的系统安全性,并向所有人开放 Docker 套接字。【参考方案27】:

sudo chmod 666 /var/run/docker.sock

这在我登录 docker 时遇到错误时帮助了我 但现在这在我的系统中运行良好。

【讨论】:

这种方式非常不安全。查看主要问题中在 cmets 上提供的安装后说明。【参考方案28】:

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

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

user@computer

$sudo su

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

$docker run hello-world

【讨论】:

以上是关于如何修复 docker:获得权限被拒绝问题的主要内容,如果未能解决你的问题,请参考以下文章

Docker:尝试在 unix:///var/run/docker.sock 连接到 Docker 守护程序套接字时获得权限被拒绝

如何修复 ngrok 权限被拒绝?

如何修复“权限被拒绝”? [复制]

如何修复错误:无法打开 laravel.log 权限被拒绝?

如何修复错误:mkdir():运行作曲家时权限被拒绝

如何修复以下 Django 错误:“类型:IOError”“值:[Errno 13] 权限被拒绝”