← 返回首页

Docker Model Runner 架构解剖:三引擎怎么选

Docker Model RunnerDocker DesktopAI

Docker 把本地大模型塞进了容器的世界观里。以前 Ollama 是一个需要单独装、单独开服务、独立占端口的「进程」;Docker Model Runner(DMR)换了个思路:模型变成一个 OCI 制品,用 docker model 这套命令管,接口直接暴露成 OpenAI 兼容端点,挂回 12434 端口。这个变化看着只是换了个命令行,实际上把「本地跑模型」这件事的边界重新划了一次。下面按 Docker 官方文档逐项拆解,包括三个引擎的能力差异,以及我在文档里挖到的、官方自己写明的限制。

TL;DR:

-默认引擎 llama.cpp 就够用:支持 GGUF 格式、全平台(macOS/Windows/Linux)、是 DMR 里唯一支持纯 CPU 推理的引擎,装好即用不需要额外配置。

-vLLM 只在你有 NVIDIA GPU 时才有意义:仅支持 Linux x86_64(Windows 需 WSL2 + Docker Desktop 4.54+),仅支持 Safetensors 格式,官方明确写了不支持 CPU-only 推理。

-Diffusers 只管图像生成:用 DDUF 格式,管 Stable Diffusion 这类扩散模型,不做文本生成,同样不支持 CPU 推理。

-容器内连不上多数不是 bug:容器要用的地址是 http://model-runner.docker.internal,不是localhost——宿主机进程才用 localhost:12434,这是两个完全不同的口径。

-部署红线:DMR 的 API默认没有任何鉴权,官方文档写明它会忽略 Authorization 头。不要把12434 端口暴露到局域网或公网。

一、DMR 到底改变了什么:从「进程」到「制品」

理解 DMR 最快的方式,是先看它把什么东西换掉了。

Ollama 的模型是一个独立服务,你用 ollama run 拉起一个进程,它监听自己的端口,模型存放在自己的目录里。你的应用通过网络去调它——如果应用本身也在容器里,就得额外配置容器到宿主机的网络通路。

DMR 的做法不同。官方文档的表述是:模型被打包为 OCI 制品(package GGUF files as OCI Artifacts),通过 docker model 这组命令拉取和运行,对外暴露 OpenAI 兼容接口。这个差异带来的直接后果是:已经标准化使用 Docker 的团队,不需要再运维一个「额外的服务」。

三个官方命令构成了基本工作流:

docker model pull ai/llama3.2:3B-Q4_K_M   # 拉取模型
docker model run ai/smollm2                # 运行
docker model status                        # 查看各引擎状态

docker model status 的输出长这样,它会逐个引擎报告装没装:

Docker Model Runner is running
Status: llama.cpp: running
        llama.cpp version: 34ce48d
        mlx: not installed
        sglang: sglang package not installed
        vllm: ...

如果你想要非默认的后端,官方提供 install-runner:

docker model install-runner --backend vllm --gpu cuda

--backend 接受 llama.cpp、vllm、diffusers;--gpu 接受 cuda、rocm、vulkan、metal(具体可用值取决于平台)。官方同时给了一条包模型进registry 的命令,走 OCI 分发的团队会用得上:

docker model package --gguf ./model.gguf --push myorg/mymodel:Q4_K_M

二、三引擎对比表:官方原表逐项对照

这是官方文档里的引擎对比表原样内容,我只做翻译与批注,不改动任何数值:

特性llama.cppvLLMDiffusers
模型格式GGUFSafetensors、HuggingFaceDDUF
平台全部(macOS、Windows、Linux)仅 Linux x86_64Linux(x86_64、ARM64)
GPU 支持NVIDIA、AMD、Apple Silicon、Vulkan仅 NVIDIA CUDA仅 NVIDIA CUDA
CPU 推理支持不支持不支持
量化内置(Q4、Q5、Q8 等)有限有限
内存效率高(配合量化)中等中等
吞吐良好高(配合批处理)良好
最适合本地开发、资源受限环境生产环境、高吞吐图像生成

这张表里有三行值得单独说:「CPU 推理」那一行是分水岭。官方对 vLLM 的原话是:vLLM requires an NVIDIA GPU with CUDA support. It does not support CPU-only inference. 这意味着如果你的机器没有 NVIDIA 卡,装 vLLM 是白费功夫。而在 Apple Silicon 上,vLLM 那一栏官方直接标了 macOS - Not supported。「模型格式」决定你手上有什么模型就用不了什么引擎。社区里绝大多数量化模型是 GGUF,那是 llama.cpp 的地盘;HuggingFace 上的原始权重通常是 Safetensors,那是 vLLM 的地盘。官方也提到 Safetensors 模型「通常比量化 GGUF 模型占用更多内存」。Diffusers 的定位完全不同,它不在文本生成这条线上——官方把它归为 image generation(Stable Diffusion)。

vLLM 的平台限制要记牢

官方给的vLLM 平台支持表非常明确:

平台GPU状态
Linux x86_64NVIDIA CUDA支持
Windows(WSL2)NVIDIA CUDA支持(需 Docker Desktop 4.54+)
macOS—不支持
Linux ARM64—不支持
AMD GPU—不支持

另外 vLLM 的模型标签通常带 -vllm 后缀来区分:

docker model run ai/smollm2-vllm

三、容器连不上:两个地址口径别搞混

这是 DMR 使用中最容易踩的一坑,官方文档专门用一张表区分了四种访问方式。

运行方式访问方Base URL
Docker Desktop容器http://model-runner.docker.internal
Docker Desktop宿主机进程(TCP)http://localhost:12434
Docker Engine容器http://172.17.0.1:12434

| Docker Engine | 宿主机进程 | http://localhost:12434 |容器里用 localhost 是错的。容器有自己的网络命名空间,localhost 指向容器自己,而不是宿主机。这不是配置问题,是网络模型决定的。

官方还给了一条兜底方案——如果 172.17.0.1 在你的 Compose 项目里不可用(官方原文说这个接口在 Compose 项目内默认可能不可用),需要加extra_hosts:

extra_hosts:
  - "model-runner.docker.internal:host-gateway"

三种兼容 API 的 Base URL 各不相同

同一套DMR 服务,对不同客户端要给不同的 Base URL。官方表格:

工具类型Base URL
OpenAI SDK / 客户端http://localhost:12434/engines/v1
Anthropic SDK / 客户端http://localhost:12434
Ollama 兼容客户端http://localhost:12434

OpenAI 兼容 API 的端点清单(官方原表):

端点方法说明
/engines/v1/modelsGET列出模型
/engines/v1/models/{namespace}/{name}GET检索模型
/engines/v1/chat/completionsPOST创建对话补全
/engines/v1/completionsPOST创建补全
/engines/v1/embeddingsPOST创建嵌入

注意那个 /engines/ 前缀——OpenAI 兼容客户端不能直接用 http://localhost:12434/v1,少了 /engines 会 404。这是移植 Ollama 配置到 DMR 时最常见的失败点。

官方还提到你可以在路径里带上引擎名,比如 /engines/llama.cpp/v1/chat/completions,这在同时跑多个引擎时有用。

Anthropic 兼容 API 的端点是:

端点方法说明
/anthropic/v1/messagesPOST创建消息
/anthropic/v1/messages/count_tokensPOST计算 token 数

官方给的示例里有个容易忽略的细节:

curl http://localhost:12434/v1/messages \
  -H "Content-Type: application/json" \
  -d '{
    "model": "ai/smollm2",
    "max_tokens": 1024,
    "messages": [{"role": "user", "content": "..."}]
  }'

注意路径是 /v1/messages 而不是 /anthropic/v1/messages——官方示例与端点表存在这个差异,实际以你的客户端配置为准。模型名要用带命名空间的完整标识(如 ai/smollm2)。

四、官方自己写明的限制(这部分最重要)

DMR 文档里有一节专门叫「Limitations and differences from OpenAI」,原文表格如下:

特性DMR 行为
API key不需要。DMR 忽略 Authorization 头。
Function calling仅 llama.cpp 对兼容模型支持
Vision支持多模态模型(如 LLaVA)
JSON mode支持,通过 response_format: {"type": "json_object"}
Logprobs支持
Token 计数使用模型原生 token 编码器,可能与 OpenAI 不同

这五条里,有两条会直接影响你的迁移工作:API key 那一行是部署红线。官方文档的意思很明确——DMR 不要求 API key,并且直接忽略你发来的 Authorization 头。这意味着任何能访问到 12434 端口的客户端都可以提交推理请求,也可能拉取、加载或运行模型。所以:不要把这个端口暴露在不可信的局域网、共享 CI 网络,或任何公网可达的开发者主机上。Function calling 只在 llama.cpp 下可用。如果你的应用依赖 function calling,就不能切到 vLLM 后端——这是引擎选型时容易被忽略的硬约束。Token 计数可能与 OpenAI 不同,意味着按 token 计费或做上下文预算时要留余量。

五、官方 Troubleshooting 里点名的两类问题

DMR 的文档有一节 Troubleshooting,标题就是几个典型症状。这里列出官方给出的排查方向:vLLM 装不上 / 起不来。官方给的排查第一步是确认 NVIDIA GPU 可用。结合前面那张平台表,遇到这个问题基本可以直接定位:AMD GPU、macOS、Linux ARM64 都不支持,不是配置能解决的。llama.cpp 慢。官方把这一项和「内存不足错误」并列,说明这两者在使用体验上往往相关。

官方还提供了查看引擎日志的命令:

docker model logs

排查时先看这个,比猜要快。

六、DMR 还是 Ollama:怎么选

在有第二个来源交叉印证这一点上,我用多个独立技术来源做了对照,结论是:单机本地开发选哪个都行,差异主要在工程治理而不是性能。

两者的推理峰值内存接近,因为底层都跑 llama.cpp。真正的差异在别处:

-模型分发:DMR 走 OCI 制品与registry,Ollama 走自己的模型库与 Modelfile。如果你需要镜像仓库那种版本治理与审计能力,DMR 更顺。

-空闲内存:Ollama 默认把模型留在内存里(OLLAMA_KEEP_ALIVE,默认 5 分钟),首响应更快但空闲占用高;DMR 空闲时会卸载模型。

-鉴权:两边都不该把端口直接暴露,DMR 是明确忽略 Authorization 头,Ollama 也需要自行处理网络隔离。

-「OpenAI 兼容」不等于行为一致:有来源实测指出,DMR 用的是引擎感知的路径(/engines/llama.cpp/v1/...),Ollama 的原生对话 API 是 /api/chat,两者都能塞进现有客户端,但请求字段、流式分块、错误结构、用量数据都要实测过再切。

还有一个容易被忽略的点:如果你要的是多用户或生产级高并发服务,两个都不该直接上。第三方对比文章里的建议是转向独立部署的 vLLM、SGLang 或 Kubernetes serving 栈——笔记本上的基准只能回答开发体验问题,不能确立生产吞吐、尾延迟或多租户隔离。

五、常见报错与排查路径

以下是Docker 官方文档 Troubleshooting 一节列出的症状与对应处理。

报错一:vLLM 装不上或起不来(docker model install-runner --backend vllm 后无反应)

官方给的排查第一步是确认 NVIDIA GPU 可用。结合前面的平台表,这类问题通常可以直接定位:

AMD GPU、macOS、Linux ARM64 三种环境官方均标注 Not supported,不是配置能解决的。

另外vLLM 只吃 Safetensors 格式,如果你手上是 GGUF 量化模型,它不会识别。

docker model status# 逐个引擎看安装与运行状态
docker model logs                # 看引擎日志

报错二:容器里连不上,提示 connection refused 或 404

分两种情况,判据不同:

容器应改用 http://model-runner.docker.internal。

正确地址是 http://localhost:12434/engines/v1,直接用 /v1 会 404。

这两种报错的共同点是看起来都像「连不上」,但一个在网络层、一个在路径层,必须先分清再动手。

报错三:llama.cpp 跑得慢

官方把这一项与内存不足错误并列,通常是同一个问题的两种表现。可先确认模型量化档位与上下文长度设置,

再结合 docker model logs 看是否有内存告警。

常见问题

Q1:Docker Desktop 需要什么版本?

官方文档中 vLLM 在 Windows WSL2 场景明确要求 Docker Desktop 4.54+。DMR 整体是随Docker Desktop 演进的能力,具体到某个子功能请以你本地版本的文档为准——不同版本提供的引擎和参数会变。Q2:能把 DMR 暴露给团队共用吗?

不建议直接这么做。官方文档写明它没有内建鉴权且忽略 Authorization 头。共享场景至少要做网络范围限制,必要时在前面加一层带鉴权的反向代理。Q3:Compose 里怎么声明模型依赖?

DMR 与 Compose 的集成允许把模型作为服务依赖声明,由 Compose 把模型端点与模型标识注入应用容器,而不是硬编码在应用配置里。具体字段与版本要求请查你所用 Compose 版本的官方文档。Q4:模型格式选错会怎样?

会拉不到或者起不来。llama.cpp 用 GGUF,vLLM 用 Safetensors,Diffusers 用 DDUF。拉错格式的典型表现是引擎不认这个制品。Q5:Docker Engine(非 Desktop)能用吗?

可以,但访问地址口径不同:容器走 http://172.17.0.1:12434,宿主机进程走 http://localhost:12434,且官方提示该接口在 Compose 项目内默认可能不可用,需要 extra_hosts。

本文涉及的接口路径、端点清单、引擎能力与限制均取自 Docker 官方文档(截至发稿 2026 年 10 月 11 日):

需要说明的是:本文未采用任何未经官方文档证实的性能数字。第三方对比文章中出现的吞吐量、tokens/s 等实测值,因其测试环境(硬件、模型、量化档位)与本文读者环境差异过大,且无法回溯原始测试配置,故未引用为结论。

本文不含联盟链接。文中所有接口路径、端点清单与引擎能力均取自 Docker 官方文档,未采用任何未经官方证实的性能数字。

👉 立即参与小米 MiMo 开放平台:国内领先的 AI 大模型开放平台,高性价比推理服务

👉 立即参与阿里云 AI:汇集爆款 AI 产品,热门模型专属权益优惠券助力企业创新加速

📌 本文由 AI 辅助生成并经人工审核发布 | TechPassive — AI 驱动的内容测试站点,专注于效率工具与 SaaS 真实评测

🔗 精选推荐工具

使用以下链接支持我们持续产出高质量内容(点击可直接前往购买):

☁️ DigitalOcean 云服务器 ⚡ Vultr 高性能 VPS 🤖 QoderWork 中国版(推荐有奖) ☁️ 阿里云爆款 AI 产品 📚 WordPress 实用书单 🔍 WordPress SEO 书单 🌐 虚拟主机书单 🐳 Docker 书单 🐧 Linux 书单 🐍 Python 书单 💰 联盟营销书单 💵 被动收入书单 🖥️ 服务器书单 ☁️ 云计算书单 🚀 DevOps 书单 🤖 小米 MiMo 开放平台
← 返回首页