docker 容器访问 ollama 服务

模型与算力

给容器化部署的开发者讲清容器怎么连上宿主机上的 Ollama,含地址写法、监听配置与连不通的排查顺序。

你本地用 Ollama 跑着模型,应用却装进了 Docker 容器,一调用就报连接被拒绝或者解析不了域名。这篇不聊模型选型,只解决一件事:让容器里的代码稳定访问到宿主机上的 Ollama 服务。下面给的是判断标准加可执行动作,每一步都能直接对着做,最后附一套连不通时的排查顺序。

你本地用 Ollama 跑着模型,测试脚本跑得挺好,应用一装进 Docker 容器就报连接被拒绝,或者干脆解析不了域名。这种报错八成不是模型的问题,而是容器网络和监听地址这两层没过。下面只解决一件事:让容器里的代码稳定访问到宿主机上的 Ollama。判断标准加可执行动作,每步都能对着做,最后有一套连不通时的排查顺序。

读之前先记住一个前提:这篇讲的是「容器和 Ollama 在同一台机器上」的场景。如果容器跑在另一台机器、或者跑在 K8s 集群里,下面这些宿主机地址的写法基本不成立,得换思路,文里会单独点出来。

先搞清容器为什么连不上宿主机

容器默认有自己的网络命名空间,容器里的 localhost 指的是容器自己,不是宿主机。很多人在应用配置里写 localhost 加端口,宿主机上跑得好好的,进了容器就必然连不上,因为那个端口在容器里根本没人监听。这是第一层坑,也是最常见的。

  • 容器内的 localhost 指向容器自身,宿主机服务要用另一套地址去指
  • 宿主机上 Ollama 默认只监听回环地址,来自容器网桥的请求会被直接拒掉
  • Linux 和 macOS、Windows 上,指向宿主机的写法不一样,跨平台照抄会踩坑
  • 判断方法:先在宿主机上用命令行请求一次模型列表接口,确认服务活着,再进容器里试,分清是服务问题还是网络问题

按平台选对「宿主机地址」的写法

Mac 和 Windows 上的 Docker Desktop 提供内置域名,容器里用这个域名就指向宿主机,不用去猜 IP,也不用翻网卡配置。这是最省事的一种,优先用它。Linux 上没有这个内置域名,要么用网桥的网关地址,要么启动容器时挂上 host 网络模式,让容器和宿主机共用同一套网络栈。

运行环境容器里指向宿主机的写法注意点
macOS + Docker Desktop使用内置的宿主机域名直接写域名即可,不用改网络模式
Windows + Docker Desktop同上,用内置域名WSL 里跑 Docker 时行为一致
Linux 默认网桥用网桥网关地址网关地址到站内网络配置类页面按当时环境核对
Linux + host 网络模式容器直接用宿主机的地址端口会与宿主机冲突,编排时留意
内置宿主域名
Docker Desktop 给容器留的一个固定名字,解析后指向宿主机,省去查 IP
网桥网关
默认网络里,容器通往宿主机的那个出口地址,Linux 上常用它
host 网络模式
容器不再独立隔离网络,直接和宿主机共用一套接口和端口

无论用哪种写法,都建议把地址做成环境变量,而不是硬编码在代码里。换机器、换编排文件、本地和测试环境切换时,只改一处配置就行。什么情况下这套写法不适用:容器和 Ollama 不在同一台机器上时,宿主机地址这个词本身就没意义了,得改成 Ollama 对内网开放,并补上访问控制。

让 Ollama 愿意接受外部连接

地址写对了也可能连不上,因为服务端根本不肯接外来的请求。Ollama 默认只监听回环地址,需要改一个监听地址的环境变量,让它不止听本机。这个变量的准确名称和取值,到站内的术语与配置类页面核对当时的写法,别照着记忆改。

  1. 改监听配置给 Ollama 的启动环境加上监听地址变量,让它绑定到愿意接受请求的地址上,容器侧才有机会连进来。
  2. 放开端口确认宿主机防火墙、云主机安全组没有拦这个端口,容器到宿主机这个方向也要放行,只放行一半一样连不通。
  3. 重启服务环境变量只在服务启动时读取,改完要重启 Ollama 进程本身,只重启容器不会让宿主机上的服务读到新配置。
  4. 回归验证从容器里再请求一次模型列表接口,能返回结果才算这一层过了,别只看配置文件。

连不通时的排查顺序

报错分不清原因时,按固定顺序往下走,别东一榔头西一棒子。顺序的核心逻辑是:先证明服务活着,再证明网络通,最后才怀疑配置。每一步都有明确的观察点。

  • 在宿主机上请求一次模型列表接口,能通说明服务本身没问题,问题在网络或地址
  • 进容器里用同样命令再试,通不了就锁定在容器到宿主机这条链路上
  • 换地址写法逐个排除,先试内置域名,再试网关地址,最后看是不是 DNS 解析不到
  • 看两边日志:报错说拒绝连接,多半是监听地址没改对;说超时,多半是防火墙或安全组挡了

还有一种容易漏的情况:宿主机上模型还在加载,容器里的应用已经发起请求,等不到响应就退出了。这类现象看起来像网络问题,其实是启动时序问题。给容器侧加超时和重试,观察日志里每次请求的耗时,能区分开来。

稳定可用的几个小习惯

一次调通不难,难的是换台机器、换个人接手还能通。把访问地址、模型名这类会变的东西抽成配置项,本地和测试环境共用同一份代码,只在环境变量上做区分。容器依赖宿主机服务时,超时和重试是标配,不是可选项。

  • 地址和模型名走配置,不写死在代码里,换环境只改一处
  • 给请求加合理的超时和重试,宿主机侧模型加载慢时不至于直接崩
  • 把这份网络配置写进项目说明,下一个人不用重新踩一遍
  • 环境变了就重跑一遍上面的排查顺序,别凭印象判断
  • 涉及对外暴露的配置,先想清楚谁能访问,再决定开放范围
容器连不上宿主机,九成不是模型的问题,而是 localhost 的含义和监听地址这两件事没说清。
下一步把几个常见平台的宿主机地址写法和监听配置差异,整理成一份随手能查的对照表;站内的工具目录和配置类指南里有对应的整理页面,照着核对比到处翻帖快。

常见问题

容器里写 localhost 为什么连不上宿主机上的 Ollama?

容器里的 localhost 指向容器自己,不是宿主机。要么改用平台提供的宿主域名或网桥网关地址,要么让容器直接共用宿主机的网络栈。先把地址改对,再去看 Ollama 有没有对外监听。

改了监听地址还是连不上,最常见的原因是什么?

多半是没重启服务,或者防火墙没放行。先确认服务重启后监听状态变了,再从容器里试一次;如果表现为超时而不是拒绝连接,基本可以往防火墙和网络策略方向查。

把 Ollama 开放给容器访问,会不会有安全风险?

会。绑到所有网卡后同网段的机器都可能访问到,公网机器上尤其危险。稳妥做法是只对内网或指定网段开放,再加一层鉴权和访问控制;只是本机开发用,尽量别扩大监听范围。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。