Docker
Docker 将代码、库和模型权重打包到容器镜像中,使其在笔记本电脑、GPU 服务器、CI 运行器和边缘设备上都能以相同方式运行。
Docker 是一个开源平台,可用于构建、共享和运行容器:容器是相互隔离的进程,带有自己的文件系统,其中包含代码、库和系统软件包,同时共享主机的操作系统内核。dotCloud(后来更名为 Docker, Inc.)于 2013 年 3 月将其开源;Docker 的命令行工具、分层镜像格式和公共注册表,让 Linux 容器成为开发者日常使用的工具。在机器学习中,Docker 镜像会固定 Python 版本、CUDA 库、PyTorch 构建版本和模型权重,让模型在笔记本电脑、GPU 服务器、持续集成运行器和边缘设备上表现一致。
Docker 的工作原理#
Dockerfile 会列出构建镜像的步骤:起始基础镜像、安装软件包的命令、要复制进来的文件,以及启动时要运行的命令。每条 RUN、COPY 或 ADD 指令都会添加一个只读层;后续构建会重复使用缓存层,直到某条指令或其输入文件发生变化。因此,较早安装的依赖会保留在缓存中,而应用代码只需几秒钟就能重新构建。镜像就是这些层及其元数据的集合。容器则是镜像的运行实例,其顶部有一个薄薄的可写层;除非将数据写入挂载卷,否则容器删除时,这一层也会被删除。
docker 命令会与 Docker Engine 通信;Docker Engine 是一个后台守护进程,会将每个容器交给 containerd 和底层的 runc 运行时处理。containerd 和底层的 runc 运行时使用 Linux 命名空间隔离容器的进程、网络和文件系统,并使用 cgroups 限制容器的 CPU 和内存。共享镜像的注册表包括 Docker Hub、GitHub Container Registry、NVIDIA NGC,以及各云服务提供商自己的注册表。这些镜像遵循开放容器倡议的镜像格式,因此 Podman、containerd 和 Kubernetes 均可直接运行这些镜像,无需修改。
Ultralytics 为每种硬件目标发布官方 Docker 镜像,包括 CUDA GPU、CPU、ARM64 开发板、NVIDIA Jetson 设备和 AMD GPU;每个镜像还会标记对应的 Ultralytics 版本号,以便实现可复现构建。下面使用的轻量级 latest-python 镜像已经包含 Python、PyTorch、ultralytics 软件包和 YOLO26 nano 权重,因此项目的 Dockerfile 只需添加自己的代码:
# Official Ultralytics CPU image with Python, PyTorch, ultralytics, and yolo26n.pt
FROM ultralytics/ultralytics:latest-python
# Install extra dependencies in their own layer, cached until requirements.txt changes
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy the application last, so code edits rebuild only this layer
COPY app.py .
# Command every container runs when it starts
CMD ["python", "app.py"]docker build -t yolo-app . 会将此文件及其同目录下的文件构建为镜像,而 docker run --rm yolo-app 会从镜像启动容器。将镜像推送到注册表后,其他任何机器都可以拉取并运行完全相同的环境,例如将其用作模型服务 API 或每晚运行的推理任务。
用于机器学习的 Docker#
容器通过 NVIDIA Container Toolkit 使用 GPU。NVIDIA 驱动程序保留在主机上,镜像只携带 CUDA 用户空间库;这些库必须受该驱动程序支持。在 Linux 上,Docker 28.2 及更高版本默认启用 CDI,因此 --device nvidia.com/gpu=all 会将 GPU 作为 CDI 设备请求,并让长时间运行的容器保持 GPU 访问能力;而旧版 --gpus all 标志在主机重新加载 systemd 时可能失效。
训练时还有两个设置很重要。PyTorch 数据加载器工作进程通过 /dev/shm 中的共享内存向训练进程传递批次数据,而 Docker 默认将共享内存限制为 64 MB,因此训练容器需要设置 --ipc=host 或使用更大的 --shm-size。数据集和输出文件应放在挂载卷中,因为如果训练运行将检查点写入容器内部,容器删除后这些文件也会丢失。使用固定的版本标签或镜像摘要,而不是 latest,可以让分布式训练任务或模型部署在所有机器上使用相同的镜像;NVIDIA Triton Inference Server 等推理服务器和 Vertex AI 等托管服务也都以容器镜像的形式运行模型。
Docker、虚拟机与 Kubernetes 的对比#
- 虚拟机:虚拟机监控程序会模拟硬件,每个 VM 都会启动自己的客户机内核。这种方式能更好地隔离工作负载,并允许使用任何客户机操作系统,但每个 VM 都需要完整的操作系统镜像,启动也更慢。由于容器共享主机的 Linux 内核,macOS 和 Windows 上的 Docker Desktop 会在轻量级 Linux VM 中运行容器。
- Docker Compose:定义在同一主机上协同运行的多个容器,例如推理 API、缓存和指标收集器。
- Kubernetes:在集群中调度容器、重启故障容器,并根据流量扩缩副本。Kubernetes 1.24 移除了 dockershim(其内置的 Docker Engine 适配器),因此集群通过 containerd 或 CRI-O 运行容器。Docker 构建的镜像仍可在其中运行,因为它们是标准 OCI 镜像。










