Docker 命令无法连接到 Docker 守护进程

Posted

技术标签:

【中文标题】Docker 命令无法连接到 Docker 守护进程【英文标题】:Docker command can't connect to Docker daemon 【发布时间】: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,那肯定不适合我... :-( 我必须重新启动机器才能使其工作。 【参考方案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】:

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

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

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

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

    然后确保您使用以下方式授予自己 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】:
    我也遇到了同样的问题。问题出在分配给 docker-daemon 和 docker-client 的套接字中。 首先,在 docker.sock 上没有为 docker-client 设置权限您可以使用“sudo usermod -aG docker $USER”进行设置 然后检查 docker-client 运行的 bash 文件,对我来说它位于 0.0.0.0:2375,而 docker-daemon 在 unix socket 上运行。(它是在 dockerd 的配置文件中设置的)。 只需注释 bash 行即可。 但如果你想让它在 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

你试过了吗?

【讨论】:

以上是关于Docker 命令无法连接到 Docker 守护进程的主要内容,如果未能解决你的问题,请参考以下文章

无法连接到 Docker 守护程序。 docker 守护进程是不是在此主机上运行?

无法连接到 unix:/var/run/docker.sock 上的 Docker 守护程序。 docker 守护进程是不是正在运行?

Docker-Compose 无法连接到 Docker 守护进程

Mac OS X sudo docker 无法连接到 Docker 守护程序。 docker 守护进程是不是在此主机上运行?

无法连接到 tcp://localhost:2375/ 上的 Docker 守护程序。 docker 守护进程是不是正在运行。在 GitLab 上

无法连接到 macOS 上的 Docker 守护进程