TinkerLab
DIAGNOSTIC TREE // CONTAINER-HOST-NETWORK (4 ROOT CAUSES)

容器连不上宿主机本地模型(Connection Refused / Timeout)

一步步排查宿主机 127.0.0.1 回环绑定限制、Linux 容器内 host.docker.internal 缺失及防火墙拦截。

[核心实测结论 / TL;DR]本诊断树针对「容器连不上宿主机本地模型(Connection Refused / Timeout)」提供 7 个交互节点与 4 套实测验证修复方案(涵盖:修复方案:将宿主机 Ollama 监听地址设为 0.0.0.0;修复方案:将容器内的 localhost 替换为 host.docker.internal;修复方案:在 Linux Docker 中显式映射 host-gateway;修复方案:在宿主机防火墙放行 Docker 网桥子网请求),配套完整实测指南《container-to-host-llm-networking》。
容器连不上宿主机本地模型(Connection Refused / Timeout)
第 1 步:检查宿主机模型服务的监听网卡地址

在宿主机终端执行以下命令,查看 11434 端口绑定的是 127.0.0.1 还是 *:11434 (0.0.0.0)?

终端验证命令 (在对应环境执行)
lsof -nP -iTCP:11434 -sTCP:LISTEN || ss -tlnp | grep 11434

若显示 127.0.0.1:11434,来自 Docker 网桥容器的任何请求都会直接返回 Connection Refused。

选择你看到的实际输出或症状:
DIAGNOSTIC PROBE SEQUENCE // 完整分步探测命令与症状分支

「容器连不上宿主机本地模型(Connection Refused / Timeout)」的全部 3 步终端探测命令与分支判据

无需逐层点击交互,以下列出本故障决策树每一层的宿主机只读探测命令、预期基线提示与输出流向。

第 1 步:检查宿主机模型服务的监听网卡地址step-host-bind

在宿主机终端执行以下命令,查看 11434 端口绑定的是 127.0.0.1 还是 *:11434 (0.0.0.0)?

lsof -nP -iTCP:11434 -sTCP:LISTEN || ss -tlnp | grep 11434

若显示 127.0.0.1:11434,来自 Docker 网桥容器的任何请求都会直接返回 Connection Refused。

输出症状分支:
  • • 显示 127.0.0.1:11434(仅限本机回环访问)→ sol-bind-all-interfaces
  • • 显示 *:11434 或 0.0.0.0:11434(已放开监听)→ step-container-url
第 2 步:核对容器内部配置的模型访问地址step-container-url

你在容器(如 Open WebUI / n8n / Dify)里填写的 Ollama 接口地址是什么?

docker exec -it tinker-open-webui sh -c "env | grep -E 'OLLAMA|API'"
输出症状分支:
  • • 填了 http://localhost:11434 或 http://127.0.0.1:11434→ sol-container-localhost-trap
  • • 已填 http://host.docker.internal:11434 但依然报错→ step-linux-gateway-or-firewall
第 3 步:在容器内测试域名解析与端口连通性step-linux-gateway-or-firewall

在容器内执行下方探测命令,观察报错是“bad address(无法解析域名)”还是“timed out(连接超时)”?

docker exec tinker-open-webui sh -c "getent hosts host.docker.internal && wget -qO- --timeout=5 http://host.docker.internal:11434/api/version"
输出症状分支:
  • • getent 无输出或报 bad address(Linux Docker 环境)→ sol-linux-extra-hosts
  • • 能解析出 172.17.0.1,但请求一直卡住直到 Timeout→ sol-ufw-firewall-bridge
ALL VERIFIED FIXES IN THIS TREE // 本树涵盖的全部根因与修复方案一览

「容器连不上宿主机本地模型(Connection Refused / Timeout)」包含的 4 类根因、修复代码与验收命令

修复方案:将宿主机 Ollama 监听地址设为 0.0.0.0

sol-bind-all-interfaces

Ollama 默认仅绑定 127.0.0.1:11434。来自 Docker 网桥虚拟网卡(172.17.0.x)的数据包会被宿主机内核直接拒绝。

  1. macOS 环境:通过 launchctl 设置 OLLAMA_HOST 环境变量,并彻底重启 Ollama 客户端。
  2. Linux systemd 环境:使用 systemctl edit ollama.service 写入 OLLAMA_HOST=0.0.0.0:11434 并重启服务。
  3. 安全边界提醒:开放 0.0.0.0 后,请确保云服务器安全组或局域网防火墙未将 11434 暴露至公网。
# macOS (launchctl)
launchctl setenv OLLAMA_HOST "0.0.0.0:11434"
# Then Quit and Reopen Ollama.app

# Linux (systemd override)
sudo mkdir -p /etc/systemd/system/ollama.service.d
printf "[Service]\nEnvironment=\"OLLAMA_HOST=0.0.0.0:11434\"\n" | sudo tee /etc/systemd/system/ollama.service.d/override.conf
sudo systemctl daemon-reload && sudo systemctl restart ollama

[边界说明]绑定 0.0.0.0 会使无鉴权的 Ollama 接口对同局域网设备可见,生产机器建议仅绑定 docker0 IP 或配置防火墙白名单。

验证命令: lsof -nP -iTCP:11434 -sTCP:LISTEN

修复方案:将容器内的 localhost 替换为 host.docker.internal

sol-container-localhost-trap

在容器独立的网络命名空间内,localhost / 127.0.0.1 指向容器自身,而不是运行本地模型的宿主机。

  1. 将容器环境变量 OLLAMA_BASE_URL 或工作流请求地址改为 http://host.docker.internal:11434。
  2. 在 docker-compose.yml 中补充 extra_hosts: ["host.docker.internal:host-gateway"]。
services:
  open-webui:
    environment:
      - OLLAMA_BASE_URL=http://host.docker.internal:11434
    extra_hosts:
      - "host.docker.internal:host-gateway"

[边界说明]配合 extra_hosts 后,该配置可在 macOS、Windows Docker Desktop 与 Linux Docker Engine 下保持完全一致。

验证命令: docker exec tinker-open-webui wget -qO- http://host.docker.internal:11434/api/version

修复方案:在 Linux Docker 中显式映射 host-gateway

sol-linux-extra-hosts

与 Mac/Windows 的 Docker Desktop 不同,原生 Linux Docker 默认不会往容器 /etc/hosts 注入 host.docker.internal。

  1. 在 docker-compose.yml 对应服务下添加 extra_hosts: ["host.docker.internal:host-gateway"]。
  2. 执行 docker compose up -d --force-recreate 重建容器使 hosts 映射生效。
docker run -d \
  --name tinker-open-webui \
  --add-host=host.docker.internal:host-gateway \
  -e OLLAMA_BASE_URL=http://host.docker.internal:11434 \
  -p 3000:8080 \
  ghcr.io/open-webui/open-webui:v0.5.10

[边界说明]需要宿主机 Docker Engine 版本 ≥ 20.10。

验证命令: docker exec tinker-open-webui getent hosts host.docker.internal

修复方案:在宿主机防火墙放行 Docker 网桥子网请求

sol-ufw-firewall-bridge

Linux 宿主机的 UFW 或 firewalld 拦截了来自 docker0 / 自定义网桥(172.16.0.0/12)发往宿主机 11434 端口的数据包。

  1. 仅针对 Docker 私有网段(172.16.0.0/12)放行宿主机 11434 TCP 端口,避免对公网敞开。
  2. 重载防火墙规则并重新在容器内执行探测。
sudo ufw allow from 172.16.0.0/12 to any port 11434 proto tcp comment "Allow Docker containers to local Ollama"
sudo ufw reload

[边界说明]限制源网段为 172.16.0.0/12 可确保只有本机容器能访问模型接口,外部局域网依然受防火墙保护。

验证命令: docker exec tinker-open-webui wget -qO- --timeout=5 http://host.docker.internal:11434/api/version
PAIRED REPRODUCIBLE GUIDE // 配套实测指南与硬件环境基线

容器连不上宿主机模型:最小复现和诊断步骤

用三条确定性终端命令,彻底解决 Open WebUI、n8n 或 Dify 容器访问宿主机 11434 端口报 Connection Refused 或 Timeout 的高频故障。

实测硬件与系统

Ubuntu 24.04(Docker Engine 27.x + UFW 防火墙)与 macOS 15(Docker Desktop 4.36)双平台实测

锁定版本栈

Docker Engine 27.x · Ollama 0.5.7 · Open WebUI v0.5.10 · n8n 1.76.x

验证日期 (2026-10-23)

纯本机回环与容器网桥通信 — 包含严格的网桥子网防火墙策略,在向本机容器放行 11434 的同时阻止外部网络访问。