原因

原因

我在使用 snap 安装 docker 时遇到了问题,于是我改用 apt。这是在生产服务器上。为了减少停机时间,我做了以下事情:

  1. 删除了 snap 运行容器
  2. 已经/snap/bin从...删除PATH
  3. 按照建议安装docker这里
  4. 重建并启动容器
  5. sudo snap stop docker使用和禁用 dockersudo snap remove docker

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

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

守护进程正在运行:

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

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

答案1

假设docker引擎的安装方式与官方文件

原因

在奔跑中dockerd

/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
                 ^^^^^^^

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

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

解决方案

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

ubuntu-linux-22-04-desktop:~$ sudo systemctl status docker

● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     Active: active (running) since Fri 2023-05-19 23:59:31 CST; 55s ago
...

然后,修改该文件中的以下行dockerd

sudo vim /lib/systemd/system/docker.service

在打开的文件中,找到以ExecStart=/usr/bin/dockerd

[Unit]
Description=Docker Application Container Engine
...

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

...

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

ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock --containerd=/run/containerd/containerd.sock

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

sudo systemctl daemon-reload

然后,重启docker daemon

sudo systemctl restart docker

docker daemon restart完成后,你应该能够看到套接字文件

ll /var/run/*.sock

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

docker ps

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

相关内容