这个问题已经得到解答,但这是另外的一条信息。
无论您使用的是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
组中。)