【Docker & CUDA】Docker 守护进程无法启动与 CUDA 驱动掉线的修复指南
93 服务器的 docker 突然在一天的晚上停止了,目前原因尚未明确,但是发生的诸多修复纪实值得记录一番,主要遇到的有一下两个问题:
- Docker 无法重启
- CUDA 掉驱动
1、Docker 无法启动
1.1 问题描述
正常的 docker 重启服务是以下命令 sudo systemctl restart docker
,然后我想使用 docker ps
查看一下 docker 重启完毕没有,但是遇到了问题🙋,使得 docker 无法重新启动。具体问题如下:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
查遍了全网,问题是出在了一个 dockerd
文件上,但是是什么原因导致该文件会被修改,目前仍尚未清楚,先埋个坑。
1.2 Solutions
在我遇到的情况中,Docker 守护进程通过 systemctl 作为服务启动,可以使用 systemctl
命令找到服务文件路径,例如,(标记^^^
是我添加的,用于指向一行中的位置,它不是 shell 输出的一部分)。
sudo 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 Fri 2025-02-07 06:17:18 CST; 16h ago
Docs: https://docs.docker.com
Main PID: 28733 (dockerd)
Tasks: 160
Memory: 161.5G
CGroup: /system.slice/docker.service
├─28733 /usr/bin/dockerd -H unix:// --containerd=/run/containerd/containerd.sock
└─61323 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.17.0.4 -container-port 8080
找到了 docker service
这个文件的地址,cd 到这个位置
cd /usr/lib/systemd/system/
## cp一份留作备用
cp docker.service docker.service.cp
修改 docker service
文件
# 先查看一下docker service中的包含“ExecStart=/usr/bin/dockerd”的一行语句
cat /usr/lib/systemd/system/docker.service|grep ExecStart=/usr/bin/dockerd
""" 这是结果
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
"""
修改 “dockerd” 命令中的-H
参数以使用 Unix 套接字而不是fd
,将该行更改为, 需要修改的地方使用了^^
进行标注
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock --containerd=/run/containerd/containerd.sock
^^^
保存更改之后然后 reload
,最后 restart
sudo systemctl daemon-reload
sudo systemctl restart docker
docker ps
查看一下,发现启动成功
2、CUDA 掉驱动了
2.1 问题描述
我想重启我的镜像的时候,发现无法启动调用 CUDA 的镜像,但是单单使用 CPU的镜像可以被使用。具体报错如下:
docker start zhb_acrs_pst
Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: Auto-detected mode as 'legacy'
nvidia-container-cli: initialization error: nvml error: driver/library version mismatch: unknown
Error: failed to start containers: zhb_acrs_pst
赶紧打印看下 能不能使用 nvidia-smi
。发现出现了以下报错
nvidia-smi
Failed to initialize NVML: Driver/library version mismatch
NVML library version: 550.144
应该是显卡的驱动不匹配,但是我在 docker 重启之前,我的显卡驱动都是可以正常运行的。重新安装驱动的话需要重启服务器,这不大现实,因为还有其他的任务跑在服务器上。
那么还有没有一种不需要重启的方法?
2.2 Solutions
这个问题出现的原因是 kernel mod 的 Nvidia driver 的版本没有更新,一般情况下,重启机器就能够解决,如果因为某些原因不能够重启的话,也有办法 reload kernel mod。
简单来看,就两步:
- unload nvidia kernel mod
- reload nvidia kernel mod
执行来看就是两部:
1. kill NVIDIA related PID
2. sudo nvidia-smi
nvidia-smi 发现没有 kernel mod 会将其自动装载。
查看一下有哪些 PID
在使用 CUDA
$ lsof -n -w /dev/nvidia*
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
X 4041 root 12u CHR 195,255 0t0 32915 /dev/nvidiactl
X 4041 root 16u CHR 195,255 0t0 32915 /dev/nvidiactl
X 4041 root 17u CHR 195,0 0t0 19698 /dev/nvidia0
X 4041 root 18u CHR 195,0 0t0 19698 /dev/nvidia0
把这些进程 KILL
掉
kill 4041
然后重新运行一下 nvidia-smi
,这一步会自动重新 load kernel mod,稍微等一小会儿
$ nvidia-smi
Fri Feb 7 22:02:35 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.144.03 Driver Version: 550.144.03 CUDA Version: 12.4 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce RTX 3090 Off | 00000000:98:00.0 Off | N/A |
| 40% 46C P0 107W / 350W | 1MiB / 24576MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| No running processes found |
+-----------------------------------------------------------------------------------------+
修复成功!!!
3、后续问题
3.1 仍无法启动 含有 GPU 的 docker 镜像
正常启动镜像,还是不行,根据提示,应该是缺少了 nvidia-container
,root 命令下安装下即可
$ docker restart zhb_acrs_pst
Error response from daemon: Cannot restart container zhb_acrs_pst: exec: "nvidia-container-runtime-hook": executable file not found in $PATH
$ sudo yum install -y nvidia-docker2
···
Installed:
nvidia-docker2.noarch 0:2.13.0-1
Dependency Installed:
nvidia-container-toolkit.x86_64 0:1.16.1-1 nvidia-container-toolkit-base.x86_64 0:1.16.1-1
Complete!
再次重新启动,重启成功!!!
docker重启记录