当守护进程运行时,为什么我收到“无法连接到 Docker 守护进程”?

当守护进程运行时,为什么我收到“无法连接到 Docker 守护进程”?

Docker服务显然正在运行:

$ systemctl status docker.service 
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2015-12-28 19:20:50 GMT; 3 days ago
     Docs: https://docs.docker.com
 Main PID: 1015 (docker)
   CGroup: /system.slice/docker.service
           └─1015 /usr/bin/docker daemon -H fd:// --exec-opt native.cgroupdriver=cgroupfs
$ ps wuf -u root | grep $(which docker)
root      1015  0.0  0.3 477048 12432 ?        Ssl   2015   2:26 /usr/bin/docker daemon -H fd:// --exec-opt native.cgroupdriver=cgroupfs

然而,Docker 本身拒绝与它对话:

$ docker info
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

我正在运行默认 Docker 配置,也就是说,我没有更改/etc与此服务相关的任何文件。

这里可能有什么问题?

答案1

这个问题已经得到解答,但这里有一条附加信息。

无论您使用的是 Arch 还是 Fedora 或 Ubuntu 等其他发行版,Docker 都使用套接字文件进行通信。当您运行docker命令时,它使用此套接字与 Docker 守护进程通信。当然,守护进程必须正在运行(默认情况下它通常被禁用),但是如果您的用户无法访问套接字,它也将无法与守护进程进行通信。

您首先需要从发行版的存储库安装 Docker。有些人下载安装脚本并将其通过管道传输到 shell ( curl ... | sh),但建议从存储库安装它,以便可以轻松更新。

拱:

# pacman -S docker

软呢帽:

# dnf install docker

如上所述,守护进程可能默认被禁用。如果要使用 Docker,守护进程必须正在运行。

启用它(这样它将在启动时启动):

# systemctl enable docker

立即启动(或重新启动):

# systemctl start docker

现在,默认情况下(如果缺少 docker 组),Docker 套接字由 root 拥有:

# ls -la /var/run/docker.sock
srw-rw---- 1 root root 0 Apr 28 17:22 /var/run/docker.sock

这就是普通用户无法与 docker 守护进程对话的原因。普通用户没有足够的权限来访问套接字。它无法访问守护进程,因此假设它没有运行并显示以下错误:Cannot connect to the Docker daemon. Is the docker daemon running on this host?

这就是为什么许多人简单地以 root 身份启动所有 Docker 命令,使用sudo.但正如另一个答案中所述,Docker 有自己的机制,因此不需要使用 sudo。

docker理想情况下,安装 Docker 时会创建一个名为 的组。但是,如果启动守护程序时该组不存在,则套接字文件归 root 所有。

在某些情况下,该团体曾经有不同的名称,例如dockerroot在费多拉上。检查grep docker /etc/group您的系统上是否有这样的组。如果您已经在使用该组(您的用户位于其中),则需要配置 Docker 才能使用它:

在 中/etc/sysconfig/docker,添加-G dockerroot(注意:这是一种解决方法,而不是最佳解决方案):

OPTIONS='--selinux-enabled -G dockerroot'

重新启动守护进程后,您的用户将能够访问套接字:

# systemctl restart docker
# ls -la /var/run/docker.sock
srw-rw---- 1 root dockerroot 0 Apr 28 17:32 /var/run/docker.sock

否则,官方的方法是使用名为 的组docker。如果存在,Docker会自动使用它,即将socket的组设置为该组。如果它不存在,您所需要做的就是创建它并重新启动守护进程:

# groupadd docker
# systemctl restart docker

套接字文件将归该组所有:

# srw-rw---- 1 root docker 0 Apr 28 17:42 /var/run/docker.sock

您的用户必须位于该docker组中才能访问套接字:

# usermod -aG docker (user)

您可能需要注销并重新登录(或su - (user)),运行id以查看您是否在该组中。

然后您可以在没有 sudo/root 的情况下使用 Docker:

$ docker version --format '{{.Server.Version}}'
1.9.1

最后,警告一句。仅应允许受信任的用户控制您的 Docker 守护进程。看https://docs.docker.com/engine/security/security/
(当然,sudo 也是如此 - 只有受信任的用户才应该在wheel组中。)

答案2

你需要将您自己添加到docker群组中并激活该组(通过注销并再次登录或运行newgrp docker)来运行docker命令。该错误消息只是误导性的。

答案3

在对我的 Linux 系统上解决这个问题进行了一些研究之后,我想我会写这个答案。这是我为解决该问题所做的操作。

在 Fedora 22 上

安装 Docker:

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

安装 Docker 后:

需要将用户添加到 docker 组。

$> sudo usermod -aG docker

需要启动docker守护进程

$> sudo service docker start

您可以将守护进程设置为开机启动

$> sudo chkconfig docker on

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

$> service docker status

最后一次检查

$> docker run hello-world

答案4

这个命令对我有用

sudo grep dwalsh /etc/sudoers

alias docker="sudo /usr/bin/docker"

如果您需要更多文档,我在此页面中找到了解决方案。 为什么我们不允许非 root 用户在 CentOS、Fedora 或 RHEL 中运行 Docker

相关内容