使用 Docker 部署 GPU 与 Web 相机应用程序
引言
在操作系统中分发应用程序(尤其是 Python 应用)时,环境配置往往是极其关键的一环。如果像开发阶段那样手动配置,不仅工作量巨大,且容易出现各种兼容性问题。手动构建环境深受目标操作系统的版本、底层依赖库及文件系统的影响;此外,开发时使用的依赖包版本可能在发布时已更新,若未精确记录版本,极易导致线上运行故障。使用 Docker 可以有效隔离并固化运行环境,确保“一次构建,到处运行”。
安装和配置
要部署 GPU Docker 环境,首先需要安装 Docker,随后安装 NVIDIA Container Toolkit。
安装 Docker
参考官方文档:https://docs.docker.com/engine/install/ubuntu
安装 NVIDIA Container Toolkit
参考官方指南:https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker
在 Docker 中显示 GUI
若 Docker 容器内运行的是带有图形界面(GUI)的应用程序,则需要配置以允许容器访问宿主机的显示服务。
首先,在宿主机上授权 X Server 访问:
xhost +local:docker
或者使用更简单的(但不推荐用于生产环境):
xhost +
启动 Docker 时,需要挂载 X11 套接字并设置环境变量:
-v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY
完整启动命令示例:
docker run --name mydocker --gpus all --shm-size=1g --ulimit memlock=-1 -it -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY snn-server:basic
注:--gpus all 指定使用所有 GPU;若只需使用单块 GPU,可改为 --gpus 0。
在 Docker 中访问 USB 相机
若需在容器内调用宿主机的 USB 相机,需将设备路径映射到容器中:
-v /dev/video0:/dev/video0 --device=/dev/video0
完整命令示例:
docker run --name mydocker --gpus all --shm-size=1g --ulimit memlock=-1 -v /dev/video0:/dev/video0 --device=/dev/video0 -it -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY myimage:latest
在 Docker 镜像中开放端口
若要从宿主机访问容器内的服务,需进行端口映射:
-p 8080:8080
这将把宿主机的 8080 端口映射到容器内的 8080 端口。
开启更多 GPU 高级功能
若应用程序需要调用 GPU 的高级功能(如 nvcuvid 解码),且在运行时遇到 Cannot load libnvcuvid.so.1 错误,需在启动时显式声明驱动能力:
--runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all -e NVIDIA_DRIVER_CAPABILITIES=compute,utility,video
请确保宿主机驱动程序支持上述功能。
创建本地镜像仓库
对于体积巨大的镜像(通常在 GB 级别),直接从 Docker Hub 上传下载速度较慢。建议在局域网内搭建私有镜像仓库:
docker run -d -p 5000:5000 --restart=always --name xy-registry -v /home/centos/registry:/registry registry:latest
参数说明
-d: 后台运行。-p 5000:5000: 映射端口。--restart always: 设置容器自启。-v: 挂载宿主机目录,防止容器删除后镜像数据丢失。
上传镜像
docker commit container_id ip:port/image_name:tag
docker push ip:port/image_name:tag
回收空间
使用以下命令查看磁盘占用:
docker system df
清理无用镜像
清理所有悬空的镜像:
docker image prune
删除指定镜像
首先列出镜像:
docker images
删除指定 ID 的镜像:
docker rmi image_id
GPU Docker 与 Anaconda
若需在 GPU Docker 中使用 Anaconda,可采用以下两种方式:
1. 使用 Dockerfile 构建
FROM nvidia/cuda:11.3.0-devel-ubuntu20.04
# 添加依赖
RUN apt-get clean && apt-get update -y -qq
RUN apt-get install -y curl git build-essential
ENV PATH="/root/anaconda3/bin:${PATH}"
RUN curl --silent -O https://repo.anaconda.com/archive/Anaconda3-2023.03-Linux-x86_64.sh \
&& bash Anaconda3-2023.03-Linux-x86_64.sh -b -p /root/anaconda3
RUN pip install keras && conda install pygpu
RUN /bin/bash
2. 手动构建
拉取基础 GPU 镜像并手动安装配置,步骤同上。