3、容器技术基础:Docker核心概念、镜像与容器管理
3.1 核心概念:镜像、容器与仓库
在容器化GPU环境部署中,Docker是最常用的容器运行时。要理解Docker的工作方式,必须首先厘清三个核心概念:镜像(Image)、容器(Container)与仓库(Repository)。三者的关系可以类比为:镜像是一个只读的“模板”或“安装包”,容器是镜像运行后产生的“实例”,而仓库则是存放和分发镜像的“网盘”。
镜像采用分层结构构建,每一层都是只读的。当使用docker pull拉取镜像时,Docker会按层下载并缓存;当基于镜像启动容器时,Docker会在镜像层之上添加一个可写层(容器层)。所有对容器的修改(如安装CUDA库、写入配置文件)都发生在可写层,而镜像本身不会被改变。这种设计使得多个容器可以共享同一镜像的底层数据,极大节省了磁盘空间并加速了启动过程。
对于GPU环境而言,镜像中通常需要包含CUDA驱动库、cuDNN、Python解释器及PyTorch/TensorFlow等框架。但需要注意:镜像内不包含GPU内核驱动,驱动由宿主机提供,容器通过NVIDIA Container Toolkit挂载宿主机的驱动文件与GPU设备节点。
3.2 镜像管理:拉取、查看与构建
镜像管理是容器化GPU环境的基础操作。常用的镜像管理命令包括:
docker search <关键词>:在Docker Hub中搜索镜像,例如docker search pytorch。docker pull <镜像名>:<标签>:拉取镜像,GPU环境建议明确指定标签,如docker pull pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtime。docker images:查看本地已有的镜像列表,可看到镜像ID、大小和创建时间。docker rmi <镜像ID>:删除本地镜像。docker build -t <自定义名>:<标签> .:根据Dockerfile构建自定义镜像。
在GPU场景中,拉取镜像时需注意镜像标签的CUDA版本必须与宿主机驱动兼容。例如,宿主机驱动为535.xx时,最高支持CUDA 12.2,此时拉取nvidia/cuda:12.1-base是安全的;若驱动过旧而镜像CUDA版本过高,容器内程序将无法调用GPU。
Dockerfile 构建示例
当官方镜像无法满足需求时,可通过Dockerfile构建自定义镜像。以下是一个用于深度学习训练的Dockerfile片段:
FROM nvidia/cuda:12.1.0-cudnn8-devel-ubuntu22.04
ENV DEBIAN_FRONTEND=noninteractive
# 安装Python和pip
RUN apt-get update && apt-get install -y python3.10 python3-pip git
# 安装PyTorch(使用CUDA 12.1版本)
RUN pip3 install torch==2.1.0 torchvision==0.16.0 \
--index-url https://download.pytorch.org/whl/cu121
# 设置工作目录
WORKDIR /workspace
CMD ["/bin/bash"]
构建命令:docker build -t mydl:gpu-v1 .。构建过程中每一行指令都会生成一个新的镜像层,因此应尽量合并RUN指令以减少层数,缩小镜像体积。
3.3 容器管理:创建、启动与进入
容器管理是日常使用最频繁的操作。核心命令如下:
| 操作 | 命令示例 | 说明 |
|---|---|---|
| 创建并启动 | docker run --gpus all -it --name train_env pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtime | --gpus all使容器可访问所有GPU |
| 查看运行中容器 | docker ps | 加-a可查看所有容器 |
| 进入容器 | docker exec -it train_env bash | 在容器内执行交互式shell |
| 停止容器 | docker stop train_env | 发送SIGTERM信号 |
| 删除容器 | docker rm train_env | 需先停止容器 |
| 查看GPU映射 | docker inspect train_env | grep -i gpu | 确认设备挂载是否正确 |
docker run --gpus '"device=0,1"'可指定仅使用第0和第1号GPU;使用-v /data:/workspace/data可将宿主机的数据集目录挂载到容器内,避免重复拷贝。
3.4 案例:部署PyTorch GPU训练环境
下面通过一个完整案例演示从零部署PyTorch GPU训练环境的过程。
- 检查宿主机GPU驱动:执行
nvidia-smi确认驱动版本为535.xx及以上,并记录GPU型号。 - 拉取官方镜像:
docker pull pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtime,该镜像已预装PyTorch 2.1.0和CUDA 12.1。 - 创建并启动容器:
docker run --gpus all -it --name pytorch_gpu -v /home/user/data:/workspace/data pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtime - 验证GPU可用性:在容器内执行
python -c "import torch; print(torch.cuda.is_available()); print(torch.cuda.device_count())",若输出True和GPU数量,则环境配置成功。 - 运行训练脚本:将训练代码放入挂载目录,执行
python /workspace/data/train.py。
3.5 常见误区与复盘
--gpus参数让Docker自动挂载宿主机的驱动文件。
nvidia-smi右上角查看驱动支持的最高CUDA版本。
-v挂载数据卷保存代码、模型权重和日志,或使用docker commit将容器保存为新镜像。
复盘建议:在团队协作中,建议将Dockerfile和依赖清单(requirements.txt)纳入版本控制,确保任何成员都能构建出完全一致的环境。同时,定期执行docker system prune清理悬空镜像和停止的容器,避免磁盘空间被无用的中间层占满。