如果 unix:///var/run/docker.sock 不可用且 docker 正在运行,如何连接到 Docker 守护进程

Dra*_*ile 6 linux apt docker snap

我在使用 snap 安装 docker 时遇到了问题,然后我转移到了 apt。这是在生产服务器上。为了减少停机时间,我执行了以下操作:

  1. 删除了快照运行容器
  2. /snap/bin已经从...删除PATH
  3. 按照此处推荐安装了 docker
  4. 重建并启动容器
  5. sudo snap stop docker使用和禁用 docker 的 snap 功能sudo snap remove docker

一切都很好。第二天,我尝试重新启动用于监控的容器,但运行时出现以下错误sudo docker ps -a

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
Run Code Online (Sandbox Code Playgroud)

守护进程正在运行:

root       42709  0.2  0.3 2344140 54276 ?       Ssl  Sep07   5:30 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root       42868  0.0  0.0 1813868 5944 ?        Sl   Sep07   0:16 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8072 -container-ip 172.19.0.3 -container-port 8072
Run Code Online (Sandbox Code Playgroud)

如何恢复对 docker 守护进程的控制?

Han*_* Ye 10

假设 docker 引擎的安装方式与官方文档类似。

\n

原因

\n

在你的奔跑中dockerd

\n
/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock\n                 ^^^^^^^\n
Run Code Online (Sandbox Code Playgroud)\n

(标记^^^是我添加的,用于指向行内的位置,它不是 shell 输出的一部分。)

\n

根据守护进程套接字选项 doc,这-H fd://意味着守护进程正在使用由 systemctl 管理的文件描述符。在这种情况下,不会有套接字文件/var/run/docker.sock。\n但是dockercli 会尝试通过docker.sock套接字文件连接到 docker 守护进程,这就是问题所在。

\n

解决方案

\n

在我遇到的情况下,docker守护进程是通过systemctl作为服务启动的,您可以使用systemctl命令找到服务文件路径,例如(^^^我添加了标记来指向一行中的位置,它\不是 shell 输出的一部分)

\n
/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock\n                 ^^^^^^^\n
Run Code Online (Sandbox Code Playgroud)\n

然后,修改该文件的 How dockerdis Bringed 行

\n
ubuntu-linux-22-04-desktop:~$ sudo systemctl status docker\n\n\xe2\x97\x8f docker.service - Docker Application Container Engine\n     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n     Active: active (running) since Fri 2023-05-19 23:59:31 CST; 55s ago\n...\n
Run Code Online (Sandbox Code Playgroud)\n

在打开的文件中,找到以以下内容开头的行ExecStart=/usr/bin/dockerd

\n
[Unit]\nDescription=Docker Application Container Engine\n...\n\n[Service]\nType=notify\n# the default is not to use systemd for cgroups because the delegate issues still\n# exists and systemd currently does not support the cgroup feature set required\n# for containers run by docker\nExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock\n\n...\n
Run Code Online (Sandbox Code Playgroud)\n

修改命令-H中的参数dockerd以使用 unix socket 而不是fd,将行更改为

\n
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock --containerd=/run/containerd/containerd.sock\n
Run Code Online (Sandbox Code Playgroud)\n

保存文件(在vim中,命令模型zz),然后重新加载

\n
sudo vim /lib/systemd/system/docker.service\n
Run Code Online (Sandbox Code Playgroud)\n

然后,重新启动 docker 守护进程

\n
[Unit]\nDescription=Docker Application Container Engine\n...\n\n[Service]\nType=notify\n# the default is not to use systemd for cgroups because the delegate issues still\n# exists and systemd currently does not support the cgroup feature set required\n# for containers run by docker\nExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock\n\n...\n
Run Code Online (Sandbox Code Playgroud)\n

docker daemon重启完成后,你应该能够看到socket文件

\n
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock --containerd=/run/containerd/containerd.sock\n
Run Code Online (Sandbox Code Playgroud)\n

dockercli 现在应该可以工作了。尝试类似的东西

\n
sudo systemctl daemon-reload\n
Run Code Online (Sandbox Code Playgroud)\n

希望能帮助解决您的问题。

\n

  • 非常感谢,您的答案是网络上最好的!根据文档,我们还可以监听多个套接字,这很好,不会破坏现有套接字 `ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H fd:// - -containerd=/run/containerd/containerd.sock` https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-socket-option (2认同)