守护程序运行时,为什么会出现“无法连接到Docker守护程序”的提示?


29

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与该服务有关的任何文件。

这可能是什么问题?

Answers:


36

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


1
没有真正的误导。它无法连接到docker守护程序。“守护程序正在运行吗?” 只是一个猜测而已。
布莱奇利'16


1
sudo gpasswd -a $ USER
docker

我这样做了,但还是没用。运行sudo systemctl start docker修复它,守护进程确实没有运行...
nakamin

32

这个问题已经得到解答,但这是另外的一条信息。

无论您使用的是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在Fedora上。检查系统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将自动使用它,即,将套接字的组设置为该组。如果它不存在,则只需创建它并重新启动守护程序:

# 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组中。)


1
这似乎无法回答原始问题。
l0b0

4
@ l0b0:好吧,我想解释为什么会这样,希望对某人有用。将用户添加到组的usermod命令隐藏在答案的中间。如果您认为此答案没有用,请告诉我,以便将其删除。
basic6 2016年

4
是的,它确实回答并解释了Arch的解决方案。
kodeart '16

我已经完成了所有这些工作,但仍然遇到OP提到的问题。没有任何与权限相关的步骤可以解决问题。
mopsyd

3

sudo usermod -aG docker [用户名]

然后注销然后重新登录


1

在对解决我的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

+1是一个完整的示例,尽管其中许多命令不适用于我的情况(使用pacman,使用+ systemctl代替service+进行安装chkconfig)。
l0b0

1

如果您使用的是Fedora 23或Redhat变体,请编辑/etc/sysconfig/docker并修改以下内容

OPTIONS='--selinux-enabled --log-driver=journald -G yourdockergroup'

重新启动docker。

确保将此组添加到系统,然后将自己添加到该组。



1

如果您使用以下命令启动docker引擎:sudo服务docker start

即使您已将自己添加到“ docker”组,也无法与普通用户建立连接。

您可以使用以下命令停止它:sudo service docker stop

并以普通用户身份启动:service docker start


到目前为止,我不必添加用户docker groupsudo service start为我工作。但是,将观察是否有新事物。
stupidnetizen

0

我也有同样的问题。问题出在分配给docker-daemon和docker-client的套接字中。

  1. 首先,未在docker.sock上为docker-client设置权限。您可以使用 sudo usermod -aG docker $USER

  2. 然后检查运行docker-client的bash文件。对我来说,它设置为0.0.0.0:2375,而docker-daemon在unix套接字上运行。(它是在dockerd的配置文件中设置的)。

  3. 只需注释掉有问题的行,它就可以正常工作。

  4. 但是,如果要使其在TCP端口而不是在Unix套接字上工作,请更改dockerd的配置文件,将其设置为0.0.0.0.2375,然后将其保留在bash中(如果存在)或将其设置为0.0。 0.0:2375。


0

这些是我要修复以下问题的步骤

$ docker info
Cannot connect to the Docker daemon at 
tcp://localhost:2375/usr/lib/systemd/system/docker.socket. Is the docker daemon running?
  1. 将您自己添加到Docker组

    usermod -aG docker $USER

  2. 修复docker socker和命令的权限。

    sudo chgrp docker /usr/bin/docker
    sudo chgrp docker /var/run/docker.sock

    $ ll $(which docker) -rwxr-xr-x 1 root docker 18991768 08.07.2017 22:57 /usr/bin/docker*

    $ ll /var/run/docker.sock srw-rw---- 1 root docker 0 23.07.2017 10:21 /var/run/docker.sock

  3. 将变量添加到docker命令的配置环境

    export DOCKER_HOST=unix:///var/run/docker.sock

  4. 休息Docker

    sudo systemctl restart docker

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.