文章总结: Docker推出DockerModelRunner,通过OCI标准将模型打包为镜像,简化LLM部署。DMR利用Runner服务动态调度llama.cpp等推理引擎,解决依赖与分发痛点。尽管目前在编排监控方面存在局限,但其模型即镜像的理念极具前瞻性,适合企业尝试集成以提升AI基础设施标准化水平。 综合评分: 94 文章分类: AI安全,云安全,解决方案
AI模型部署的”Docker时刻”:Docker Model Runner深度技术调研
原创
山竹
百晓安全
2025年12月23日 18:20 北京
从手动调参到一键部署,看Docker如何重新定义AI基础设施
一、背景与动机
随着大语言模型(Large Language Models, LLMs)在企业级应用中的快速普及,如何高效、安全、标准化地部署和管理这些模型成为基础设施团队的核心挑战。传统方式存在以下痛点:
- 依赖复杂:不同推理框架(如 llama.cpp、vLLM、TensorRT-LLM)对 CUDA、Python、系统库等有不同要求;
- 分发困难:Hugging Face 模型文件通常以原始格式(如
.bin、.gguf)提供,缺乏版本控制、权限管理和缓存机制; - 部署碎片化:每个团队自建推理服务,重复造轮子,难以统一监控、扩缩容和安全策略。
为应对上述问题,Docker 官方推出 Docker Model Runner(DMR),旨在将“模型”纳入容器生态体系,实现“模型即镜像(Model-as-Image)”的新范式。
二、核心设计思想
2.1 模型即 OCI Artifact
DMR 的核心创新在于将大模型视为 符合 OCI(Open Container Initiative)标准的 Artifact,而非传统意义上的容器镜像。这意味着:
- 模型可使用
oras(OCI Registry as Storage)协议进行存储与传输; - 支持与现有容器注册表(Docker Hub、GHCR、Harbor 等)无缝集成;
- 利用 Docker 的内容寻址、层缓存、签名验证等能力保障模型完整性与安全性。
注:OCI Artifacts 是 OCI 规范在 2023 年后扩展的重要方向,用于支持 Helm Charts、SBOM、Wasm Modules、ML Models 等非容器负载。
2.2 推理抽象层(Inference Abstraction Layer)
DMR 不直接运行模型,而是通过Runner 服务动态调度底层推理引擎。其抽象逻辑如下:
| 模型格式 | 推理后端 | 启动方式 |
| — | — | — |
| GGUF | llama.cpp | 调用 llama-server或嵌入式 C++ 服务 |
| Safetensors / PyTorch | vLLM | 启动 vllm.entrypoints.api_server |
| ONNX | ONNX Runtime | 自定义适配器(未来支持) |
这种设计使得用户无需关心底层实现,只需通过统一 CLI 操作模型。
2.3 插件化架构
DMR 以Docker CLI 插件形式集成(通过docker model子命令),符合 Docker 的插件生态规范。其优势包括:
- 无需修改 Docker Daemon;
- 可独立升级 Runner 和 CLI;
- 与
docker buildx、docker compose等工具共存。
三、系统架构详解
3.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 |
+---------------------+
3.2 关键组件说明
(1)docker-model-runner 容器
- 镜像来源:
docker/docker-model-runner(官方维护) - 启动方式:由
docker model install-runner脚本自动部署 - 端口映射:
12434/tcp(默认 API 端口) - 挂载点:
/models←docker-model-runner-modelsVolume- 可选:GPU 设备(通过
--gpus all传递给底层推理容器)
注意:Runner 本身不执行推理,而是作为协调器(Orchestrator),在收到run请求后,动态拉起一个临时推理容器(如基于vllm/vllm-openai镜像),并将模型路径挂载进去。
docker ps 查看信息如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
83952b3aa499 docker/model-runner:latest "/app/model-runner" 2 hours ago Up About an hour 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
模型汇总文件内容(models.json):
{
"models": [
{
"id": "sha256:18e5114fc13b1abd44b7fa36e24c951ab31c66d4aeccf3f6836a97f99f339923",
"tags": [
"dockerproxy.net/ai/qwen3:0.6B-Q4_K_M"
],
"files": [
"sha256:ebfd42b196c529c3b692c549585e62cc6e817b5a5aff8375b3724cdfbafa651a",
"sha256:43070e2d4e532684de521b885f385d0841030efa2b1a20bafb76133a5e1379c1",
"sha256:97d8b5b2bd52d2f240b8e1a57ea249a37262ae3bd1fd45bfc4bc0425bc9e96e9"
]
}
]
}
DMR 模型镜像包含:
{
"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"
]
}
}
四、部署模型
4.1 部署
安装的时候会拉去runner的镜像以及runner会下载对应的推理框架的依赖文件
# 安装 Runner
docker model install-runner
# 重新安装
docker model reinstall-runner
4.2 启动模型
docker model run执行之后,model runner并不会立马将模型加载,而是在客户端第一次发送消息之后才会启动:
docker model run dockerproxy.net/ai/qwen3:0.6B-Q4_K_M
docker model cli执行启动模型发送给model runner, model runner会调用推理框架加载模型,命令如下:
/app/bin/com.docker.llama-server -ngl999 --metrics --model /models/bundles/sha256/18e5114fc13b1abd44b7fa36e24c951ab31c66d4aeccf3f6836a97f99f339923/model/model.gguf --host inference-runner-0.sock --jinja
五、生态工具链深度整合
5.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 将 GGUF 作为 layer 上传;
- 推送至 registry。
“
支持多文件模型(如 tokenizer + weights)正在规划中。
5.2 与 Docker Compose 的兼容性分析
当前 DMR 无法直接在 docker-compose.yml 中声明模型服务 ,原因如下:
| 限制点 | 说明 |
| — | — |
| 模型非可执行镜像 | ai/smollm2 不能直接 docker run,需 Runner 解析 |
| 动态端口分配 | 推理服务端口由 Runner 动态分配,非固定 |
| 依赖本地 Runner | Compose 服务无法直接调用 localhost:12434(尤其在 Swarm/K8s 环境) |
变通方案(推荐)
方案 A:Sidecar 模式
# docker-compose.yml
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:
方案 B:预启动模型(脚本化)
#!/bin/bash
# pre-run.sh
docker model pull mycorp/mistral-7b:q4km
docker model run --detach --port 8080 mycorp/mistral-7b:q4km
# 然后在 compose 中直接访问 http://localhost:8080/v1/completions
#
六、局限性
当前局限
| 问题 | 说明 | | — | — | | 多模态支持缺失 | 仅支持文本 LLM,不支持图像/音频模型 | | 编排系统集成弱 | 无 Kubernetes Operator,无法声明式部署 | | 资源监控缺失 | 无法获取 GPU 显存、Token/s 等指标 | | 多模型并发受限 | Runner 单实例,高并发需横向扩展(未支持) |
七、结论
Docker Model Runner 代表了AI 模型基础设施向云原生演进的关键一步。它并非要取代 vLLM 或 TGI,而是构建在其之上的一层标准化交付与运行时抽象。尽管当前在编排、可观测性等方面尚不成熟,但其“模型即 OCI Artifact”的理念极具前瞻性。
附录 A:常用命令速查
# 安装
docker model install-runner
# 拉取 & 运行
docker model pull ai/smollm2
docker model run ai/smollm2
# 自定义模型发布
docker model package --gguf model.gguf --push myorg/model:tag
# 查看本地模型
docker model ls
附录 B:参考链接
- DMR GitHub: https://github.com/docker/docker-model-runner
- OCI Artifacts: https://github.com/opencontainers/artifacts
- Docker Model CLI Docs: https://docs.docker.com/reference/cli/docker/model/
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:百晓安全 山竹《AI模型部署的”Docker时刻”:Docker Model Runner深度技术调研》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论