映射宿主机设备文件到 docker 容器需使用 --device 参数实现设备直通,如 --device /dev/ttyusb0:/dev/ttyusb0;gpu 需配合 nvidia-container-toolkit 和 --gpus 参数;设备节点须预先存在且权限正确,禁用 --privileged 等高危替代方案。

映射宿主机设备文件到 Docker 容器,核心是用 --device 参数让容器直接访问物理设备(如 USB 设备、GPU、串口、声卡等),而不是普通文件或目录。这不同于 -v 挂载路径,属于“设备直通”,需要明确指定设备节点路径和权限控制。
用 --device 显式挂载设备节点
Linux 下的设备以文件形式存在于 /dev/ 目录(如 /dev/ttyUSB0、/dev/nvidia0、/dev/snd)。运行容器时,用 --device 将其暴露给容器:
-
docker run --device /dev/ttyUSB0:/dev/ttyUSB0 my-app:把宿主机的 USB 串口设备映射进容器同名路径 -
docker run --device /dev/video0:/dev/video0 my-camera-app:让容器使用摄像头 - 支持权限修饰:
--device /dev/dri:/dev/dri:rwm(rwm表示读、写、mknod 权限,默认为rwm,可省略)
GPU 设备映射需额外配合 nvidia-container-toolkit
仅靠 --device 无法运行 CUDA 程序。必须:
- 宿主机已安装 NVIDIA 驱动和
nvidia-container-toolkit - 使用
--gpus参数(推荐):docker run --gpus all nvidia/cuda:11.8-base nvidia-smi - 或手动指定设备(不推荐):
docker run --device /dev/nvidiactl --device /dev/nvidia-uvm --device /dev/nvidia0 nvidia/cuda:11.8-base
注意设备节点存在性与权限
容器启动前,宿主机上对应设备节点必须真实存在且可被 Docker 进程访问:
-
ls -l /dev/ttyUSB0确认设备存在;若插拔后消失,需重新运行容器或用 udev 规则固化设备名 - 普通用户运行 Docker 时,可能无权访问
/dev/ttyUSB0,需将用户加入dialout组:sudo usermod -aG dialout $USER,然后重登 - 容器内应用需有对应设备文件的读写权限(如
chmod 666 /dev/ttyUSB0在宿主机设好,或容器内用udev规则)
替代方案:通过 --privileged 或 --cap-add(慎用)
不推荐,仅作了解:
-
--privileged开放全部设备访问权限,相当于容器拥有宿主机 root 权限,安全风险极高 -
--cap-add=SYS_ADMIN --cap-add=NET_ADMIN可提升特定能力,但不能替代--device对具体设备的精确控制 - 除非调试或嵌入式开发场景,否则应避免使用,优先走白名单式
--device











