Docker 入门实操:30 分钟打包你的第一个 PyTorch 模型镜像
一、实操前置准备
1. 必备工具与环境
-
操作系统:Windows(需开启 WSL2)、MacOS(Intel/Apple Silicon 均可)、Linux(Ubuntu 18.04+ 推荐)
-
核心软件:Docker Desktop(Windows/Mac)/ Docker Engine(Linux),需提前安装并启动(验证:终端输入
docker --version显示版本即正常) -
辅助工具:文本编辑器(VS Code/记事本)、终端(CMD/PowerShell/终端)
-
Python 基础:无需提前配置 PyTorch 环境(Docker 会隔离环境,本地仅需确认能编写 Python 脚本)
2. 任务规划
|
操作内容 |
核心目标 | |
|
准备项目文件(模型脚本+依赖清单) |
搭建极简可运行的 PyTorch 项目 | |
|
编写 Dockerfile(核心步骤) |
定义镜像构建规则,理解每一行指令含义 | |
|
构建 Docker 镜像 + 验证镜像 |
生成可复用的 PyTorch 模型镜像 | |
|
运行容器 + 测试模型功能 |
验证镜像可用性,完成实操闭环 | |
3. 项目前置说明
本次实操采用 极简 PyTorch 预训练模型(ResNet18,无需手动训练,直接调用 torchvision 预训练权重),实现简单的图像推理演示,避免复杂模型训练耗时,确保 30 分钟内完成全部操作。
二、步骤 1:准备项目文件
1. 创建项目目录
首先在本地任意位置创建一个项目文件夹(命名为 pytorch-docker-demo),目录结构如下(手动创建对应文件,无需嵌套子目录):
pytorch-docker-demo/
├── test_pytorch.py # PyTorch 模型推理脚本
└── requirements.txt # 项目依赖清单


2. 编写 PyTorch 模型脚本([test_pytorch.py](test_pytorch.py))
复制以下极简推理代码到 test_pytorch.py,实现「加载 ResNet18 预训练模型 + 随机生成测试张量 + 完成推理预测」:
# test_pytorch.py
import torch
import torchvision.models as models
import torchvision.transforms as transforms
def main():
# 1. 确认 CUDA 可用性(无需实际 GPU,Docker 镜像内可识别)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"使用设备:{device}")
# 2. 加载 PyTorch 预训练 ResNet18 模型
model = models.resnet18(pretrained=True).to(device)
model.eval() # 切换为推理模式
print("ResNet18 预训练模型加载成功!")
# 3. 生成随机测试图像张量(模拟 3通道、224x224 输入图像)
test_tensor = torch.randn(1, 3, 224, 224).to(device) # batch_size=1, channels=3, H=224, W=224
# 4. 模型推理
with torch.no_grad(): # 关闭梯度计算,提升推理效率
output = model(test_tensor)
pred_class = torch.argmax(output, dim=1).item() # 获取预测类别索引
print(f"测试张量推理完成,预测类别索引:{pred_class}")
print("PyTorch 模型容器运行正常!")
if __name__ == "__main__":
main()

3. 编写依赖清单(requirements.txt)
列出项目所需 Python 包及指定版本(避免兼容性问题,适配 Docker 环境):
# requirements.txt
torch==2.0.1
torchvision==0.15.2
pillow==9.5.0

三、步骤 2:编写 Dockerfile(核心步骤)
在 pytorch-docker-demo 目录下,新建文件 Dockerfile(无后缀名,首字母大写),逐行编写如下内容,并理解每一行的核心含义(入门关键,不盲目复制)。
1. 完整 Dockerfile 内容
# 1. 选择基础镜像:轻量 Python 3.9 环境(slim 版本体积小,适合部署)
FROM python:3.9-slim
# 2. 设置工作目录:容器内的项目根目录(后续操作均在此目录下执行)
WORKDIR /app
# 3. 复制依赖清单文件到容器工作目录
COPY requirements.txt .
# 4. 安装项目依赖:使用 pip 安装,换国内清华源加速(解决国外源下载缓慢问题)
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 5. 复制本地所有项目文件(test_pytorch.py 等)到容器工作目录
COPY . .
# 6. 指定容器启动时默认执行的命令:运行 PyTorch 模型脚本
CMD ["python", "test_pytorch.py"]

2. 关键指令详解(入门必懂)
|
指令 |
作用说明 |
新手避坑 |
|
|
指定基础镜像(所有镜像都必须基于基础镜像构建) |
避免选择过大的基础镜像(如 python:3.9 比 python:3.9-slim 大很多) |
|
|
创建并进入容器内工作目录 |
后续 |
|
|
从本地复制文件到容器内 |
先复制 |
|
|
在容器内执行命令(此处为安装依赖) |
添加 |
|
|
容器启动时默认执行的命令 |
仅能有一个 |
四、步骤 3:构建 Docker 镜像
1. 进入项目目录
打开终端,通过 cd 命令进入 pytorch-docker-demo 目录(示例为 Mac/Linux 命令,Windows 类似):
# 示例:替换为你的项目实际路径
cd /home/ubuntu/pytorch-docker-demo

2. 执行镜像构建命令
使用 docker build 命令构建镜像,核心参数 -t 用于指定镜像名称和标签(格式:镜像名:标签,标签通常为版本号):
# 构建镜像,命名为 pytorch-first,标签为 v1.0,当前目录(.)为构建上下文
sudo docker build -t pytorch-first:v1.0 .

3. 构建过程说明
-
终端会逐行执行 Dockerfile 中的指令,每一步会生成一个「中间镜像」,最后生成最终镜像
-
若出现
Successfully built xxx+Successfully tagged pytorch-first:v1.0,说明构建成功
补充说明:为什么没有看到旧版成功提示?
这是 Docker 版本迭代导致的输出格式差异,并非构建失败:
旧版 Docker(20.x 及更早版本)构建成功后,会明确输出
Successfully built xxx(镜像 ID)和Successfully tagged xxx:xxx(镜像标签);新版 Docker(23.x 及以上版本)采用了更简洁的「进度条式输出」,将「镜像构建」「标签命名」「镜像解压」整合为
exporting to image步骤,不再单独输出那两行提示,但功能完全一致;构建日志中
naming to就是标签命名成功,unpacking to就是镜像构建完成,和旧版提示的含义完全相同。
-
常见问题排查:
-
报错
Docker daemon is not running:启动 Docker Desktop/Docker Engine -
依赖安装超时:检查网络,或确认
requirements.txt中包版本是否合法 -
命令报错
no such file or directory:确认终端在项目目录下,文件名称(大小写)无误
4. 验证镜像是否创建成功
执行 docker images 命令查看本地镜像列表,若能找到 pytorch-first 镜像,说明构建成功:
# 查看本地镜像
sudo docker images
# 预期输出(示例)
REPOSITORY TAG IMAGE ID CREATED SIZE
pytorch-first v1.0 abc123456789 2 minutes ago 1.2GB

五、步骤 4:运行容器 + 测试模型
1. 执行容器运行命令
使用 docker run 命令启动容器,基于我们构建的 pytorch-first:v1.0 镜像:
# 运行容器,--rm 表示容器停止后自动删除(测试环境推荐,避免残留无用容器)
docker run --rm pytorch-first:v1.0
2. 验证运行结果
若终端输出如下信息,说明容器正常运行,PyTorch 模型加载和推理均成功:
使用设备:cpu # 若本地有 GPU 并配置 Docker GPU 支持,会显示 cuda
ResNet18 预训练模型加载成功!
测试张量推理完成,预测类别索引:xxx # 索引值不固定,正常即可
PyTorch 模型容器运行正常!
3. 额外操作:进入容器内部(可选)
若想查看容器内的文件结构,可使用交互式运行命令进入容器:
# -it 开启交互式终端,/bin/bash 指定终端类型
docker run -it --rm pytorch-first:v1.0 /bin/bash
# 进入容器后,可执行以下命令查看文件
ls # 查看工作目录下的文件(应显示 test_pytorch.py、requirements.txt)
pwd # 查看当前工作目录(应显示 /app)
# 退出容器:输入 exit 即可
exit

六、常见问题排查(新手必看)
-
Docker 命令无权限(Linux)
解决方案:将当前用户添加到 docker 组,执行 sudo usermod -aG docker $USER,重启终端后生效。
-
Windows 下构建镜像报错「文件格式错误」
解决方案:VS Code 中设置文件换行格式为 LF(Docker 容器基于 Linux 环境,不支持 CRLF 换行)。
-
镜像体积过大
解决方案:使用 slim 基础镜像、--no-cache-dir 参数、清理冗余文件(如 RUN rm -rf /root/.cache/pip)。
-
GPU 无法识别(需 GPU 支持)
解决方案:安装 NVIDIA Container Toolkit,运行命令添加 --gpus all,如 docker run --rm --gpus all pytorch-first:v1.0。
七、实操总结与拓展
1. 核心成果
-
完成了「项目文件准备 → Dockerfile 编写 → 镜像构建 → 容器运行」的完整闭环
-
得到了第一个可复用的 PyTorch 模型镜像
pytorch-first:v1.0 -
理解了 Docker 核心指令的作用,掌握了 AI 模型容器化的入门方法
2. 后续拓展方向
-
镜像推送:将镜像推送到 Docker Hub/阿里云镜像仓库,实现跨环境共享
-
镜像优化:使用多阶段构建减小镜像体积,或基于
nvidia/cuda基础镜像支持 GPU 加速 -
服务化部署:将 PyTorch 模型封装为 API(FastAPI),通过 Docker 部署为可访问的推理服务
-
容器编排:使用 Docker Compose 管理多容器应用(如模型服务 + 监控工具)


浙公网安备 33010602011771号