【问题标题】:Docker command can't connect to Docker daemonDocker 命令无法连接到 Docker 守护进程
【发布时间】:2016-02-07 07:46:04
【问题描述】:

我想转向 Docker,所以我刚刚开始搞乱它。我在 VirtualBox Ubuntu 15.10 (Wily Werewolf) 安装上安装了 Docker,并以suggested here 的身份尝试运行基本的nginx Docker 映像:

$ docker run --name mynginx1 -P -d nginx
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

所以我检查了 Docker 是否正在运行:

$ sudo service docker status
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since vr 2015-11-06 08:41:48 CET; 15min ago
     Docs: https://docs.docker.com
 Main PID: 7542 (docker)
   CGroup: /system.slice/docker.service
           └─7542 /usr/bin/docker daemon -H fd://

nov 06 08:41:47 kramer65-VirtualBox systemd[1]: Starting Docker Application Container Engine...
nov 06 08:41:47 kramer65-VirtualBox docker[7542]: time="2015-11-06T08:41:47.900410966+01:00" level=info msg="API ...ock"
nov 06 08:41:48 kramer65-VirtualBox docker[7542]: time="2015-11-06T08:41:48.033514149+01:00" level=info msg="Fire...lse"
nov 06 08:41:48 kramer65-VirtualBox docker[7542]: time="2015-11-06T08:41:48.141594321+01:00" level=info msg="Defa...ess"
nov 06 08:41:48 kramer65-VirtualBox docker[7542]: time="2015-11-06T08:41:48.416294436+01:00" level=warning msg="Y...it."
nov 06 08:41:48 kramer65-VirtualBox docker[7542]: time="2015-11-06T08:41:48.565507576+01:00" level=info msg="Load...rt."
nov 06 08:41:48 kramer65-VirtualBox docker[7542]: time="2015-11-06T08:41:48.567907022+01:00" level=info msg="Load...ne."
nov 06 08:41:48 kramer65-VirtualBox docker[7542]: time="2015-11-06T08:41:48.567945214+01:00" level=info msg="Daem...ion"
nov 06 08:41:48 kramer65-VirtualBox docker[7542]: time="2015-11-06T08:41:48.567969891+01:00" level=info msg="Dock....9.0
nov 06 08:41:48 kramer65-VirtualBox systemd[1]: Started Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.

这表明 Docker 守护进程实际上已经在运行,但可以肯定的是我只是手动启动了 Docker 守护进程:

$ sudo docker daemon
INFO[0000] API listen on /var/run/docker.sock           
INFO[0000] [graphdriver] using prior storage driver "aufs" 
INFO[0000] Firewalld running: false                     
INFO[0000] Default bridge (docker0) is assigned with an IP address XXX.XX.X.X/XX. Daemon option --bip can be used to set a preferred IP address 
WARN[0000] Your kernel does not support swap memory limit. 
INFO[0000] Loading containers: start.                   

INFO[0000] Loading containers: done.                    
INFO[0000] Daemon has completed initialization          
INFO[0000] Docker daemon                                 commit=76d6bc9 execdriver=native-0.2 graphdriver=aufs version=1.9.0

然后我再次尝试运行映像,但结果相同:

$ docker run --name mynginx1 -P -d nginx
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

我尝试 sudo'ing 命令,但无济于事。我在这里做错了什么?

【问题讨论】:

  • 同样的问题。我也在 Ubuntu 15.10 上:(
  • 同样的问题,ubuntu 15.10
  • 只需重新启动您的 docker 服务即可。谢谢@jim
    sudo service docker restart
  • Nasruddin,那肯定不适合我... :-(
  • 我必须重新启动机器才能使其工作。

标签: linux ubuntu docker daemon


【解决方案1】:

我可以通过运行以下命令来解决这个问题:

sudo mv /var/lib/dpkg/info/docker-ce* /tmp

【讨论】:

    【解决方案2】:

    您需要将当前用户添加到 docker 组,如下所示:

    sudo usermod -aG docker $(whoami)
    

    然后注销并再次登录进入系统或重新启动系统。 由docker version测试

    有关如何安装 docker-engine 的更多信息,请关注docker documentation

    【讨论】:

    • 愚蠢,但它也对我有用@RobinLoxley,这应该是一个实际的答案,而不仅仅是评论,如果你发布它,请告诉我,我会给你一个赞成票;)
    • 我会在“注销并再次登录系统或重新启动系统”下划线
    • @Junaid 回答下面显示了如何避免注销/登录步骤,以防您像我一样懒惰不想重新启动您的应用程序;)
    • 这正是 Docker 教程中提到的内容,但是注销并重新登录对我不起作用。我必须重新启动系统才能使其正常工作。
    • 我看到了 docker 版本信息,但是在输出的最后,我看到了Cannot connect to the Docker daemon. Is the docker daemon running on this host?
    【解决方案3】:

    在 Ubuntu 16.04 中测试

    # Create the docker group and add your user to the docker group
    groupadd docker
    usermod -aG docker $USER
    newgrp docker
    
    # Configure docker service to be exposed
    mkdir -p /etc/systemd/system/docker.service.d
    echo -e '[Service]\nExecStart=\nExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2376' >> /etc/systemd/system/docker.service.d/override.conf
    
    # restart service
    systemctl daemon-reload
    service docker restart
    

    【讨论】:

      【解决方案4】:

      也许这会对某人有所帮助,因为错误消息非常无用,而且我已经多次执行所有标准权限步骤但无济于事。

      Docker 偶尔会保留阻止访问的幽灵环境变量,尽管您的系统已正确设置。如果您曾经让它在某个时间运行并且在重新启动后它刚刚停止合作,则以下 shell 命令可能会使其再次可访问:

      unset DOCKER_HOST
      unset DOCKER_TLS_VERIFY
      unset DOCKER_TLS_PATH
      docker ps
      

      我之前安装了一个可以运行的 docker 安装程序,但在重新启动我的笔记本电脑后它只是拒绝工作。已正确添加到 docker 用户组,对套接字具有正确的权限等,但仍然无法运行 docker logindocker run ... 等。这为我修复了它。不幸的是,我必须在每次重新启动时运行它。 This is mentioned on a couple of github issues also 作为一种解决方法,虽然这似乎是一个错误,这是正确操作 Docker 的一个持久障碍(注意:我使用的是 Arch Linux,而不是 OSX,但这对我来说是同样的问题)。

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题。苦苦挣扎了两天才解决。

        只有当我这样做时它才有效:

        1. 根据Docker's Tutorial,如果尚未添加 Docker 密钥,则需要添加:

          $ sudo wget -qO- https://get.docker.com/gpg | sudo apt-key add -

        2. 然后确保您使用以下方式授予自己 docker 权限:

          $ sudo usermod -aG docker $USER

        希望这对你也有帮助。

        【讨论】:

        • 第二步可以简化为:sudo usermod -aG docker $USER
        【解决方案6】:

        授予非 root 访问权限 - 来自 docker

        如果 docker 组不存在,则添加它。

        $ sudo groupadd docker
        

        将连接的用户“${USER}”添加到 docker 组。

        更改用户名以匹配您的首选用户。

        您可能需要注销并重新登录 这将生效。

        $ sudo gpasswd -a ${USER} docker
        

        重启 Docker 守护进程。

        $ sudo service docker restart
        

        【讨论】:

          【解决方案7】:

          有同样的问题,对我有用的是:
          检查 /var/run/docker.sock 的所有权

          ls -l /var/run/docker.sock
          

          如果您不是所有者,则使用命令更改所有权

          sudo chown *your-username* /var/run/docker.sock
          

          然后您可以继续尝试轻松执行 docker 命令 :D

          【讨论】:

          • 在用尽所有其他可能性之后,这就是我在 Sabayon/Gentoo Linux 上工作的原因。
          • 该文件归root 所有,但在docker 组中。正确的方法是将您当前的用户分配到docker 组,根据 Docker 的文档:sudo groupadd docker && sudo usermod -aG docker $USER
          【解决方案8】:

          对于 Ubuntu 16.04

          内部文件/lib/systemd/system/docker.service更改:

          ExecStart=/usr/bin/dockerd fd://
          

          与:

          ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375
          

          内部文件/etc/init.d/docker更改:

          DOCKER_OPTS=
          

          与:

          DOCKER_OPTS="-H tcp://0.0.0.0:2375"
          

          然后重新启动您的计算机。

          【讨论】:

            【解决方案9】:

            将当前用户添加到 docker 组:

            sudo usermod -aG docker $(whoami)

            【讨论】:

            • 请将其格式化为代码!并解释这个命令。并使用选项的长版本(以-- 开头)。
            【解决方案10】:
            1. 我也遇到了同样的问题。问题出在分配给 docker-daemon 和 docker-client 的套接字中。
            2. 首先,在 docker.sock 上没有为 docker-client 设置权限您可以使用“sudo usermod -aG docker $USER”进行设置
            3. 然后检查 docker-client 运行的 bash 文件,对我来说它位于 0.0.0.0:2375,而 docker-daemon 在 unix socket 上运行。(它是在 dockerd 的配置文件中设置的)。
            4. 只需注释 bash 行即可。
            5. 但如果你想让它在 TCP 端口而不是 unix 套接字上工作,请更改 dockerd 的配置文件并将其设置为 0.0.0.0.2375 并保持 bash 中的行(如果存在)或将其设置为 0.0 .0.0:2375。

            【讨论】:

              【解决方案11】:

              由于 docker 在启动时绑定到 root 拥有的 unix 套接字,因此使用 'sudo' 和 docker 命令将起作用。

              【讨论】:

                【解决方案12】:

                对于 Ubuntu:
                当我更新 docker 时发生在我身上。
                您需要取消屏蔽服务和套接字,然后重新启动服务。

                以下对我有用:

                systemctl unmask docker.service
                systemctl unmask docker.socket
                systemctl start docker.service
                

                幕后发生了什么
                systemd 还可以通过将单元链接到 /dev/null 来自动或手动将单元标记为完全不可启动。这称为屏蔽单元,可以通过 mask 命令实现。

                sudo systemctl mask docker.service
                

                您可以使用以下方法检查屏蔽服务列表:

                sudo systemctl list-unit-files
                

                要启用自动/手动启动服务,您需要使用以下方法取消屏蔽:

                sudo sytemctl unmask docker.service
                

                现在服务将被启用,如下图所示

                【讨论】:

                  【解决方案13】:

                  我在运行 docker 时遇到了同样的问题。

                  您可以以 sudo 用户身份运行命令:

                  sudo docker ***your command here***
                  

                  【讨论】:

                    【解决方案14】:

                    对于那些已经尝试重新启动机器的人,按照docker env documentation 中的说明取消设置环境变量 DOCKER_HOST,其余的只是尝试使用

                    sudo service docker restart
                    

                    即使在重新启动机器后,也只有这对我有用。

                    【讨论】:

                    • 如果您只注销并登录,则必须这样做。
                    【解决方案15】:

                    安装完所有东西并启动服务后,尝试关闭终端并再次打开它,然后尝试拉取图像

                    编辑

                    我又遇到了这个问题,如果上面的解决方案不起作用,请尝试this solution,即下面的命令

                    sudo mv /var/lib/docker/network/files/ /tmp/dn-bak
                    

                    注意事项

                    如果上面的命令有效,您可能遇到了网络 docker 问题,无论如何这都解决了,要确认,请查看带有以下命令的日志

                    tail -5f /var/log/upstart/docker.log
                    

                    如果输出有类似的东西

                    FATA[0000] Error starting daemon: Error initializing network controller: could not delete the default bridge network: network bridge has active endpoints 
                    /var/run/docker.sock is up
                    

                    您确实遇到网络问题,但是我不知道您下次重新启动时(更新,2个月再次没有问题)您的OS是否会得到这个再次出现问题,如果是错误或安装问题

                    我的 docker 版本

                    Client:
                     Version:      1.9.1
                     API version:  1.21
                     Go version:   go1.4.2
                     Git commit:   a34a1d5
                     Built:        Fri Nov 20 13:12:04 UTC 2015
                     OS/Arch:      linux/amd64
                    
                    Server:
                     Version:      1.9.1
                     API version:  1.21
                     Go version:   go1.4.2
                     Git commit:   a34a1d5
                     Built:        Fri Nov 20 13:12:04 UTC 2015
                     OS/Arch:      linux/amd64
                    

                    【讨论】:

                      【解决方案16】:

                      对于 OSX

                      打开 docker 并通过快速启动终端 (https://docs.docker.com/engine/installation/mac/) 启动“默认”机器后,您尝试使用 docker 命令并收到“无法连接到 docker daemon”消息,事实证明您需要一些环境变量集

                      eval "$(docker-machine env default)"

                      然后用docker run hello-world 试试看是否一切都很好。

                      【讨论】:

                        【解决方案17】:

                        尝试在您正在运行的命令中使用“sudo”。

                        【讨论】:

                        • “我尝试 sudo'ing 命令,但无济于事。有人知道我在这里做错了什么吗?欢迎所有提示!”
                        【解决方案18】:

                        我在 Amazon EC2 实例上遇到了同样的错误。重启实例后问题得到解决。

                        【讨论】:

                          【解决方案19】:

                          这个问题目前在 Google 搜索中排名第三。在对我的 Linux 系统上解决这个问题进行了一些研究之后,我想我会写这个答案。原始帖子指出问题出在 Ubuntu 上,但我在使用 Fedora 时也遇到了问题。考虑到这一点,这就是我为解决问题所做的工作。

                          在 Fedora 22 上

                          安装 Docker:

                          $> curl -fsSL https://get.docker.com/ | sh
                          

                          安装 Docker 后:

                          需要将用户添加到 docker 组。

                          $> sudo usermod -aG docker
                          

                          docker daemon 需要启动

                          $> sudo service docker start
                          

                          您可以将守护程序设置为在启动时启动

                          $> sudo chkconfig docker on
                          

                          您可以验证 docker 服务是否正在运行

                          $> service docker status
                          

                          最后一次检查

                          $> docker run hello-world
                          

                          【讨论】:

                          • 在 Fedora 23 上,这个组可能被称为dockerroot。此外,您可能希望从存储库(而不是 curl ... | sh)安装它,以便以后更新:dnf install docker
                          • 很多没有“docker”组,所以我们要先添加groupadd docker,再添加到你的用户名sudo usermod -aG docker your_username
                          【解决方案20】:

                          将用户添加到 docker 组

                          • 如果 docker 组不存在,则添加它:

                            sudo groupadd docker

                          • 将连接的用户“${USER}”添加到docker组:

                            sudo gpasswd -a ${USER} docker

                          • 重启 Docker 守护进程:

                            sudo service docker restart

                          • 要么执行newgrp docker 要么注销/登录以激活对 组。

                          【讨论】:

                          • 看来newgrp docker 是shell 本地的,而不是登录会话。这一点从手册页上看不清楚。
                          • 为我工作。谢谢!
                          • 唯一有效的答案!在私有云 Linux 机器上,它仍然可以工作!
                          • 在 Ubuntu 18.04 上工作!谢谢
                          【解决方案21】:

                          通常,以下命令可以解决问题:

                          sudo service docker restart
                          

                          这个,而不是 docker start 用于 Docker 似乎已经在运行的情况。

                          如果可行,那么按照建议和另一个答案以及此GitHub issue,如果您尚未将自己添加到 docker 组中,请运行:

                          sudo usermod -aG docker <your-username> 
                          

                          而且你很可能会去。


                          对于遇到此问题的其他人,在某些操作系统的 docker 中,您安装后不会立即启动,因此会出现相同的 can't connect to daemon message。在这种情况下,您可以首先通过执行以下命令检查 docker 服务的状态来验证 Docker 确实没有运行:

                          sudo service docker status
                          

                          如果输出看起来像:docker stop/waiting 而不是 docker start/running, process 15378,那么这显然意味着 Docker 未处于活动状态。在这种情况下,请确保以:

                          sudo service docker start
                          

                          而且,和以前一样,你很可能会很顺利。

                          【讨论】:

                          • /var/run# service docker status [FAIL] Docker 没有运行...失败!
                          【解决方案22】:

                          自我注意:当我忘记使用sudo 运行docker 命令时,我从问题的标题中得到错误:

                          sudo docker run ...

                          [Ubuntu 15.10]

                          【讨论】:

                            【解决方案23】:

                            以 root 身份输入 (sudo su) 并尝试以下操作:

                            unset DOCKER_HOST
                            docker run --name mynginx1 -P -d nginx
                            

                            我在这里遇到了同样的问题,docker 命令只能以 root 身份运行,并且这个 DOCKER_HOST 为空

                            PS: 还要注意 Ubuntu 上的 correct and official way to install 是使用他们的 apt 存储库(即使在 15.10 上),不能使用wget强>”的东西。

                            【讨论】:

                            • 那个“wget”的东西只是把docker存储库放在你的apt源中......即要求您以“正确和正式的方式”手动执行相同的操作....
                            • 恐怕你错了,阿拉尔。 “wget”方法将在您的 apt 源中添加 docker 存储库,这很好,但它也会做许多其他不好的事情,例如设置 DOCKER_HOST 环境变量,这将阻止 docker 开箱即用地运行。不是因为这两种方法都将 docker 添加到 repo 中,所以它们都是相同的。
                            【解决方案24】:

                            在 Ubuntu 上安装 docker 后,我运行了以下命令:

                            sudo service docker start
                            

                            你试过了吗?

                            【讨论】:

                              猜你喜欢
                              • 2014-03-19
                              • 1970-01-01
                              • 1970-01-01
                              • 2016-04-04
                              • 2020-06-03
                              • 2017-06-14
                              • 1970-01-01
                              • 2021-10-27
                              • 1970-01-01
                              相关资源
                              最近更新 更多