【问题标题】:Am I trying to connect to a TLS-enabled daemon without TLS?我是否尝试连接到没有 TLS 的启用 TLS 的守护程序?
【发布时间】:2015-02-16 03:55:27
【问题描述】:

我正在尝试了解 Docker,但我不断收到神秘的(对我而言)错误消息。

可能最简单的例子是尝试打印我安装的 Docker 版本:

$ sudo docker version
Client version: 1.4.1
Client API version: 1.16
Go version (client): go1.3.3
Git commit (client): 5bc2ff8
OS/Arch (client): darwin/amd64
FATA[0000] Get http:///var/run/docker.sock/v1.16/version:
    dial unix /var/run/docker.sock: no such file or directory.
    Are you trying to connect to a TLS-enabled daemon without TLS?

我刚刚浏览了user guide 并准确地跟踪了每一步,所以我很惊讶我收到了这条消息……我现在该怎么办?

我刚刚注意到,如果我不使用sudo,我不会收到错误消息:

$ docker version
Client version: 1.4.1
Client API version: 1.16
Go version (client): go1.3.3
Git commit (client): 5bc2ff8
OS/Arch (client): darwin/amd64
Server version: 1.4.1
Server API version: 1.16
Go version (server): go1.3.3
Git commit (server): 5bc2ff8

当然,这不是解决方案,因为我可能需要在路上的某个地方使用sudo...

我刚刚发现 another page 说“如果您使用的是 OS X,那么您不应该使用 sudo。”我不知道它们是否仅适用于该示例,还是一般而言。

【问题讨论】:

  • 愚蠢的问题,但是你启动了 docker 守护进程了吗?
  • 我一直在关注用户指南,所以是的,我相信 docker 守护进程已经启动。我该如何仔细检查?
  • 其实你找到了解决方案。使用 boot2docker,您将永远不需要 sudo 使用 linux,您将始终需要 sudo。这是因为 boot2docker 实际上在一个虚拟盒子中运行这些命令,该虚拟盒子被设置为正确访问守护进程。
  • 我一直在努力解决这个问题,并且在没有 sudo 的情况下运行对我有用
  • 几乎所有答案都是 OS X 特定的(他们提到了boot2docker),尽管问题或标签中没有明确提到 OS X。如果有人对通用答案感兴趣,请查看我的答案。

标签: docker


【解决方案1】:

对我来说,运行 $(boot2docker shellinit 2> /dev/null) 解决了这个问题。

这会在您当前的终端会话中运行boot2docker shellinit 命令的输出(三个set -x ... 行),这让docker 命令知道在哪里可以找到boot2docker 虚拟机。

$(boot2docker shellinit 2> /dev/null) 添加到~/.bash_profile 文件的底部将确保每次打开终端时都配置了docker 命令。


对于使用 Fish shell 的人:boot2docker shellinit ^ /dev/null | source


请注意,2> /dev/null(和 Fish 等效的 ^ /dev/null)是可选的。就像@pablo-fernandez 建议的那样,这隐藏了Writing .. 行。

【讨论】:

  • 我已经这样做了,但我会把它添加到 .bash_profile 中,好主意
  • 对 boot2docker 1.5 肯定有帮助,但较旧的 bo​​ot2docker 1.2 没有正确完成
  • 我添加了一个 stderr 重定向,因此不会出现“Writting...”语句:$(boot2docker shellinit 2> /dev/null)
  • 谢谢提鱼壳!为我解决了问题。
  • 正如萨尔瓦多·达利(Salvador Dali)在下面的回答中提到的,请确保在运行 shell init 之前还运行boot2docker start
【解决方案2】:
  1. Docker 称自己为 Linux 容器的自给自足运行时。 简单来说,它既充当服务器又充当客户端。
  2. $ docker version 命令查询是 Docker 可执行文件内部的,而不是正在运行的守护程序/服务。
  3. $ docker images or $ docker ps or $ docker pull centos 是向正在运行的 docker 守护进程/服务发送查询的命令。
  4. Docker 默认支持与其守护程序/服务的 TLS 连接。
  5. 仅当您登录的用户是用户组docker 的一部分或者您在命令前使用了sudo,例如$ sudo docker images,不需要 TLS 连接。

访问 Docker 文档页面Protect the Docker daemon socket

稍微滚动到顶部并找到warning section 以便清楚。

【讨论】:

  • 目前流行的答案只适用于 OS X,而这个答案更为笼统,解释了原因并允许我在 GNU/Linux 上解决它。
  • @laffuste 您的命令将擦除用户的其他组。因为缺少“-a”
  • @PawelBarcik 严重错误,谢谢:sudo usermod -a -G docker {username}
  • 这个answer如何回答这个问题?错误的原因是什么?如何解决? (我不在 OS X 上,所以现有答案不适用)。
【解决方案3】:

我在使用 sudo 和不使用 sudo 的 MacOS 上遇到了同样的错误。

我已经解决了:

boot2docker start
$(boot2docker shellinit)

附注:感谢艾伦。我发现their official documentation推荐了这种方法。

P.S.2:有时在运行两个命令之前可能需要boot2docker init(谢谢 Aaron)。

【讨论】:

  • 这有效,但我不明白为什么? $(boot2docker shellinit) 在做什么?
  • 这在 Mac OS X 中有效,但我和 Emile 有同样的问题,即为什么这样有效?
  • 这在 Mac OSX 10.10.4 和 Docker 工具上对我不起作用。
  • 我不仅要运行 boot2docker shellinit,还要复制并运行它显示的每个命令。链接的官方文档说此命令仅显示所需的命令集
  • 在 Windows 机器上也为我工作。
【解决方案4】:

你需要做:

$boot2docker init
$boot2docker start

以下设置解决了这个问题:

$export DOCKER_HOST=tcp://192.168.59.103:2376
$export DOCKER_CERT_PATH=/Users/{profileName}/.boot2docker/certs/boot2docker-vm
$export DOCKER_TLS_VERIFY=1

【讨论】:

  • 这个命令也可以用来设置环境变量(而不是手动):eval "$(boot2docker shellinit)"
【解决方案5】:

您可能还没有该文件的权限。 在我使用

将自己添加到 dockergroup 后发生在我身上
sudo gpasswd -a user docker

但尚未注销。

要解决此问题,您可以重新登录,或使用 sg docker "docker <subcommand> ..." 注销之前。

如果您在/etc/group 中的docker 组中,您应该能够在不输入密码的情况下运行它。

https://dingyichen.wordpress.com/2015/02/05/docker-dial-unix-varrundocker-sock-no-such-file-or-directory-are-you-trying-to-connect-to-a-tls-enabled-daemon-without-tls/

【讨论】:

    【解决方案6】:

    对于它的价值,我尝试了这个问题和this related question 中的所有解决方案,但在我卸载并重新安装VirtualBox 之前没有解决我的问题。这个过程将 VirtualBox 从 4.2.16 版本升级到 4.3.22(我之前的那个已经在系统上闲置了几个月)。

    然后boot2dockerdocker 在没有任何其他调整的情况下工作。

    【讨论】:

      【解决方案7】:

      我尝试了这里的解决方案,但 boot2docker 不起作用。

      我的解决方案:在 Mac 上卸载 boot2docker,在 VirtualBox 中安装 Centos 7 虚拟机,然后在该虚拟机中使用 Docker。

      【讨论】:

        【解决方案8】:

        确保有

        127.0.0.1    localhost
        

        在你的

        `/etc/hosts `
        

        文件。

        【讨论】:

          【解决方案9】:

          在 Ubuntu 上安装 lxc-docker 后,您需要将您的用户添加到 docker 用户组:

          sudo usermod -a -G docker myusername
          

          这是因为套接字文件的权限:

          srw-rw---- 1 root docker 0 Mar 20 07:43 /var/run/docker.sock
          

          请勿按照其他 cmets 中的建议在没有“-a”的情况下运行 usermod,否则它会清除您的其他组设置并离开“docker”组

          这就是将会发生的事情:

          ➜  ~  id pawel
          uid=1000(pawel) gid=1000(pawel) groups=1000(pawel),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare),998(docker)
          ➜  ~  usermod -G docker pawel
          ➜  ~  id pawel               
          uid=1000(pawel) gid=1000(pawel) groups=1000(pawel),998(docker)
          

          【讨论】:

            【解决方案10】:

            TLDR:当我在运行诊所安装 docker 并且大多数用户使用 OS X 时,这让我的 Python 聚会小组解决了这个问题:

            boot2docker init
            boot2docker up
            

            运行输出给你的export 命令,然后

            docker info
            

            应该告诉你它有效。


            背景(是什么让我们遇到了问题)

            我领导了一个安装 docker 的诊所,大多数与会者都使用 OS X,我们遇到了这个问题,我在几台机器上克服了它。以下是我们遵循的步骤:

            首先,我们安装了自制软件(是的,有些与会者没有):

            ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
            

            然后我们得到了cask,我们用它来安装virtualbox,然后用brew安装docker和boot2docker(OS X都需要)Don't use sudo for brew.

            brew install caskroom/cask/brew-cask
            brew cask install virtualbox
            brew install docker
            brew install boot2docker
            

            解决方案

            那时我们遇到了这里的提问者遇到的问题。以下修复了它。我知道init 是一次性交易,但您可能必须在每次启动 docker 时运行up

            boot2docker init
            boot2docker up
            

            然后当up 已经运行时,它会给出几个export 命令。复制粘贴并运行它们。

            最后docker info 应该会告诉您它已正确安装。

            演示

            其余的命令应该演示它。 (在 Ubuntu linux 上我需要 sudo。)

            docker run hello-world
            docker run -it ubuntu bash
            

            那么你应该在容器的根 shell 上:

            apt-get install nano
            exit
            

            回到你的本地用户 bash:

            docker ps -l
            

            在“容器 ID”下查找大约 12 位十六进制(0-9 或 a-f)标识符,例如456789abcdef。然后您可以提交您的更改并将其命名为一些描述性名称,例如descriptivename

            docker commit 456789abcdef descriptivename`
            

            【讨论】:

              【解决方案11】:

              下划线问题很简单——缺少/var/run/docker.sock unix 域套接字的权限。

              来自 Daemon socket option chapterDocker 命令行 参考 Docker 1.6.0:

              默认情况下,unix 域套接字(或 IPC 套接字)创建于 /var/run/docker.sock需要root权限,或者docker 组成员身份

              向用户授予权限所需的步骤在 Docker installation instructions for Fedora 中有很好的描述:

              授予用户使用 Docker 的权限

              docker 命令行工具 通过套接字文件联系 docker 守护进程 /var/run/docker.sockroot:root 所有。虽然建议 对 docker 命令使用 sudo,如果用户希望避免它,一个 管理员可以创建一个 docker 组,拥有它 /var/run/docker.sock,并将用户添加到该组。

              $ sudo groupadd docker
              $ sudo chown root:docker /var/run/docker.sock
              $ sudo usermod -a -G docker $USERNAME

              注销并重新登录以使上述更改生效。 请注意,某些 Linux 发行版 (Ubuntu) 的 Docker 软件包确实已经将 /var/run/docker.sock 放在了 docker 组中,因此上述前两个步骤是不必要的。

              在 OS X 和boot2docker 的情况下,情况有所不同; Docker 守护进程在 VM 内运行,因此必须将 DOCKER_HOST 环境变量设置为此 VM,以便 Docker 客户端可以找到 Docker 守护进程。这是通过在 shell 中运行 $(boot2docker shellinit) 来完成的。

              【讨论】:

              • 嗯,我的情况类似但略有不同。我在 Ubuntu 14.04 上运行。 Docker 似乎安装正确(仅输入“docker”会显示命令列表)。我创建了一个 docker 组并让我的用户成为其中的成员。这只是一个家庭系统,我只是在玩 docker。然而,除了“docker”之外的任何东西都会引发错误。我相信它,因为 docker 无法创建 /var/run/docker.sock。在我的系统上 /var/run 是 /run 的符号链接,它是 root:root 和 755 perm,所以 docker 不能在那里写。不确定我的解决方案是什么。
              • Piotr,这个解释很有用。你能详细说明为什么“$(boot2docker shellinit)”有效,但普通的“boot2docker shellinit”不能吗?我知道括号意味着在子shell中执行,但我无法弄清楚为什么在没有其他命令需要它的情况下使docker正常工作是必要的......
              • @AlexEdelstein boot2docker shellinit 与其他命令之间的区别在于,该命令本身不会进行任何更改,而只会生成(打印)您必须自己运行的命令。您可以先运行boot2docker shellinit,然后手动复制并运行其输出中的每个命令。通过在子进程中运行boot2docker shellinit(使用$() 语法)更容易运行所有命令,因为这样每行输出都会自动作为shell 命令运行。请参阅docs.docker.com/installation/mac/#from-your-command-line,其中有详细说明。
              • @SteveCohen 您可能想检查 docker 服务是否使用sudo service docker status 运行。在我的 Ubuntu 14.04 上,安装后它没有运行,这导致了错误。
              • 感谢您为根本原因链接实际文档,解决了我的问题
              【解决方案12】:

              就我而言(Linux Mint 17)我做了很多事情,但我不确定其中哪些是完全必要的。

              我包含了缺少的 Ubuntu 软件包:

              $ sudo apt-get install apparmor lxc cgroup-lite
              

              一个用户被添加到组docker

              $ sudo usermod -aG docker ${USER}
              

              启动的守护进程(openSUSE 只需要这个)

              $ sudo docker -d
              

              谢谢\署名


              谢谢Usman Ismail,因为也许这只是最后一件事......

              愚蠢的问题,但是您是否启动了 docker 守护程序? – 乌斯曼·伊斯梅尔 2014 年 12 月 17 日 15:04


              还要感谢 github@MichaelJCole 为我提供的解决方案,因为我在阅读 Usman 的评论时没有检查守护进程。

              GitHub comment:

              sudo apt-get install apparmor lxc cgroup-lite
              sudo apt-get  install docker.io
              # If you installed docker.io first, you'll have to start it manually
              sudo docker -d
              sudo docker run -i -t ubuntu /bin/bash
              

              感谢fredjean.net post 注意到缺少的软件包,忘记了默认的 Ubuntu 安装说明,谷歌了解其他方式

              事实证明,Linux Mint 上默认没有安装 cgroup-lite 和 lxc 包。安装两者之后,我就可以在基础镜像中运行 bash,然后构建并运行我的镜像。


              感谢brettof86关于openSUSE的评论

              【讨论】:

              • 谢谢!就我而言(Mint 17.1),缺少的是 apparmor。
              • 将自己添加到 docker 组为我做了这件事,sudo adduser $USER docker。使其在当前 shell 上生效的技巧是 curgroup=$(id -gn) && newgrp docker && newgrp $curgroup,改编自 superuser.com/questions/272061/…
              • 我猜这个分数低得多的事实是因为使用 OS X 的人比使用 Linux 的人多?我使用的是 Ubuntu 14.04,它适用于我。
              • openSUSE 我只需要启动守护进程
              • 请原谅我对 docker-machine 的无知,但我不知道。但是,如果您发现了,请在 cmets 中指出或编辑答案。 :D
              【解决方案13】:

              我遇到了同样的问题并尝试了各种方法来解决这个问题,修改 .bash_profile 文件,登录和退出,但没有任何运气。最后,重新启动我的机器修复了它。

              【讨论】:

                【解决方案14】:

                在 Linux Ubuntu/Mint 上运行 Docker 所需的一切:

                sudo apt-get -y install lxc
                sudo gpasswd -a ${USER} docker
                newgrp docker
                sudo service docker restart
                

                如果上述方法不起作用,您可能需要安装两个额外的依赖项:

                sudo apt-get -y install apparmor cgroup-lite
                sudo service docker restart
                

                【讨论】:

                • 如果可能的话,我会给自己 +1 - 我正在寻找解决方案并找到了我自己忘记的解决方案 :)
                • 这对我有帮助。我意识到安装后 docker 服务没有运行,所以sudo service docker start 在我的 Ubuntu 14.04 上解决了这个问题。
                【解决方案15】:

                另一个可能的原因是您的BIOS CPU 可视化 未启用。先去开启吧!

                【讨论】:

                  【解决方案16】:

                  我遇到了同样的问题。一个简单的service docker restart 就解决了这个问题。

                  【讨论】:

                    【解决方案17】:

                    确保 Docker 守护进程正在运行:

                    service docker start
                    

                    这为我解决了问题!

                    【讨论】:

                    • sudo service docker start 给我
                    • systemctl enable docker.servicesystemctl start docker.service 对于 system.d linux 用户(在我的例子中是 Arch)
                    • sudo service docker restart 为我
                    【解决方案18】:

                    当我从 Jenkins 创建 Docker 映像时,我遇到了同样的问题。只需将用户添加到docker 组,然后重新启动 Docker 服务,就我而言,我必须重新启动 Jenkins 服务。

                    这是我得到的错误:

                    http:///var/run/docker.sock/v1.19/build?cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&memory=0&memswap=0&rm=1&t=59aec062a8dd8b579ee1b61b299e1d9d340a1340: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?
                    FATAL: Failed to build docker image from project Dockerfile
                    java.lang.RuntimeException: Failed to build docker image from project Dockerfile
                    
                    Solution:
                    
                    [root@Jenkins ssh]# groupadd docker
                    [root@Jenkins ssh]# gpasswd -a jenkins docker
                    Adding user jenkins to group docker
                    [root@Jenkins ssh]# /etc/init.d/docker restart
                    Stopping docker:                                           [  OK  ]
                    Starting docker:                                           [  OK  ]
                    [root@Jenkins ssh]# /etc/init.d/jenkins restart
                    Shutting down Jenkins                                      [  OK  ]
                    Starting Jenkins                                           [  OK  ]
                    [root@Jenkins ssh]#
                    

                    【讨论】:

                      【解决方案19】:

                      对我来说,以下步骤有效:

                      1. 我注意到运行 docker run hello-world 失败并出现问题中的这个错误,但运行 sudo docker run hello-world 有效。
                      2. 我将当前用户添加到dockersudo adduser user docker。然后你必须重启你的机器或使用su - user(如果在docker组中,使用groups命令检查)。

                      之后,hello-world 开始工作了。

                      我的回答是基于 How can I use docker without sudo? 解释出了什么问题。


                      【讨论】:

                      • 将self加入组后,执行`newgrp docker; newgrp primary-group 这将创建一个子 shell,其中包含 docker 的新主组,然后重新建立正确的主组。 (有点骇人听闻)。
                      【解决方案20】:

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

                      sudo groupadd docker
                      sudo usermod -aG docker $USER
                      

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

                      docker run hello-world
                      

                      来源:Manage Docker as a non-root user

                      【讨论】:

                        猜你喜欢
                        • 2015-06-24
                        • 1970-01-01
                        • 2015-06-03
                        • 1970-01-01
                        • 1970-01-01
                        • 2017-10-19
                        • 1970-01-01
                        • 2017-03-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多