Docker部署Open WebUI连接Ollama:一行命令搞定所有场景!

4 阅读4分钟

在本地部署大模型的浪潮中,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等)

  1. 修改 systemd 服务文件:sudo systemctl edit ollama.service

  2. 在弹出的编辑器中加入以下内容:

      [Service]
      Environment="OLLAMA_HOST=0.0.0.0"
    
  3. 重载并重启:

      sudo systemctl daemon-reload
      sudo systemctl restart ollama
    

🪟 Windows 系统

  1. 搜索“环境变量”,点击“编辑系统环境变量”。
  2. 新建一个环境变量:变量名为 OLLAMA_HOST,变量值为 0.0.0.0
  3. 关键一步:在右下角系统托盘右键彻底退出 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 直接安装在宿主机上

  1. 请求通过 host-gateway 到达宿主机
  2. 宿主机上的 Ollama 进程正好监听着 11434 端口
  3. 成功握手!

👉 场景 B:Ollama 也是用 Docker 跑的

(通常带有 -p 11434:11434 参数)

  1. 请求到达宿主机的 11434 端口
  2. 宿主机的 Docker 进程(iptables 规则)拦截到请求:“哎?有人访问我的 11434 端口,这恰好是我给 Ollama 容器做的端口映射!”
  3. 流量被 Docker 自动转发进 Ollama 容器
  4. 成功握手!

📊 总结图解

Open WebUI 容器
      │
      ▼ (默认发往 host.docker.internal:11434)
      │
【宿主机的 11434 端口】 
      │
      ├─▶ 情况 A:直接被宿主机原生 Ollama 进程接收。
      │
      └─▶ 情况 B:被 Docker 的 -p 规则拦截,转发给 Ollama 容器。

💡 结语

这就是为什么这行命令被称为“万能命令”。

它巧妙利用了宿主机作为中转站,实现了 “一套代码,处处运行” 的极简部署。

你不需要去搞懂复杂的 Docker Network,只要保证宿主机的 11434 端口能通 Ollama,Open WebUI 就能自动连上。