AI服务器上为Docker配置GPU支持与资源限制
AI服务器上跑Docker,默认容器看不见GPU,直接docker run一个推理镜像通常只能用到CPU。
要让容器正确拿到显卡并限制资源争抢,核心是三件事:宿主机装好驱动和NVIDIA Container Toolkit、启动容器时显式分配GPU、用内存和CPU参数划清边界。
下面按顺序操作,最后给出验证方式。
先确认宿主机驱动和Docker状态
开始前需要宿主机已安装可用的NVIDIA驱动,并且Docker服务正常运行。
登录服务器后先检查:
nvidia-smi
docker version
nvidia-smi能输出GPU型号、显存和驱动版本,说明驱动层正常;
如果提示命令不存在或驱动加载失败,先解决驱动问题,不要急着改Docker配置。docker version能看到Client和Server两段信息,说明Docker已启动。
接着确认系统是否装过NVIDIA Container Toolkit,避免重复安装:
dpkg -l | grep nvidia-container-toolkit
没有输出再继续安装。
安装NVIDIA Container Toolkit并配置Docker
以Ubuntu/Debian系为例,先添加官方软件源再安装。
以下命令需要root权限,普通用户加sudo:
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
| sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
| sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
| sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
安装完成后让Docker识别新的运行时:
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
nvidia-ctk runtime configure会修改/etc/docker/daemon.json,把NVIDIA运行时注册进去。
重启Docker会影响正在运行的容器,生产环境建议在维护窗口操作,或先确认没有关键任务在跑。
启动容器时分配GPU并限制资源
最直接的方式是用--gpus参数。
只给容器一张卡:
docker run -it --rm \
--gpus '"device=0"' \
--memory 8g --memory-swap 8g \
--cpus 4 \
nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi
几个参数的含义:
--gpus '"device=0"':只把编号0的GPU交给容器,避免多容器抢占同一张卡。--memory 8g --memory-swap 8g:限制容器内存上限为8GB,且不允许使用swap,防止内存被悄悄换出拖慢推理。--cpus 4:限制容器最多使用4个CPU核心。
如果容器内需要看到全部GPU,改成--gpus all。
注意--gpus依赖前面配置好的NVIDIA运行时,没装工具链时这条命令会报错“could not select device driver”。
对于需要长期运行的服务,建议把参数写进docker-compose.yml或Kubernetes清单,而不是每次手敲。
Compose里通常通过deploy.resources.reservations.devices声明GPU,具体写法随Compose版本有差异,升级前先在测试环境验证。
验证GPU和内存是否按预期生效
容器启动后,先看容器内是否识别到GPU:
docker exec -it <容器名> nvidia-smi
输出中应只出现你分配的GPU。
再在宿主机查看资源占用:
docker stats --no-stream
观察MEM USAGE / LIMIT列,上限应接近你设置的8GB;CPU %在空闲时不会持续顶满。
如果内存限制没生效,检查是否漏写--memory,或容器是否以特权模式运行绕过了限制。
还可以用nvidia-smi在宿主机侧确认显存占用来自哪个进程,辅助判断容器是否真的在用GPU。
常见报错和容易踩的坑
报错“could not select device driver with capabilities: [[gpu]]”:说明Docker没有注册NVIDIA运行时。
重新执行nvidia-ctk runtime configure --runtime=docker并重启Docker,再检查/etc/docker/daemon.json里是否有nvidia运行时配置。
容器内nvidia-smi找不到命令:基础镜像里不一定带这个工具,换用带CUDA的镜像,或在容器内安装对应工具包。
这不是GPU没分配,先区分是工具缺失还是设备未挂载。
内存限制设了但仍然被OOM杀掉:--memory限制的是容器可见内存,如果程序通过共享内存或宿主机路径大量占用,限制可能不完整。
排查时结合docker stats和宿主机free -h一起看。
多容器争抢同一张GPU:--gpus all会让每个容器都看到全部卡,容易互相挤占显存。
按任务用device=0、device=1明确分配,或在编排层做GPU调度。
最后提醒一点:修改daemon.json和重启Docker前先备份原文件,涉及删除容器或重建服务时确认数据卷已持久化,避免配置调整影响线上推理服务。