在本地部署大模型的浪潮中,Ollama + Open WebUI 无疑是目前最火爆、体验最好的“黄金搭档”。
很多小伙伴为了保持系统纯净,会选择将 Open WebUI 部署在 Docker 容器中。
但这时候往往会遇到一个令人头疼的问题:Docker 里的 Open WebUI 怎么都连不上宿主机安装的 Ollama,总是提示“网络不通”!
今天,我们就来彻底解决这个问题,不仅交给你一个**“万能启动命令”**,还要带你扒开底层逻辑,看看这个命令到底有多巧妙。
🛑 为什么会连不上?
如果你直接在 Docker 里运行 Open WebUI 并让它访问 localhost:11434,那是绝对不行的。
因为在 Docker 容器内部,localhost 指向的是容器自己,而不是你的电脑(宿主机)。
要解决这个问题,我们需要分两步走。
🌟 第一步:打破 Ollama 的默认封印
Ollama 为了安全,默认只允许本地(127.0.0.1)访问。
这就意味着它会无情拒绝来自 Docker 虚拟网段的请求。
我们需要将它的监听地址改为 0.0.0.0。
根据你的系统,操作如下:
🐧 Linux 系统 (Ubuntu/CentOS等)
-
修改 systemd 服务文件:
sudo systemctl edit ollama.service -
在弹出的编辑器中加入以下内容:
[Service] Environment="OLLAMA_HOST=0.0.0.0" -
重载并重启:
sudo systemctl daemon-reload sudo systemctl restart ollama
🪟 Windows 系统
- 搜索“环境变量”,点击“编辑系统环境变量”。
- 新建一个环境变量:变量名为
OLLAMA_HOST,变量值为0.0.0.0。 - 关键一步:在右下角系统托盘右键彻底退出 Ollama 图标,然后重新启动它。 1.
🍎 macOS 系统
打开终端,运行:launchctl setenv OLLAMA_HOST "0.0.0.0",然后彻底退出并重启顶部菜单栏的 Ollama 应用。
👉 验证测试:在浏览器访问 http://127.0.0.1:11434,看到 "Ollama is running" 即代表成功。
🌟 第二步:使用“万能” Docker 命令
准备工作做完后,打开终端,运行下面这行命令(建议收藏):
docker run -d \
-p 8080:8080 \
--add-host host.docker.internal:host-gateway \
-v open-webui:/app/backend/data \
--name open-webui \
--restart always \
ghcr.io/open-webui/open-webui:main
(注:如果你的 8080 端口被占用了,可以把 -p 8080:8080 改成 -p 3000:8080)
容器启动后,浏览器访问 http://localhost:8080,注册账号登入,你会发现 Open WebUI 已经丝滑地连上了你的 Ollama!
🧠 深度解析:这行命令为什么这么神奇?
细心的技术控可能已经发现了盲点:这个命令不管你的 Ollama 是安装在宿主机上,还是同样运行在 Docker 容器里,它居然都能成功连上!
这到底是为什么?并没有用到复杂的 Docker 自定义网络(docker network)互联啊!
这背后的“魔法”,在于 Open WebUI 的默认机制 与 Docker 端口映射特性 发生了完美的化学反应。
核心秘密 1:隐藏的默认环境变量
在上面的启动命令中,我们并没有设置 OLLAMA_BASE_URL 环境变量去指定 Ollama 的地址。
但官方镜像在打包时写死了一个回退逻辑:如果不显式指定,Open WebUI 就会默认去访问 http://host.docker.internal:11434****。
加上我们在命令里写了 --add-host host.docker.internal:host-gateway,这就意味着:无论 Ollama 在哪,Open WebUI 都会傻傻地把请求发送给“宿主机”的 11434 端口。
核心秘密 2:宿主机的“交通枢纽”作用
当我们把请求发给宿主机的 11434 端口时,会发生两种奇妙的场景:
👉 场景 A:Ollama 直接安装在宿主机上
- 请求通过
host-gateway到达宿主机 - 宿主机上的 Ollama 进程正好监听着 11434 端口
- 成功握手!
👉 场景 B:Ollama 也是用 Docker 跑的
(通常带有 -p 11434:11434 参数)
- 请求到达宿主机的 11434 端口
- 宿主机的 Docker 进程(iptables 规则)拦截到请求:“哎?有人访问我的 11434 端口,这恰好是我给 Ollama 容器做的端口映射!”
- 流量被 Docker 自动转发进 Ollama 容器
- 成功握手!
📊 总结图解
Open WebUI 容器
│
▼ (默认发往 host.docker.internal:11434)
│
【宿主机的 11434 端口】
│
├─▶ 情况 A:直接被宿主机原生 Ollama 进程接收。
│
└─▶ 情况 B:被 Docker 的 -p 规则拦截,转发给 Ollama 容器。
💡 结语
这就是为什么这行命令被称为“万能命令”。
它巧妙利用了宿主机作为中转站,实现了 “一套代码,处处运行” 的极简部署。
你不需要去搞懂复杂的 Docker Network,只要保证宿主机的 11434 端口能通 Ollama,Open WebUI 就能自动连上。