1. 概述
Docker 在将应用程序及其所有依赖项打包成称为容器的轻量级实体方面提供帮助。我们可以在任何物理机、虚拟机甚至云中部署 Docker 容器。
在不同环境中使用 Docker 服务时,可能会遇到各种问题。
在本教程中,我们将学习 Docker守护程序连接问题。这是初学者经常遇到的非常常见的错误。我们还将查看导致此问题的原因以及如何解决它。
2. 了解问题
考虑一个情况,当我们尝试在 Linux 上运行未安装在机器上的命令时,会收到 命令未找到 错误消息。
这个问题的原因可能是命令实际上未安装在机器上,也可能是已安装但配置不正确。
让我们首先理解 Docker 守护程序(dockerd)。这是一个管理所有 Docker 对象的程序,包括图像、容器、卷等。
另一个实体是 Docker 客户端,它通过 Docker 守护程序帮助用户将命令传递给 Docker 服务。
在某些情况下,Docker 客户端无法连接到 Docker 守护程序。在这种情况下,Docker 抛出错误 无法连接到 Docker 守护程序。
无法连接到 Docker 守护程序的原因可能有很多。现在让我们深入探讨根本原因和解决此问题的不同方法。
3. 由于 Docker 服务未启动
导致此错误的最常见原因是当我们尝试访问 Docker 服务但其未启动时:
$ docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock.
Is the docker daemon running?
首先,我们将检查 Docker 服务的状态,看看是否正在运行:
$ systemctl status docker
docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: https://docs.docker.com
这里输出清楚地显示了 Docker 服务处于非活动状态。
我们现在将启动 Docker 服务。这在大多数情况下将解决问题。
3.1. 使用服务启动 Docker
通常,在通过 包管理器 安装 Docker 时,它会创建一个 Docker 服务。这使得管理 Docker 变得容易。
现在让我们使用 systemctl 服务命令启动 Docker:
$ systemctl start docker
我们可以使用以下命令检查 Docker 的状态:
$ systemctl status docker
docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2022-02-17 19:14:51 UTC; 1min 38s ago
Docs: https://docs.docker.com
Main PID: 1831 (dockerd)
Tasks: 8
Memory: 126.5M
CGroup: /system.slice/docker.service
└─1831 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
此命令显示 Docker 服务当前状态为活动(运行)。
3.2. 手动启动 Docker 守护程序
或者,我们也可以不通过服务启动 Docker。
我们只需要在后台运行 dockerd 命令即可:
$ sudo dockerd
INFO[2022-02-18T05:19:50.048886666Z] Starting up
INFO[2022-02-18T05:19:50.050883459Z] libcontainerd: started new containerd process pid=2331
INFO[2022-02-18T05:19:50.050943756Z] parsed scheme: "unix" module=grpc
我们需要确保以 sudo 权限运行 dockerd。
4. 由于权限不足
通过包管理器安装 Docker 时,默认会创建 docker 用户和组。为了访问 Docker,我们需要将当前用户添加到 docker 组中。
如果尝试从不在 docker 组中的用户访问 Docker 服务,我们会收到此错误:
$ docker ps
Got permission denied while trying to connect to the Docker daemon socket
at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json:
dial unix /var/run/docker.sock: connect: permission denied
要解决此问题,我们可以做两件事。要么将用户添加到 docker 组中,要么更新 Docker 套接字文件的权限。
现在让我们深入了解两种解决方案,附带示例。
4.1. 更新用户权限
用户权限是 Linux 中的一个重要概念。它们决定了不同用户对资源的可访问性。
在 Linux 上安装 Docker 时,会创建一个新的 docker 组,并将与 Docker 服务相关的所有包链接到此 docker 组。
如果在我们的机器上找不到默认的 docker 组,我们可以通过手动方式创建它:
$ sudo groupadd docker
上述命令将创建一个 docker 组。
现在我们将当前用户添加到 docker 组中:
$ sudo usermod -aG docker docker-test
这里的 -a 选项将用户 docker-test 添加到 docker 组中。-G 选项用于提及组名。
最后,我们重启 Docker 服务以使更改生效:
$ sudo service docker restart
4.2. 更新 Docker 套接字文件权限
我们还可以通过更改 /var/run/docker.sock 文件的所有权来解决问题:
$ sudo chown docker-test /var/run/docker.sock
请注意,我们运行此命令时需要具有 sudo 权限。否则,文件的权限不会更新。
5. 结论
在这篇文章中,我们学习了经常遇到的 Docker 守护程序连接问题。
当 Docker 服务未正确启动或我们没有适当的用户权限访问 Docker 服务时,会发生此问题。
我们通过将用户添加到 docker 组并将 sock 文件的所有权更改为解决此问题。