docker.sock权限被拒绝


73

当我尝试运行简单的docker命令时,例如:

$ docker ps -a

我收到一条错误消息:

得到的权限被拒绝... /var/run/docker.sock:connect:权限被拒绝

当我检查权限

$ ls -al /var/run/

我看到这一行:

srw-rw---- root docker docker.sock

因此,我遵循许多论坛的建议并将本地用户添加到docker组:

$ sudo usermod -aG docker $USER

但这无济于事。我仍然收到非常相同的错误消息。我该如何解决?


2
进行更改后,您是否重新登录?该更改在同一会话中不可用。还能sudo docker ps为您工作吗?
塔伦·拉尔瓦尼

我打开一个新终端,仍然收到这些错误消息。
雅各

sudo docker ps作品。但是我需要在本地用户下使用docker。
Jacobian '18年

您必须重新启动docker守护程序,否则它将不允许
docker

2
更改用户/组后,您必须重新登录,而不仅仅是打开新终端。
Sergius

Answers:


154

对于那些不熟悉Shell的人,命令:

$ sudo usermod -aG docker $USER

需要$USER在您的外壳中定义。默认情况下通常位于此位置,但是在某些外壳程序中可能需要将其值设置为登录ID。


更改用户组不会更改用户已打开的现有登录名,终端和外壳。为了避免再次执行登录,您可以简单地运行:

$ newgrp docker

以访问您当前shell中的该组。


完成此操作后,用户将在服务器上有效地具有root用户访问权限,因此仅对受不受限制的sudo访问权限信任的用户执行此操作。


这对我不起作用,但是我正在使用名称空间。我不得不用--userns=host
Mr00Anderson

我尝试了该线程中的所有其他技巧,跟随了文档,将Docker重新安装到了较新的版本,重新启动了很多次,一切都在想着。我确实在docker组中,但是默认的shell无法识别它(可能是我的.profile中的脚本有问题吗?)。除了向root用户求助以外,仅该newgrp命令有效。
布鲁诺·拉特纳

3
@BrunoLaturner如果您在Ubuntu上,我听说过LightDM会导致问题,该问题导致它从登录用户中删除辅助组。
BMitch

2
@BMitch你在美国国家安全局监视我吗?那是我的确切配置和错误。谢谢!解决了askubuntu.com/q/1057258/259660
Bruno Laturner

RHEL7和Fedora 30的相关Red Hat错误:bugzilla.redhat.com/show_bug.cgi?
Jeremy

22
  1. 确保$USER设置了变量

    $ echo $USER
    
    $ sudo usermod -aG docker $USER
    
  2. 登出

  3. 登录后,重新启动docker服务

    $ sudo systemctl restart docker
    
    $ docker ps
    

3
重新启动Docker守护程序是一个很大的过程。将用户添加到Docker组之后,总是忘记这样做:\
Parth Patel

16

原因:该错误消息表示当前用户无法访问docker引擎,因为该用户没有足够的权限来访问UNIX套接字以与引擎进行通信。

快速解决:

  1. 使用sudo以root身份运行命令。

    sudo docker ps
    
  2. 更改当前用户的/var/run/docker.sock权限。

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

警告:运行sudo chmod 777 /var/run/docker.sock将解决您的问题,但它将为所有人打开docker套接字,这是@AaylaSecura指出的安全漏洞。因此,除了出于本地系统上的测试目的之外,不应使用它。

永久解决方案:

将当前用户添加到docker组。

sudo usermod -a -G docker $USER

注意:您必须先注销然后重新登录才能使更改生效。

请参阅此博客以了解有关以非root用户身份管理Docker的更多信息。


2
您可能会错过选票,因为人们注销然后忘记回来投票支持大笑。
约翰·米

我敢打赌,由于“ Quick Fix”是一场安全灾难,他们错过了投票...
Docker

1
@AaylaSecura是的,您是对的。我已将其添加为快速修复,但这又是一个不好的做法。我已经在答案中更改了它。如果您认为可以改进,请随时发表评论。
Nitish

这是对我有用的解决方案...谢谢!!!,docker.sock文件的所有权是root,所以没有注销将对其进行修复。
卡洛斯

4

如评论中前面所述,更改将在您重新登录后才会应用。如果您正在使用SSH并打开一个新终端,那么它将在新终端中正常工作

但是由于您使用的是GUI并打开了新的终端,因此未应用更改。这就是错误没有消失的原因

因此,下面的命令确实完成了它的工作,只是错过了重新登录

sudo usermod -aG docker $USER

1

由于我的用户是AD用户,因此我必须通过手动编辑/ etc / group文件将AD用户添加到本地组。不幸的是,在将某人添加到组中时,adduser命令似乎不支持nsswitch,并且无法识别未在本地定义的用户。

然后重新启动或刷新/ etc / group。现在,您可以不使用sudo使用docker。

问候。


1

以root用户身份进入容器 docker exec -it --user root <dc5> bash

创建docker组(如果尚未创建) groupadd -g 999 docker

将用户添加到Docker组 usermod -aG docker jenkins

变更权限 chmod 777 /var/run/docker.sock


0

您需要以非root用户身份管理docker。要创建docker组并添加用户:

  1. 创建泊坞窗组。

    $ sudo groupadd docker

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

    $ sudo usermod -aG docker $USER

  3. 注销并重新登录,以便重新评估您的组成员身份。

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

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

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

$ newgrp docker

  1. 确认您可以在没有sudo的情况下运行docker命令。

    $ docker run hello-world

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.