随着大语言模型(LLMs)在企业级应用中的快速普及,如何高效、安全、标准化地部署和管理这些模型,已成为基础设施团队面临的核心挑战。传统部署方式普遍存在以下痛点:
- 环境依赖复杂:不同的推理框架(如 llama.cpp、vLLM、TensorRT-LLM)对 CUDA 版本、Python 环境、系统库等有着各异且苛刻的要求。
- 模型分发困难:从 Hugging Face 等平台获取的模型文件通常以原始格式(如
.bin、.gguf)提供,缺乏有效的版本控制、权限管理和缓存机制。
- 部署流程碎片化:各业务团队往往自建推理服务,导致技术栈不统一,难以实施集中监控、弹性扩缩容和统一的安全策略。
为系统性地解决上述问题,Docker 官方推出了 Docker Model Runner(DMR)。该项目旨在将“模型”本身纳入成熟的容器生态体系,实现 “模型即镜像(Model-as-Image)” 的创新范式,有望成为AI基础设施领域的“Docker时刻”。
一、核心设计思想
1.1 模型即 OCI Artifact
DMR 的核心创新在于,它将大模型视为符合 OCI(Open Container Initiative)标准的 Artifact,而非常规的容器镜像。这意味着:
- 模型可以使用
oras(OCI Registry as Storage)协议进行存储与传输。
- 能够与现有的容器注册表(如 Docker Hub、GitHub Container Registry、Harbor 等)无缝集成。
- 可以充分利用 Docker 生态已有的内容寻址、分层缓存、签名验证等能力,保障模型的完整性与安全性。
注:OCI Artifacts 是 OCI 规范在 2023 年后扩展的重要方向,用于支持 Helm Charts、软件物料清单(SBOM)、Wasm 模块以及 ML 模型等非容器负载的标准化分发。
1.2 推理抽象层
DMR 本身并不直接执行模型推理计算。它通过一个常驻的 Runner 服务,作为协调器动态调度底层的专用推理引擎。这种抽象层设计带来了极大的灵活性:
| 模型格式 |
推理后端 |
启动方式 |
| GGUF |
llama.cpp |
调用 llama-server 或嵌入式 C++ 服务 |
| Safetensors / PyTorch |
vLLM |
启动 vllm.entrypoints.api_server |
| ONNX |
ONNX Runtime |
自定义适配器(规划中) |
这种设计使得应用开发者无需关心底层实现细节,只需通过统一的 Docker CLI 即可操作模型,显著降低了使用门槛。对于需要构建高性能AI服务后端的开发者,了解 Python 生态中的推理优化框架依然很有必要。
1.3 插件化架构
DMR 以 Docker CLI 插件 的形式集成(通过 docker model 子命令),完全遵循 Docker 的插件生态规范。这样做的好处包括:
- 无需修改 Docker Daemon 核心代码,保证稳定性。
- Runner 服务和 CLI 插件可以独立升级,互不影响。
- 能够与
docker buildx、docker compose 等现有工具链和平共存。
二、系统架构详解
2.1 组件拓扑图(逻辑视图)
+---------------------+
| User (CLI) |
| docker model pull |
| docker model run |
+----------+----------+
|
| HTTP/gRPC (localhost:12434)
v
+---------------------+
| Docker Model Runner |
| (Container Service) |
| - Manages /models |
| - Dispatches backends|
| - Exposes API |
+----------+----------+
|
| Mount Volume
v
+---------------------+
| docker-model-runner-models |
| (Persistent Volume) |
| - Stores GGUF, safetensors |
+---------------------+
2.2 关键组件说明
(1)docker-model-runner 容器
- 镜像来源:
docker/docker-model-runner(官方维护)
- 启动方式:由
docker model install-runner 脚本自动部署
- 端口映射:12434/tcp(默认 API 端口)
- 挂载点:
/models ← docker-model-runner-models 卷(Volume)
- 可选:GPU 设备(通过
--gpus all 传递给底层推理容器)
注意:Runner 容器本身不执行推理,而是作为协调器(Orchestrator)。在收到 run 请求后,它会动态拉起一个临时的推理容器(例如基于 vllm/vllm-openai 镜像),并将模型路径挂载进去。
通过 docker ps 可以查看 Runner 容器的运行信息:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
83952b3aa499 docker/model-runner:latest "/app/model-runner" 2 hours ago Up 2 hours 0.0.0.0:12434->12434/tcp docker-model-runner
(2)model_cli(即 docker model)
- 实质上是
/usr/libexec/docker/cli-plugins/docker-model 可执行文件。
- 与 Runner 服务通信采用本地回环 HTTP API(而非 Unix Socket,以支持跨平台)。
- 支持 JSON-RPC 风格的指令(内部协议未公开,但可通过抓包分析)。
(3)OCI 模型镜像结构剖析
以模型 dockerproxy.net/ai/qwen3:0.6B-Q4_K_M 为例,执行 docker model ls 可看到其摘要信息:
MODEL NAME PARAMETERS QUANTIZATION ARCHITECTURE MODEL ID CREATED CONTEXT SIZE
dockerproxy.net/ai/qwen3:0.6B-Q4_K_M 751.63 M IQ2_XXS/Q4_K_M qwen3 18e5114fc13b 7 months ago 456.11 MiB
其 OCI Manifest 文件结构示例如下:
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"config": {
"mediaType": "application/vnd.docker.ai.model.config.v0.1+json",
"size": 375,
"digest": "sha256:97d8b5b2bd52d2f240b8e1a57ea249a37262ae3bd1fd45bfc4bc0425bc9e96e9"
},
"layers": [
{
"mediaType": "application/vnd.docker.ai.gguf.v3",
"size": 484220000,
"digest": "sha256:ebfd42b196c529c3b692c549585e62cc6e817b5a5aff8375b3724cdfbafa651a"
},
{
"mediaType": "application/vnd.docker.ai.license",
"size": 11356,
"digest": "sha256:43070e2d4e532684de521b885f385d0841030efa2b1a20bafb76133a5e1379c1"
}
]
}
其中 config 层包含了模型的元数据:
{
"config": {
"format": "gguf",
"quantization": "IQ2_XXS/Q4_K_M",
"parameters": "751.63 M",
"architecture": "qwen3",
"size": "456.11 MiB"
},
"descriptor": {
"created": "2025-04-30T17:10:21.775494+02:00"
},
"rootfs": {
"type": "rootfs",
"diff_ids": [
"sha256:ebfd42b196c529c3b692c549585e62cc6e817b5a5aff8375b3724cdfbafa651a",
"sha256:43070e2d4e532684de521b885f385d0841030efa2b1a20bafb76133a5e1379c1"
]
}
}
三、实战:部署与运行模型
3.1 安装与部署 Runner
执行安装命令后,DMR 会自动拉取 Runner 服务镜像,并下载所需推理框架的依赖。
# 安装 Runner
docker model install-runner
# 如需重新安装
docker model reinstall-runner
3.2 运行模型
使用 docker model run 启动模型时,Runner 并不会立即加载模型,而是在客户端首次发起推理请求时才动态启动推理后端,这种方式有助于节省资源。
docker model run dockerproxy.net/ai/qwen3:0.6B-Q4_K_M
此时,CLI 将指令发送给 Runner,Runner 随后调用如 llama.cpp 等后端加载模型,启动命令类似:
/app/bin/com.docker.llama-server -ngl 999 --metrics --model /models/bundles/sha256/.../model.gguf --host inference-runner-0.sock --jinja
四、生态工具链深度整合
4.1 docker model package:封装自定义模型
此命令是 DMR 生态的关键入口,支持将本地的 GGUF 等格式模型封装为标准 OCI 模型。
docker model package \
--gguf ./mistral-7b.Q4_K_M.gguf \
--author "MyTeam" \
--description "Custom quantized Mistral" \
--push mycorp/mistral-7b:q4km
内部流程:
- 生成包含格式、后端、量化信息的
config.json。
- 构建 OCI manifest。
- 使用 ORAS SDK 将模型文件作为 layer 上传。
- 推送至指定的容器注册表。
据悉,支持多文件模型(如分词器 + 权重文件)的功能已在规划中。
4.2 与 Docker Compose 及编排系统的集成
目前,DMR 无法直接在 docker-compose.yml 文件中以服务形式声明模型,主要原因包括:
- 模型非可执行镜像:
ai/smollm2 这样的模型标识不能直接用于 docker run。
- 动态端口分配:推理服务的监听端口由 Runner 动态分配,并非固定。
- 依赖本地 Runner:Compose 中的服务容器难以直接访问宿主机的
localhost:12434 端口,在 Swarm 或 Kubernetes 环境中此问题更突出。
变通集成方案:
方案 A:Sidecar 模式
在 Compose 中同时启动 DMR Runner 和您的应用服务,应用通过环境变量获取 Runner 的地址。
version: '3.8'
services:
dmr-runner:
image: docker/docker-model-runner
ports:
- "12434:12434"
volumes:
- dmr-models:/models
restart: unless-stopped
my-ai-app:
build: .
depends_on:
- dmr-runner
environment:
- MODEL_RUNNER_URL=http://dmr-runner:12434
# 您的应用在此通过 API 调用 Runner 来启动和管理模型
volumes:
dmr-models:
这种将AI服务与核心业务逻辑解耦的架构模式,在构建现代化微服务应用时非常常见,类似于使用 云原生 技术栈中的服务网格思路。
方案 B:预启动模型(脚本化)
通过外部脚本预先启动模型,并将推理服务端口暴露给 Compose 网络中的其他服务使用。
#!/bin/bash
# pre-run.sh
docker model pull mycorp/mistral-7b:q4km
docker model run --detach --port 8080 mycorp/mistral-7b:q4km
随后,在 Compose 的其他服务中,即可直接访问 http://host.docker.internal:8080/v1/completions 进行推理。如果您的应用后端使用 FastAPI 等框架,可以很方便地集成此类HTTP API调用。
五、当前局限性
| 问题 |
说明 |
| 多模态支持缺失 |
目前仅支持文本类 LLM,不支持视觉、音频等多模态模型。 |
| 生产级编排集成弱 |
缺乏与 Kubernetes 深度集成的 Operator,无法实现声明式部署与管理。 |
| 资源监控指标缺失 |
无法方便地获取 GPU 显存使用率、Tokens/s 吞吐量等关键性能指标。 |
| 多模型并发受限 |
Runner 为单实例,高并发场景下可能成为瓶颈,目前缺乏横向扩展方案。 |
六、结论与展望
Docker Model Runner 代表了 AI 模型基础设施向云原生范式演进的关键一步。它并非旨在取代 vLLM、TGI 等高性能推理后端,而是在其之上构建了一层标准化的交付与运行时抽象。尽管目前在编排集成、可观测性等方面尚未成熟,但其“模型即 OCI Artifact”的核心理念极具前瞻性,为AI模型的版本化、安全分发和跨环境一致运行提供了坚实的基础框架。随着 人工智能 工程化进程的加速,此类工具的重要性将日益凸显。
附录:常用命令速查
# 安装与维护
docker model install-runner
docker model reinstall-runner
# 模型生命周期管理
docker model pull <model-name:tag>
docker model run <model-name:tag>
docker model ls
docker model rm <model-id>
# 自定义模型
docker model package --gguf ./model.gguf --push myorg/model:tag
附录:参考链接