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