方案类型:Docker + NVIDIA Container Toolkit(GPU 容器化) GPU 规划:8 张 RTX 4090,分配给 4 个容器,每个容器 2 张 宿主系统:Linux(推荐 Ubuntu Server 22.04 / 24.04) 适用业务:AI 训练/推理、CUDA 计算、深度学习、Linux 渲染/转码等 文档版本:v1.0 | 日期:2026-06-03


一、方案概述

宿主机(Linux)安装一套 NVIDIA 驱动,通过 NVIDIA Container Toolkit 让 Docker 容器直接调用物理 GPU。为 4 个容器各分配 2 张 4090,容器内即可使用 GPU 进行计算。

核心优势(相比 VM 透传)

对比项

VM 透传

Docker(本方案)

IOMMU/VFIO/BIOS 配置

复杂、易卡住

完全不需要

4090 大显存 BAR/MMIO 坑

没有

GPU 分配

独占、不灵活

灵活,可重分配/共享

性能损耗

接近裸机

R720 老平台适配

透传兼容性存疑

基本无障碍

部署复杂度

容器规划

容器名

分配 GPU(卡号)

用途

app01

0, 1

按需

app02

2, 3

按需

app03

4, 5

按需

app04

6, 7

按需

⚠️ 前提说明

  1. 容器只能跑 Linux(共享宿主内核),无法在容器内运行 Windows。

  2. 容器共享宿主内核,隔离性弱于 VM;自用/可信业务足够,强多租户隔离需求建议 VM。

  3. 宿主机的 NVIDIA 驱动版本对所有容器生效(容器内只带 CUDA runtime,不带驱动)。


二、整体流程

①宿主机装 Linux(Ubuntu Server)
        ↓
②宿主机安装 NVIDIA 官方驱动(识别 8 张 4090)
        ↓
③安装 Docker Engine
        ↓
④安装 NVIDIA Container Toolkit
        ↓
⑤验证容器能访问 GPU
        ↓
⑥创建 4 个容器,各分配 2 张卡
        ↓
⑦容器内验证 nvidia-smi 正常


三、第一步:宿主机安装 Linux

  1. 安装 Ubuntu Server 22.04 LTS 或 24.04 LTS(驱动/生态支持最好)。

  2. 配置静态 IP、主机名、SSH。

  3. 更新系统:

    sudo apt update && sudo apt -y upgrade

四、第二步:安装 NVIDIA 驱动(宿主机)

1. 禁用开源 nouveau 驱动

echo -e "blacklist nouveau\noptions nouveau modeset=0" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf
sudo update-initramfs -u
sudo reboot

2. 安装官方驱动

方式 A:Ubuntu 仓库(简单)

# 自动推荐
sudo ubuntu-drivers devices
# 安装推荐版本(或指定,如 nvidia-driver-550 及以上以支持 4090)
sudo apt install -y nvidia-driver-550
sudo reboot

方式 B:NVIDIA 官网 .run 包(拿最新版) 从 nvidia.com 下载对应 4090 的最新数据中心/桌面驱动安装。

3. 验证宿主机识别 8 张卡

nvidia-smi

应列出 8 张 RTX 4090(GPU 0~7)及显存、温度等。

✅ 这一步成功,意味着最难的硬件层全部就绪——后面只是软件配置。


五、第三步:安装 Docker Engine

# 卸载旧版本(如有)
sudo apt remove -y docker docker-engine docker.io containerd runc 2>/dev/null

# 安装依赖并添加官方源
sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 验证
sudo docker run hello-world


六、第四步:安装 NVIDIA Container Toolkit

这是让 Docker 用上 GPU 的关键组件。

# 添加 NVIDIA Container Toolkit 源
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 update
sudo apt install -y nvidia-container-toolkit

# 配置 Docker 使用 NVIDIA runtime
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker


七、第五步:验证容器能访问 GPU

# 在容器里跑 nvidia-smi,应看到全部 8 张卡
sudo docker run --rm --gpus all nvidia/cuda:12.4.1-base-ubuntu22.04 nvidia-smi


八、第六步:创建 4 个容器,各分配 2 张卡

方式 A:docker run 直接起(4 条命令)

# 容器 app01 → GPU 0,1
docker run -d --name app01 --gpus '"device=0,1"' \
  --restart unless-stopped \
  -v /data/app01:/workspace \
  nvidia/cuda:12.4.1-base-ubuntu22.04 sleep infinity

# 容器 app02 → GPU 2,3
docker run -d --name app02 --gpus '"device=2,3"' \
  --restart unless-stopped \
  -v /data/app02:/workspace \
  nvidia/cuda:12.4.1-base-ubuntu22.04 sleep infinity

# 容器 app03 → GPU 4,5
docker run -d --name app03 --gpus '"device=4,5"' \
  --restart unless-stopped \
  -v /data/app03:/workspace \
  nvidia/cuda:12.4.1-base-ubuntu22.04 sleep infinity

# 容器 app04 → GPU 6,7
docker run -d --name app04 --gpus '"device=6,7"' \
  --restart unless-stopped \
  -v /data/app04:/workspace \
  nvidia/cuda:12.4.1-base-ubuntu22.04 sleep infinity
  • --gpus '"device=0,1"':指定该容器只能看到 0、1 号卡(注意引号写法)

  • --restart unless-stopped:宿主重启后容器自动拉起

  • -v:挂载宿主目录做数据持久化

  • 实际镜像换成你的业务镜像(如 pytorch/pytorch、tensorflow 等)

方式 B:docker-compose(推荐,便于管理)

新建 docker-compose.yml

services:
  app01:
    image: nvidia/cuda:12.4.1-base-ubuntu22.04
    container_name: app01
    command: sleep infinity
    restart: unless-stopped
    volumes:
      - /data/app01:/workspace
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              device_ids: ["0", "1"]
              capabilities: [gpu]

  app02:
    image: nvidia/cuda:12.4.1-base-ubuntu22.04
    container_name: app02
    command: sleep infinity
    restart: unless-stopped
    volumes:
      - /data/app02:/workspace
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              device_ids: ["2", "3"]
              capabilities: [gpu]

  app03:
    image: nvidia/cuda:12.4.1-base-ubuntu22.04
    container_name: app03
    command: sleep infinity
    restart: unless-stopped
    volumes:
      - /data/app03:/workspace
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              device_ids: ["4", "5"]
              capabilities: [gpu]

  app04:
    image: nvidia/cuda:12.4.1-base-ubuntu22.04
    container_name: app04
    command: sleep infinity
    restart: unless-stopped
    volumes:
      - /data/app04:/workspace
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              device_ids: ["6", "7"]
              capabilities: [gpu]services:

启动:

docker compose up -d

九、第七步:验证每个容器的 GPU 分配

# 逐个容器查看,应各自只看到 2 张卡
docker exec app01 nvidia-smi -L
docker exec app02 nvidia-smi -L
docker exec app03 nvidia-smi -L
docker exec app04 nvidia-smi -L

每个容器应只列出属于自己的 2 张 4090

验证清单

  • not done宿主机 nvidia-smi 显示全部 8 张卡

  • not done测试容器 --gpus all 能看到 8 张卡

  • not done4 个容器各自只看到分配的 2 张卡

  • not done容器内可正常跑 CUDA 程序 / 框架(如 torch.cuda.is_available() 为 True)

  • not done宿主重启后容器自动恢复

  • not doneGPU 负载/压力测试通过


十、日常管理常用命令

# 查看容器状态
docker ps

# 查看宿主所有 GPU 实时占用
nvidia-smi
watch -n1 nvidia-smi          # 实时刷新

# 进入容器
docker exec -it app01 bash

# 重启 / 停止 / 删除容器
docker restart app01
docker stop app01
docker rm -f app01

# 查看某容器日志
docker logs app01


十一、进阶能力(Docker 的灵活性)

Docker 在 GPU 分配上比 VM 灵活得多,按需可用:

需求

做法

调整某容器的卡

--gpus device= 重建容器即可,秒级生效

多个容器共享同一张卡

多个容器指定同一 device 号(显存自行协调)

限制显存

在框架层限制,或用 CUDA 环境变量

给容器全部 8 卡

--gpus all

按算力切分一张卡

4090 不支持 MIG(数据中心卡才支持),可用 MPS/时间片共享

💡 相比 VM 透传"一张卡焊死给一台机",Docker 可以随时重新分配 GPU,运维灵活性高一个量级。


十二、注意事项

  1. 驱动版本统一:宿主装一套驱动对所有容器生效,需选支持 4090 的较新版本(建议 550+)。容器镜像里的 CUDA 版本需 ≤ 宿主驱动支持的 CUDA 版本。

  2. 隔离性:容器共享宿主内核,安全边界弱于 VM;多租户强隔离场景再考虑 VM。

  3. R720 平台:Docker 不依赖透传,老平台适配无障碍;但 PCIe 3.0 与老 CPU 仍可能在高吞吐场景成为瓶颈(与方案无关,是硬件本身)。

  4. NVIDIA 驱动授权:GeForce 驱动用于数据中心/商业场景仍有 EULA 限制,商用生产请核对 NVIDIA 许可条款(这点与是否用 Docker 无关)。

  5. 数据持久化:容器删除即丢失内部数据,重要数据务必用 -v 挂载到宿主目录或数据卷。

  6. 散热/供电:8 卡满载的物理条件你已验证通过,沿用即可。


十三、三方案最终对比(备查)

维度

VM 透传

Docker(推荐)

裸机

部署难度

最低

跑 Windows

❌ 仅 Linux

GPU 分配灵活

极好

性能

最好(近裸机)

原生

隔离性

老平台/4090 适配

坑多

基本无坑

已验证


文档结束。确定业务镜像(PyTorch / TensorFlow / 自有镜像等)后,可把基础镜像替换为实际业务镜像并补充端口映射、环境变量等配置。

文章作者: 楚少爱看雪
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 楚少爱看雪
学习 Study
喜欢就支持一下吧