在linux上用docker compose部署gpu容器需满足:宿主机装好nvidia驱动(≥470.x)、docker(≥20.10)及nvidia container toolkit并重启docker服务;compose v2.19+推荐用runtime: nvidia加deploy.resources.reservations.devices声明gpu,且runtime不可省略。

要在 Linux 上用 Docker Compose 部署支持 GPU 的容器应用,核心是让容器能访问宿主机的 NVIDIA GPU 设备和驱动,并加载对应的运行时(nvidia-container-runtime)。Docker 本身不原生支持 GPU,需依赖 NVIDIA Container Toolkit 实现。
确认宿主机环境已就绪
这是前提,缺一不可:
- 安装了与内核匹配的 NVIDIA 显卡驱动(建议 >= 470.x),运行
nvidia-smi能正常显示 GPU 状态 - 已安装 Docker(>= 20.10)且服务正在运行
- 已安装并配置 NVIDIA Container Toolkit,并重启了 docker daemon(
sudo systemctl restart docker) - 验证是否生效:运行
docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi,应输出 GPU 信息
在 docker-compose.yml 中启用 GPU 访问
从 Docker Compose v2.19+ 开始,原生支持 deploy.resources.reservations.devices 和简化的 gpus 字段。推荐使用简洁写法:
version: "3.8"
services:
my-ai-app:
image: pytorch/pytorch:2.1.2-cuda12.1-cudnn8-runtime
runtime: nvidia # 必须显式指定,尤其在旧版 Compose 或自定义 runtime 名时
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1 # 使用 1 块 GPU;也可设为 "all" 或具体 ID 如 "[0,1]"
capabilities: [gpu, compute, utility] # 至少包含 gpu
⚠️ 注意:runtime: nvidia 不可省略,否则即使声明了 devices,容器仍无法调用 CUDA。
兼容旧版 Compose 或需要精细控制时
若使用 Compose v2.18 及更早版本,或需绑定特定 GPU 设备、挂载驱动路径,可改用设备直通方式:
services:
my-ai-app:
image: nvidia/cuda:12.1.1-runtime-ubuntu22.04
# 手动挂载 GPU 设备与驱动库(不推荐,仅作备选)
devices:
- /dev/nvidia0:/dev/nvidia0
- /dev/nvidiactl:/dev/nvidiactl
- /dev/nvidia-uvm:/dev/nvidia-uvm
- /dev/nvidia-modeset:/dev/nvidia-modeset
volumes:
- /usr/lib/x86_64-linux-gnu/libcuda.so.1:/usr/lib/x86_64-linux-gnu/libcuda.so.1
- /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1:/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1
该方式耦合宿主机路径,移植性差,仅用于调试或受限环境。
启动并验证 GPU 容器
执行部署命令后,检查容器是否真正获得 GPU 权限:
- 启动服务:
docker compose up -d - 进入容器:
docker compose exec my-ai-app bash - 在容器内运行:
nvidia-smi(需镜像自带)或python -c "import torch; print(torch.cuda.is_available())" - 若返回
True且nvidia-smi输出正常,说明 GPU 已可用
如报错 “no NVIDIA GPU detected”,请回查驱动版本、container toolkit 是否启用、runtime 是否指定正确。











