By zhuhangbo, 7 February, 2025
Forums

【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。

简单来看,就两步:

  1. unload nvidia kernel mod
  2. 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!
    

再次重新启动,重启成功!!!

参考来源