Windows 上装了 Docker Desktop,想把 Ollama 塞进容器里跑,结果一上手就卡住:官方镜像拉哪个?端口映射写了却连不上?模型不想每次重下,该挂哪个目录?这篇按「选镜像 → 配端口 → 挂数据 → 验通路」的顺序走一遍,每一步都给可以对着做的动作和判断标准,跑通之后再决定要不要长期这么用。
在 Windows 上装了 Docker Desktop,想把 Ollama 塞进容器里跑,思路本身没问题:环境干净、删掉不留痕、换机器好搬。但一上手往往三个坎:镜像标签挑不对、端口映射写了却连不上、模型每次重下。这篇不展开概念,就按「选镜像 → 配端口 → 挂数据 → 验通路」走一遍,每步给能对着做的动作和判断标准。
需要先说清一个前提:不是所有人都该用容器。如果只是自己电脑上偶尔问几句,Windows 直接装原生版本更省心;容器化真正划算的场景是多人共用一台机器、要固定环境版本、或者要频繁迁移。所以下面的流程,跑通之后你再决定要不要长期这么用,跑不通也不必死磕。
先决定用哪个镜像、什么标签
优先用官方发布的镜像,别顺手挑第三方打包版。第三方版通常省事,但它的标签含义、更新节奏、底层依赖透不透明,出问题时你很难定位到底是 Ollama 的问题还是打包的问题。判断标准很简单:看它的构建文件是否跟随上游、最近的发布是否跟得上,跟不上的就别用。
- 标签别只图省事挑默认那个:带 GPU 支持的镜像和纯 CPU 镜像底层依赖不同,机器没独显或驱动没装对,GPU 版会起不来,或者静默退回 CPU 跑
- 不确定用哪个版本时,先用一个稳定标签把流程跑通,再考虑升级;具体镜像清单和标签对应关系到 部署测算(/models/deploy) 对照,别凭记忆写标签名
- 只是临时试一下,直接选不带 GPU 的镜像最省事,慢是慢,但不会被驱动问题反复卡住
- 想固定环境方便以后复现问题,就在本地给选定的标签打个自己的备注,下次直接拉同名标签,不要每次都重新挑
端口映射和监听地址:连不上的八成是这里
「端口写了却连不上」最常见的根因,是容器里的服务默认只监听回环地址。你只做了端口映射,但服务本身不接受来自容器外的连接,宿主机照样访问不到。所以端口映射和监听地址这两件事要一起看,改一个不改另一个,等于没改。
| 使用场景 | 端口映射 | 监听地址 | 额外动作 |
|---|---|---|---|
| 只在自己电脑上用 | 映射到本机端口 | 保持默认回环 | 无,最简单也最安全 |
| 同局域网别的机器要调 | 映射到本机端口 | 放开到所有地址 | 确认 Windows 防火墙已放行该端口 |
| 想从公网访问 | 映射到本机端口 | 放开到所有地址 | 先想清楚鉴权和暴露风险再决定 |
- 防火墙和监听地址是两件事,缺一不可;很多人只改了其中一个,现象都是「本机能用、别的机器连不上」
- 排错顺序固定成三步:先在容器内部自己请求一次,再在宿主机用本机地址请求,最后从另一台机器请求,哪一步断就在哪一步查,不要跳步
- 默认没有鉴权,任何能访问到这个端口的人都能调用你的模型;打算暴露出去之前,到 安全与合规(/safety) 看一遍再动手
- 端口冲突也别忽略:宿主机上已经有个程序占着同一个端口,映射会失败或者路由到别的服务上,换个空闲端口先验证
模型目录挂载:别让容器一删模型全没
默认情况下模型存在容器内部,容器重建、升级镜像或者清理一下,之前拉下来的模型就没了,重新拉一遍既费流量又费时间。所以第一次跑就该把模型目录挂到宿主机上,这是整个流程里回报最高的一步。
- 选一个宿主机目录放在本地盘上,别放网络盘或同步盘。跨文件系统挂载在 Windows 上偶尔会明显变慢或权限异常,跑起来卡就先怀疑这里,换到本地目录再试一遍对比。
- 挂载后确认读写权限启动容器,让它实际去写一次模型,看宿主机目录里有没有出现新文件。只有容器内能看到、宿主机看不到,说明挂错了方向或者只挂了只读。
- 预留足够空间模型体积和量化档位直接决定占用,按参数量和量化档位先估一遍,方法见 部署测算(/models/deploy),别等磁盘写满才发现。
- 验证可迁移停掉容器,删掉容器本身,再用同一个挂载目录重新起一个。模型还在、能直接用,就说明这一步做对了。
GPU 透传与跑通验证
Windows 上让容器用上独显,依赖运行时和驱动的正确组合,不是装个 Docker 就自动生效。没配好时它不会报错,而是安静地用 CPU 跑,表现就是「能用但特别慢」。这种问题必须主动确认,不能凭感觉认为已经在用显卡。
| 观察点 | 用上显卡的表现 | 没透传的表现 |
|---|---|---|
| 容器启动日志 | 能看到识别到设备的信息 | 只有 CPU 相关提示或直接跳过 |
| 跑请求时系统占用 | 显卡占用明显上升 | 只有 CPU 在涨 |
| 响应速度 | 接近你对这台机器的预期 | 明显偏慢且稳定偏慢 |
- 判断是否真用上显卡,最直接的办法就是跑一个请求,同时盯着容器日志和系统层面的占用,两边对得上才算数
- 跑通后拿一个固定提示词测一次响应时间,把它当成基线;之后换镜像、改挂载、调参数,都跟这个基线比,具体怎么量见 接口测速(/tools/speed-test)
- 基线要记下来但别当绝对结论,机器在忙、模型在冷启动,都会让数字漂,多测几次取稳定区间更可靠
- 如果确认一直是 CPU 在跑而你确实需要显卡,先回到驱动和运行时这一层排查,而不是反复重建容器
最后给个不适用的情况:如果你的机器本来就没有独显,或者只是自己偶尔用几句,上面 GPU 那一节可以整段跳过,也可以直接考虑不用容器。容器化的收益主要在多人共用、环境要固定、以及要搬到别的机器上这几类场景,别为了用而用。
下一步先按镜像、端口、挂载、验证这四步跑通一遍,把响应基线记下来;然后到站内看看各类部署方式的实际成本和取舍,再决定这台机器到底要不要长期跑容器。→常见问题
Windows 上用 Docker 跑 Ollama,跟直接装桌面版有什么区别?
容器化的好处是环境固定、好迁移、能跟别的服务一起编排;坏处是 GPU 透传和目录挂载多一层配置,出问题排查链路更长。只是自己本机用、不做多服务组合,直接用原生版本更省事。要多人共用或者要跑在服务器上,容器才划算。
端口映射了,宿主机就是连不上,先查什么?
先确认容器里服务的监听地址不是只绑回环,这是最常见的原因;再看 Windows 防火墙有没有拦这个端口;最后确认映射的宿主机端口没被别的程序占用。按容器内 → 宿主机本机 → 另一台机器这个顺序逐段试,哪段断就在哪段出手。
模型要不要挂到宿主机目录,不挂会怎样?
不挂的话模型存在容器内部,镜像升级或容器重建时一起没了,得重新拉,大模型动辄几个 G,很浪费时间。第一次跑就挂上,顺手把磁盘余量按参数量和量化档位估一遍,避免下到一半空间不足。