MaxKB 用 Docker 跑、Ollama 装在宿主机,这是最常见的组合。填 localhost 一定连不上,因为那指的是容器自己;填了宿主机域名又可能解析不到或者被防火墙挡。这篇按「先判网络关系、再定写什么地址、最后逐项排查」的顺序讲,只讲容器内访问这一件事,不重复模型选型和部署方案。
MaxKB 用 Docker 跑、Ollama 装在宿主机,这是最常见的组合。填 localhost 一定连不上,因为容器里的 localhost 指的是容器自己,不是你的宿主机。填了宿主机域名又可能解析不到,或者被防火墙挡在门外。这篇按「先判网络关系、再定写什么地址、最后逐项排查」的顺序讲,只讲容器内访问 Ollama API 这一件事。
下面所有操作都在 MaxKB 容器里或者 Docker 宿主机上做,先别急着改 MaxKB 后台配置,先把「能不能通」验证出来。改配置是最后一步,不是第一步。
先搞清楚两个东西跑在哪
地址怎么写,完全取决于 Ollama 和 MaxKB 各自的运行位置。三种常见拓扑,地址写法完全不同,先对号入座再动手。
| 拓扑 | Ollama 在哪 | 容器里能用的地址类型 |
|---|---|---|
| 各自独立装 | 宿主机或另一台机器 | 宿主机网关地址 / 内网域名 |
| 都在 Docker 不同网络 | Docker 容器 | 先并入同一网络,再用服务名 |
| 都在 Docker 同一网络 | Docker 容器 | 直接用 compose 服务名 |
| MaxKB 在容器、Ollama 在宿主 | 宿主机进程 | 网桥网关地址,别用 127.0.0.1 |
- 进容器docker exec -it 你的maxkb容器名 bash,先确认自己在容器里,不是宿主机上。
- 看容器自己的地址执行 hostname -I,记下容器拿到的 IP 和网段,后面判断网关地址有用。
- 先试连通性直接 curl 目标地址加端口,看返回是连接拒绝、超时还是域名解析失败,症状不同改法不同。
- 别上来就改配置MaxKB 后台填错一次保存一次,日志会变乱,先在命令行测通再回填。
两家都在 Docker 时,与其拼域名,不如先确认是否在同一自定义网络里。用 docker network inspect 看两个容器挂在哪个网络下,不在同一网络,写什么地址都连不上。
容器里该填哪个地址:三类可选方案
确认完拓扑,接下来选一类方案。三类没有绝对优劣,只看你的部署现状,能不动就少动。
- 宿主机网关方案:容器内用宿主机在 Docker 网桥上的网关地址(一般是网桥网段的 .1),前提是 Ollama 监听 0.0.0.0。不同平台网关地址不一样,别照抄别人的,自己 hostname -I 和 ip route 里查。
- 服务名方案:把 Ollama 也写进 compose,用 compose 里的服务名当主机名,前提是同一个 network。这是最稳的一类做法,容器重启后地址也不飘,推荐新建部署直接这么干。
- 外部域名方案:走内网 DNS 或 hosts 解析的域名,适合 Ollama 在另一台机器。要确认容器用的是哪套 DNS,容器默认继承宿主 DNS,不一定能解析你内网的域名。
- 端口一律按 Ollama 实际监听的端口填。改过端口的,先到 ollama_host 设置(/ollama-host-env-setting) 对照格式,别凭记忆填。
域名方案最容易翻车的地方在 DNS。容器默认拿的是宿主机的 resolv.conf,如果宿主用了 systemd-resolved 或者公司内网 DNS,容器里未必继承得到。测试方法就是在容器里 ping 一下那个域名,解析不出来就先别折腾 MaxKB 配置。
# 在 MaxKB 容器里依次执行,判断走哪条路\nhostname -I\nip route\ncat /etc/resolv.conf\ncurl -v http://目标地址:端口/如果选的是原生接口还是兼容接口,地址后面要不要带 /v1 也不一样。建议先固定一个最简请求测通,再加路径。接口形态的差别可以到 工具与测速(/tools/speed-test) 里对照着测,先测通再谈调用。
Ollama 那一侧必须先放开监听
容器连不上,很多时候不是 MaxKB 填错了,是 Ollama 根本没让外面连进来。默认配置只监听回环地址,容器从外面根本够不着。
- 监听地址
- 要让容器访问,得把监听地址改成 0.0.0.0 或指定网卡地址,改完必须重启 Ollama 服务才生效。
- 监听范围
- 只暴露给内网或指定网段,公网可达等于把本地模型接口公开,风险口径到 安全与合规(/safety) 一节看。
- 验证监听
- 用 ss -lntp 或 netstat -lntp 确认端口真的处于 LISTEN,而不是只看配置文件写没写。
- 端口一致
- MaxKB 里填的端口必须和实际监听端口一致,改过端口的尤其容易填错。
- 改监听配置把 Ollama 的监听地址从回环改成对外开放的地址,保存配置。
- 重启服务重启 Ollama,让新监听配置生效,配置改了不重启等于没改。
- 确认监听在宿主机上执行 ss -lntp,确认目标端口在 LISTEN 状态,且绑定地址不是只有 127.0.0.1。
- 从容器验证回到 MaxKB 容器里 curl 一次,能返回内容才算 Ollama 这侧配好了。
连不通时的排查顺序
连不通别靠猜,按下面的顺序走,每步都能缩小范围。顺序错了容易在无关环节浪费时间。
- 容器内 curl 看症状报连接拒绝是端口没开或地址错,报域名解析失败才是 DNS 问题。两类症状对应两套改法,先分清。
- 宿主上确认服务在宿主机本机访问一次 Ollama,排除服务本身没起来。服务没起先看 ollama 没有 service(/ollama-service-missing-linux) 这类基础排查。
- 查防火墙和网段宿主防火墙、云主机安全组、Docker 的 iptables 规则都可能拦。企业内网还要查有没有代理强制走转发。
- 看 MaxKB 日志原文最后再看 MaxKB 日志里的真实报错关键词来定位,别凭印象猜。
| 症状 | 大概率原因 | 先查什么 |
|---|---|---|
| connection refused | 端口没开或地址错 | ss -lntp 看监听 |
| timeout | 防火墙或网段拦 | iptables、安全组 |
| 域名解析失败 | 容器 DNS 问题 | 容器内 cat resolv.conf |
| 404 或路径报错 | 接口路径不对 | 接口形态与 /v1 前缀 |
如果上面的顺序走完还是不通,多数情况下剩下两个原因:一是容器网络被单独隔离,二是内网 DNS 和宿主不一致。这两种都在容器里直接验证,不用回 MaxKB 后台。模型选型和部署方案本身不在本篇范围里,价格和可用性这类数字到 价格追踪(/price-watch) 核对当时的数字。
先确认在哪跑、能不能通,再决定填什么地址;顺序反了,改十次配置也是白改。下一步如果你手上同时有官方 API 和中转站在用,建议顺手看一下各家当时的可用状态和接入方式,避免地址刚配通、入口又变。→
常见问题
MaxKB 里填 localhost 或 127.0.0.1 为什么连不上 Ollama?
因为这两个地址在容器内部指向容器自己,不是宿主机。MaxKB 跑在容器里,请求 localhost 只会问到它自己的网络栈,那里没有 Ollama。要把目标改成宿主机在容器网络里的地址、或者 compose 里的服务名,并且确认 Ollama 已经监听在能被外部访问的地址上。
用服务名当域名连,为什么有时候行有时候不行?
多半是网络不一致。服务名解析只在同一个 Docker 自定义网络里有效,容器被拆到不同 compose 项目或不同 network 就解析不了;另外容器重启后网络可能变化。稳定的做法是让 MaxKB 和 Ollama 处在同一个 compose 的同一个 network 里,而不是靠手工指定。
改完地址还是超时,最该先查什么?
先在容器里 curl 一次目标地址,看报的是拒绝连接还是超时。拒绝连接说明地址对但端口没监听,回去查 Ollama 的监听配置;超时说明包发出去没人应答,多半是防火墙、安全组或网关地址写错。把这两类分开,排查范围立刻小一半。