【docker】docker下如何使用宿主主机的GPU

不能直接用,默认隔离;要装 NVIDIA 容器工具包并加参数才能用宿主机 GPU。


一、为什么默认不能用

Docker 容器默认用命名空间 + cgroups隔离:

  • 看不见 /dev/nvidia* 设备
  • 没有宿主机 CUDA 库和驱动
  • 必须靠 NVIDIA Container Toolkit 打通

二、前提(NVIDIA GPU)

  1. 宿主机装好 NVIDIA 驱动 (nvidia-smi 能跑)
  2. 安装 nvidia-container-toolkit(旧叫 nvidia-docker2)
  3. Docker ≥ 19.03 (支持 --gpus)
Ubuntu 安装示例
bash 复制代码
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt update
sudo apt install -y nvidia-docker2
sudo systemctl restart docker

三、启动容器(关键参数)

用 --gpus 分配 GPU:

bash 复制代码
# 所有 GPU
docker run --gpus all -it nvidia/cuda:12.0-base nvidia-smi

# 只给 GPU 0
docker run --gpus device=0 -it nvidia/cuda:12.0-base nvidia-smi

# 给 GPU 0 和 1
docker run --gpus device=0,1 -it nvidia/cuda:12.0-base nvidia-smi

四、容器里能用到什么

  • 直接用宿主机物理 GPU(性能接近原生)
  • 容器内只需装应用 + CUDA 运行时,不用装驱动
  • 支持 CUDA、cuDNN、TensorRT、FFmpeg 硬编解码等

五、你的场景(WebRTC / 音视频)

  • 如果是 NVIDIA GPU(如 Quadro、RTX) :
    • 装好驱动 + 工具包,加 --gpus all
    • 容器内可直接用 NVENC/NVDEC 硬编硬解,降低 CPU 占用
  • 如果是 i5-7400 核显(HD 630) :
    • Docker 对 Intel 核显支持有限,一般用 VA-API 直通
    • 启动加 --device /dev/dri,并挂载相关设备

六、一句话总结

默认隔离不能用;装 NVIDIA 工具包、用 --gpus 参数,容器就能直接调用宿主机 GPU 做硬编解码/AI 加速。

需要我给你一份可直接复制的安装和验证脚本吗?

结论先说:

Docker 18.09.7 不支持 --gpus 参数!

这个版本太老了,无法直接使用你刚才看到的现代 GPU 调用方式。


为什么不行?

  • --gpus all 这个参数是 Docker 19.03 版本才正式加入的
  • 你的 18.09.7 属于旧版本,没有这个功能

那你现在有 2 个方案(都能用)

方案1:升级 Docker(推荐,最简单)

直接把 Docker 升级到 19.03 以上 (现在都 26+ 了)

升级后一句 --gpus all 就能用 GPU,最省心。


方案2:不升级 Docker,用旧版 nvidia-docker2(兼容 18.09)

你的 18.09.7 可以用 nvidia-docker2,只是命令不一样:

1. 安装 nvidia-docker2(和刚才一样)
bash 复制代码
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt update
sudo apt install -y nvidia-docker2
sudo systemctl restart docker
2. 启动容器命令(必须用 --runtime=nvidia)
bash 复制代码
docker run --runtime=nvidia -it nvidia/cuda:12.0-base nvidia-smi

✅ 这样就能在 Docker 18.09 里用 GPU


给你总结最关键的

  • Docker 18.09.7 → 不支持 --gpus
  • 但支持 nvidia-docker2 → 用 --runtime=nvidia 就能调用宿主机 GPU
  • 性能和新版完全一样,只是命令不同

你如果不想升级 Docker

我可以直接给你:

  • 18.09 可用的 docker-compose.yml 配置 GPU
  • 18.09 可用的 FFmpeg + NVENC 硬解容器

需要吗?

好,我直接给你 Docker 18.09.7 能用、完全适配旧版 nvidia-docker2 的配置,包括:

  • docker-compose.yml 写法
  • 启动命令
  • 验证 GPU 是否成功的方法
  • 适合你音视频/WebRTC 场景的 FFmpeg 硬编解示例

全程不用升级 Docker。


1. 先确认你装好了 nvidia-docker2

如果还没装,执行这几句(复制粘贴即可):

bash 复制代码
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt update
sudo apt install -y nvidia-docker2
sudo systemctl restart docker

2. docker-compose.yml 配置(关键)

Docker 18.09 不支持 deploy.resources,只能用 runtime: nvidia。

yaml 复制代码
version: '2.3'  # 必须用 2.3,不能用 3.x

services:
  media-server:
    image: 你的镜像
    runtime: nvidia  # 核心:启用GPU
    environment:
      - NVIDIA_VISIBLE_DEVICES=all  # 使用所有GPU
      # 或只使用GPU0
      # - NVIDIA_VISIBLE_DEVICES=0
    ports:
      - "xxxx:xxxx"
    volumes:
      - ./xxx:/xxx

重点:

  • version: '2.3' 必须写
  • 用 runtime: nvidia
  • 用环境变量 NVIDIA_VISIBLE_DEVICES 控制显卡

启动命令还是你原来的:

bash 复制代码
docker-compose up -d

3. 测试容器是否能看到 GPU

bash 复制代码
docker run --rm --runtime=nvidia nvidia/cuda:11.4.1-base nvidia-smi

能正常显示显卡型号、驱动版本 → 成功。


4. FFmpeg 使用 NVENC 硬编、NVDEC 硬解(你音视频场景)

在容器内执行:

硬解码 H.264

bash 复制代码
ffmpeg -hwaccel nvdec -i input.mp4 -f null -

硬编码 H.264

bash 复制代码
ffmpeg -i input.mp4 -c:v h264_nvenc -b:v 5M output.mp4

硬编码 H.265 (HEVC)

bash 复制代码
ffmpeg -i input.mp4 -c:v hevc_nvenc -b:v 5M output.mp4

只要不报错,就是 GPU 正常工作。


5. 如果你用的是 Intel 核显(HD 630)

不用 nvidia,直接直通设备即可,docker-compose.yml:

yaml 复制代码
version: '2.3'
services:
  media-server:
    image: 你的镜像
    devices:
      - /dev/dri:/dev/dri  # 直通核显

容器内用 VA-API 硬解:

bash 复制代码
ffmpeg -hwaccel vaapi -i input.mp4 ...

最简单总结(你记这两句就行)

  • Docker 18.09 → 不能用 --gpus / deploy
  • 替代方案 → runtime: nvidia + NVIDIA_VISIBLE_DEVICES
  • docker-compose 必须用 version: '2.3'

你把你的 docker-compose.yml 发给我,我可以直接帮你改成能跑 GPU 的版本。

相关推荐
螺蛳粉 螺蛳粉5 小时前
第 02 篇:镜像分层与 containerd 2.x 实战:SystemdCgroup 与 pause 镜像配置踩坑(底座认知 02)
docker·云原生·容器·kubernetes·etcd·containerd·kube-apiserver
福建佰胜张工6 小时前
深度解析 Allen-Bradley 150-B135NBDA 智能电机控制器:选型、参数与工业应用
运维·数据库·单片机·嵌入式硬件·安全·自动化
wefg16 小时前
【Docker】镜像相关指令
运维·docker·容器
feng_you_ying_li6 小时前
linux之网络层
linux·运维·网络
未来之窗软件服务7 小时前
Linux 运维日志删除的多种方式—东方仙盟
linux·运维·服务器·仙盟创梦ide·东方仙盟
卓豪终端管理7 小时前
IT 运维视角下的终端数据安全:能力框架与落地清单
运维
小雉系统7 小时前
BcoreOS实战:用一个升级包,让Rocky Linux跑进Debian服务器
linux·运维·服务器·debian
甜到心里的蛋糕7 小时前
从 QQ 机器人到 B 站 AI 运营:一套可复现的视频流水线踩坑实录
运维·人工智能·python·自动化·视频制作
QYR-分析7 小时前
26.2% 高增!场内及园区无人物流车,厂内短驳自动化的 L4 货运载体
运维·自动化
java_logo7 小时前
Docker 部署 DPanel:轻松搭建轻量容器管理平台
运维·docker·容器·podman·容器管理·dpanel·轩辕镜像