AI模型部署的”Docker时刻”:DockerModelRunner深度技术调研

admin 2025-12-25 02:54:45 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: Docker推出DockerModelRunner,通过OCI标准将模型打包为镜像,简化LLM部署。DMR利用Runner服务动态调度llama.cpp等推理引擎,解决依赖与分发痛点。尽管目前在编排监控方面存在局限,但其模型即镜像的理念极具前瞻性,适合企业尝试集成以提升AI基础设施标准化水平。 综合评分: 94 文章分类: AI安全,云安全,解决方案


cover_image

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 buildxdocker 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-models Volume
  • 可选: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

内部流程 :

  1. 生成 config.json(含格式、后端、量化信息);
  2. 构建 OCI manifest;
  3. 使用 ORAS SDK 将 GGUF 作为 layer 上传;
  4. 推送至 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深度技术调研》

评论:0   参与:  3