这个优雅的解决方案在 Docker 里叫做 创建自定义桥接网络(Custom Bridge Network)。
正如你之前遇到的情况,在 Docker 默认的环境下,每个容器都是一座孤岛,它们的 localhost 都只代表自己。而如果我们把 Open WebUI 和 SearXNG 放到同一个自定义网络里,Docker 内部的 DNS 服务器就会自动启动。
这时候,它们互相访问不需要记局域网 IP,直接用容器的名字(Container Name)当作网址就行,哪怕你电脑重启、路由器换了 Wi-Fi、IP 全变了,它们也永远不会失联。
下面是具体的操作步骤:
打开你的终端(Terminal),运行下面这行命令,创建一个名为 ai-network 的自定义网络:
docker network create ai-network
你需要知道你当前运行的 Open WebUI 和 SearXNG 的容器名称。如果不确定,可以先用 docker ps 查一下。
假设你的 SearXNG 容器名叫 searxng,Open WebUI 容器名叫 open-webui。在终端分别运行:
# 将 SearXNG 容器加入网络
docker network connect ai-network searxng
# 将 Open WebUI 容器加入网络
docker network connect ai-network open-webui
注:docker network connect 极其方便,它可以在容器不停止、不重启的情况下,动态地把容器加入新网络。
现在,两座孤岛已经连上同一座桥了。
💡 为什么端口变成了 8080?这正是 Docker 网络的妙处。以前用 http://宿主机IP:1314,是因为你把容器的 8080 端口映射到了宿主机的 1314。现在两个容器在内部网络“面对面”密谋,Open WebUI 可以直接穿透映射,去连 SearXNG 容器最原始的内部默认端口(通常是 8080)。
如果你是用 docker-compose.yaml 把它们写在一起管理的 bread & butter,那就更简单了,连命令都不用敲。直接在 yaml 文件里为它们指定相同的 networks 即可:
version: '3'
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
networks:
- ai-network
searxng:
image: searxng/searxng:latest
container_name: searxng
networks:
- ai-network
networks:
ai-network:
driver: bridge
通过这种方式连通后,哪怕你把宿主机对外的 1314 端口完全关闭(在 docker 启动参数里去掉 -p 1314:8080),大模型依然能在容器内部和 SearXNG 快乐地通信,不仅更安全,局域网内的其他设备也无法刺探你的搜索流量了!