【问题标题】:docker.sock permission denieddocker.sock 权限被拒绝
【发布时间】:2018-02-01 17:07:32
【问题描述】:

当我尝试运行简单的 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

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

【问题讨论】:

  • 您在进行更改后是否重新登录?更改在同一会话中不可用。 sudo docker ps 也适合你吗?
  • 我打开一个新终端仍然收到这些错误消息。
  • sudo docker ps 有效。但我需要在本地用户下使用 docker。
  • 你必须重启docker守护进程,否则不会让docker组的成员控制docker守护进程
  • 更改用户/组后,您必须重新登录,而不仅仅是打开新终端。

标签: linux docker


【解决方案1】:

对于那些刚接触 shell 的人,命令:

$ sudo usermod -aG docker $USER

需要在你的 shell 中定义$USER。这通常是默认设置的,但您可能需要在某些 shell 中将该值设置为您的登录 ID。


更改用户的组不会更改用户已打开的现有登录名、终端和 shell。为避免再次登录,您只需运行:

$ newgrp docker

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


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

【讨论】:

  • 这对我不起作用,但我使用的是命名空间。我不得不使用--userns=host
  • 我尝试了这个线程中的所有其他技巧,遵循文档,将 Docker 重新安装到更新版本,重新启动了很多次,我想到的一切。我确实在 docker 组中,但默认 shell 不会承认它(可能是我的 .profile 中的脚本有问题?)。除了对 root 用户执行 sudo 之外,只有 newgrp 命令有效。
  • @BrunoLaturner 如果您使用的是 Ubuntu,我听说 LightDM 会导致从登录用户中删除辅助组的问题。
  • @BMitch 你在 NSA 监视我吗?那是我的确切配置和错误。谢谢!已解决askubuntu.com/q/1057258/259660
  • 运行newgrp docker 命令是激活组更改所必需的
【解决方案2】:

原因:错误信息表示当前用户无法访问 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

注意:您必须退出并重新登录才能使更改生效。

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

【讨论】:

  • 您可能错过了投票,因为人们注销然后忘记回来投票大声笑。
  • 我敢打赌,他们错过了投票,因为“快速修复”是一场安全灾难……世界永远都不能访问 docker 套接字……
  • @AaylaSecura 是的,你是对的。我已将其添加为快速修复,但同样是一种不好的做法。我现在已经在答案中更改了它。如果您认为可以改进,请随时发表评论。
  • 这是对我有用的解决方案...谢谢!!!,docker.sock 文件的所有权是 root 用户,所以没有注销可以解决它。
【解决方案3】:
  1. 确保您的 $USER 变量已设置

    $ echo $USER
    
    $ sudo usermod -aG docker $USER
    
  2. 注销

  3. 登录后重启docker服务

    $ sudo systemctl restart docker
    
    $ docker ps
    

【讨论】:

  • 重启 Docker 守护进程是一件大事。将用户添加到 Docker 组后总是忘记这样做:\
  • 应该不需要重启守护进程,它是root,并且已经配置socket作为docker运行。我认为它唯一可以解决的问题是您修改了套接字权限。
【解决方案4】:

正如评论中前面提到的,在您重新登录之前,这些更改将不适用。如果您正在执行 SSH 并打开一个新终端,它会在新终端中运行

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

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

sudo usermod -aG docker $USER

【讨论】:

    【解决方案5】:

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

    1. 创建 docker 组。

      $ sudo groupadd docker

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

      $ sudo usermod -aG docker $USER

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

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

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

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

    $ newgrp docker

    1. 验证您是否可以在不使用 sudo 的情况下运行 docker 命令。

      $ docker run hello-world

    【讨论】:

      【解决方案6】:

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

      然后重新启动或刷新 /etc/group。现在,你可以在没有 sudo 的情况下使用 docker。

      问候。

      【讨论】:

        【解决方案7】:

        ***关于这些答案的重要说明:docker 组并不总是“docker”,有时它是“dockerroot”,例如 Centos 7 安装的情况

        sudo yum install -y docker
        

        在安装 Docker 之后,你应该做的第一件事是

        sudo tail /etc/group
        

        应该是这样的

        ......
        sshd:x:74:
        postdrop:x:90:
        postfix:x:89:
        yourusername:x:1000:yourusername
        cgred:x:996:
        dockerroot:x:995:
        

        在这种情况下,它是“dockerroot”而不是“docker”。所以,

        sudo usermod -aG dockerroot yourusername
        logout
        

        【讨论】:

          【解决方案8】:

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

          我收到一条错误消息:Got permission denied ... /var/run/docker.sock: connect: permission denied

          [...] 我该如何解决?

          TL;DR:有两种方法(第一种方法,在问题本身中也提到过,已被其他答案广泛解决,但存在安全问题;所以我将详细说明这个问题,并开发第二个解决方案,该解决方案也适用于这个相当合理的用例)。


          回想一下上下文,Docker 守护进程套接字归root:docker 所有:

          $ ls -l /var/run/docker.sock
          srw-rw---- 1 root docker 0 janv. 28 14:23 /var/run/docker.sock
          

          因此,使用此默认设置,需要在所有 docker CLI 命令前面加上sudo

          为避免这种情况,可以:

          1. 将自己的用户帐户 ($USER) 添加到 docker 组 - 但在个人工作站上执行此操作非常冒险,因为这相当于 为用户运行的所有程序提供 root 权限,而无需任何sudo 密码提示或审核

            另见:

          2. 可以自动添加sudo 而无需手动输入sudo docker:为此,一种解决方案是~/.bashrc 中添加以下别名(有关详细信息,请参见例如this thread ):

            __docker() {
                if [[ "${BASH_SOURCE[*]}" =~ "bash-completion" ]]; then
                    docker "$@"
                else
                    sudo docker "$@"
                fi
            }
            alias docker=__docker
            

            然后可以通过打开一个新终端并输入来测试:

            docker run --pul〈TAB〉 # → docker run --pull
                                   # autocompletion works
            docker run --pull always --rm -it debian:11  # ask one's password
            \docker run --help  # bypass the alias (thanks to the \) and ask no password
            

          【讨论】:

          • @SridharSarnobat 我回滚了你的编辑,因为运行sudo chmod a+rx /var/run/docker.sock 绝对不是我的答案的总结,也不是一个合适的解决方案……
          • 我不知道为什么我投了反对票:我真诚地相信,我在回答中提出的仅添加一个 .bashrc 别名比 the currently accepted solution 更好,因为 (1 ) 从安全的角度来看它更安全(由于 Docker 的守护进程攻击面,没有用户进程可以偷偷地成为 root),并且(2)它实现了相同的目标:我们可以在一个终端中写 docker run -it ubuntu 左右......
          【解决方案9】:

          输入命令并在没有 sudo 命令的情况下探索 docker

          sudo chmod 666 /var/run/docker.sock

          【讨论】:

            【解决方案10】:

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

            如果尚未创建 docker 组,请创建它 groupadd -g 999 docker

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

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

            【讨论】:

            • 我强烈建议不要更改docker.sock 的权限。这为主机上的每个用户和进程提供了完全的 root 访问权限,无需密码和最少的操作记录。
            【解决方案11】:

            你必须使用 pns 执行器而不是 docker。 运行以下修改 configmap 的补丁,一切就绪。

            kubectl -n argo patch cm workflow-controller-configmap -p '{"data": {"containerRuntimeExecutor": "pns"}}' ;
            

            参考:https://www.youtube.com/watch?v=XySJb-WmL3Q&list=PLGHfqDpnXFXLHfeapfvtt9URtUF1geuBo&index=2&t=3996s

            【讨论】:

              猜你喜欢
              • 2020-01-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-08-30
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多