我在使用 snap 安装 docker 时遇到了问题,于是我改用 apt。这是在生产服务器上。为了减少停机时间,我做了以下事情:
- 删除了 snap 运行容器
- 已经
/snap/bin
从...删除PATH
- 按照建议安装docker这里
- 重建并启动容器
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
在这种情况下,将没有套接字文件。但docker
cli 将尝试通过套接字文件连接到 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
docker
cli 现在应该可以工作了。尝试类似
docker ps
希望能够帮助解决您的问题。