为什么在守护进程运行时出现“无法连接到 Docker 守护进程”?

l0b*_*0b0 37 arch-linux 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
Run Code Online (Sandbox Code Playgroud)

但是,Docker 本身拒绝与之交谈:

$ docker info
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
Run Code Online (Sandbox Code Playgroud)

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

这里可能有什么问题?

bas*_*ic6 49

这个问题已经得到了回答,但这里有一条额外的信息。

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

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

拱:

# pacman -S docker
Run Code Online (Sandbox Code Playgroud)

软呢帽:

# dnf install docker
Run Code Online (Sandbox Code Playgroud)

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

启用它(所以它会在启动时启动):

# systemctl enable docker
Run Code Online (Sandbox Code Playgroud)

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

# systemctl start docker
Run Code Online (Sandbox Code Playgroud)

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

# ls -la /var/run/docker.sock
srw-rw---- 1 root root 0 Apr 28 17:22 /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

OPTIONS='--selinux-enabled -G dockerroot'
Run Code Online (Sandbox Code Playgroud)

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

# systemctl restart docker
# ls -la /var/run/docker.sock
srw-rw---- 1 root dockerroot 0 Apr 28 17:32 /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)

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

# groupadd docker
# systemctl restart docker
Run Code Online (Sandbox Code Playgroud)

套接字文件将由该组拥有:

# srw-rw---- 1 root docker 0 Apr 28 17:42 /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)

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

# usermod -aG docker (user)
Run Code Online (Sandbox Code Playgroud)

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

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

$ docker version --format '{{.Server.Version}}'
1.9.1
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,它确实回答并解释了 Arch 的解决方案。 (6认同)
  • @l0b0:嗯,我想解释一下为什么会发生这种情况,希望它对某人有用。将用户添加到组的 usermod 命令隐藏在答案的中间部分。如果您觉得这个答案没有用,请告诉我,以便我可以将其删除。 (5认同)
  • 这应该是公认的答案 (2认同)

l0b*_*0b0 38

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

  • sudo gpasswd -a alex docker (2认同)