这篇专门把"基础 URL"讲透。看完你会明白:为什么都是访问同一个 Ollama,在浏览器里要用 localhost,在 Dify 里却要写成 host.docker.internal。
一、先把一个网址拆成两段
拿 Ollama 的一个完整接口地址来拆:
http://host.docker.internal:11434/v1/models
└──────────────┬──────────────┘ └───┬────┘
基础 URL(Base URL) 具体路径
"哪栋楼、几号房间" "进门办哪件事"
- 基础 URL =
http://host.docker.internal:11434:告诉软件"服务在哪儿"; - 具体路径 =
/v1/models:告诉服务"我要办哪件事"(这里是看模型列表)。
配置软件时只让你填前一段(基础 URL),因为后一段是软件自己拼的——它想看模型列表就拼 /v1/models,想聊天就拼 /v1/chat/completions,你根本不用管。
再逐个零件看一遍
| 部分 | 例子 | 含义 |
|---|---|---|
| 协议 | http:// | 用什么方式通信。https 是加密版 |
| 主机 | host.docker.internal | 服务在哪台机器上(也可以是 localhost、192.168.1.100、api.deepseek.com) |
| 端口 | 11434 | 那台机器上的哪个"门"。Ollama 默认走 11434 |
| 路径 | /v1/models | 门里具体办什么事 |
三个类比,挑顺手的记
- 快递地址:基础 URL 是"XX 市 XX 区 XX 小区",具体路径是"3 栋 2 单元 501";
- 餐厅:基础 URL 是餐厅地址,具体路径是"去几号窗口点餐";
- 大楼门牌:基础 URL 是大楼地址 + 房间号,具体路径是进门后找哪个柜台。
配 Dify 时它问你基础 URL,就是在问:"这栋楼在哪儿?" 至于进门之后怎么走,它自己知道。
二、localhost 是什么意思,为什么它会"骗人"
localhost 翻译过来是"这台机器自己"。它有个固定含义:谁说出这个词,指的就是谁自己。
在浏览器地址栏敲 localhost:11434,说话的是你的浏览器,浏览器跑在你的 Windows 上,所以它找的是你电脑的 11434 端口 —— 那儿住着 Ollama,能通。✅
但 Dify 不是直接跑在 Windows 上的。用 Docker 部署的 Dify 跑在一个容器里,容器是个被隔离起来的迷你环境。Dify 的容器说 localhost,指的是它自己那个容器内部。
而容器里面没有 Ollama —— Ollama 装在容器外面的 Windows 上。于是:❌ 找不到。
这就是问题的全部真相
不是地址写错了,是**"谁在说话"变了**。
| 谁在访问 | localhost 指的是 | 能不能摸到你的 Ollama |
|---|---|---|
| 你电脑上的浏览器 | 你的 Windows 电脑 | ✅ 能 |
| Docker 容器里的 Dify | 容器自己 | ❌ 不能 |
| 你电脑上的桌面软件(如 WorkBuddy) | 你的 Windows 电脑 | ✅ 能 |
三、Docker 为什么要砌这道墙
如果容器里随便一个程序都能用 localhost 摸到你电脑上的所有服务,那装了个来路不明的镜像,它就能顺手翻你的数据库、你的文件共享。所以 Docker 干脆把容器隔离成独立小院,每个小院有自己的门牌系统。
代价是:隔离之后,想访问院子外面的宿主机,得走专门留的那扇门。
这扇门的名字就是 host.docker.internal。
host.docker.internal 的准确含义
它是 Docker 官方预留的一个特殊域名,在容器内部会被解析成"宿主机"的地址:
- 你在容器里访问
host.docker.internal→ 打到的就是你 Windows 电脑; - 所以
http://host.docker.internal:11434的完整翻译是:"从容器里出来,到外面那台 Windows 上,找 11434 号房间的 Ollama。"
下面这张图把整件事画出来了:
图里那句"翻墙?不行"是说:容器不能随随便便拿 localhost 往外摸;想出去,必须走 host.docker.internal 这扇门。
四、四种情况,地址怎么填
同样是接 Ollama,因为"Dify 装在哪"不同,基础 URL 完全不一样:
| 场景 | 谁在访问 | 基础 URL 怎么填 |
|---|---|---|
| Dify 用 Docker 装在这台电脑,Ollama 也在这台 | 容器 | http://host.docker.internal:11434 |
| Dify 装在另一台电脑/服务器,Ollama 在本机 | 另一台机器 | http://本机IP:11434,如 http://192.168.1.100:11434 |
| 桌面软件(Agent 客户端)直接调本地 Ollama | 你的电脑 | http://localhost:11434(若走 OpenAI 兼容接口则加 /v1) |
| Dify 和 Ollama 都装在同一个非 Docker 环境 | 同一环境 | http://localhost:11434 |
规律很好记:先问自己"发起请求的程序跑在哪儿",再看它和 Ollama 是不是同一个空间。
- 同一个空间 →
localhost - 跨一层容器 →
host.docker.internal - 跨一台机器 → 对方的 IP
五、连不通怎么排查(按顺序来)
第 1 步:确认 Ollama 活着
浏览器开 http://localhost:11434,应显示 Ollama is running。打不开说明 Ollama 没启动,先解决它。
第 2 步:确认端口通不通
# Windows 看 11434 是否在监听
netstat -ano | findstr 11434
第 3 步:确认 Ollama 是不是只肯跟"本机"说话
这是最容易被忽略的一个坑。Ollama 默认只监听 127.0.0.1(本机回环地址),意思是"只接本机内部的请求"。本机软件访问没问题,但从容器、从别的电脑打过来,就会被挡在门外。
解决办法是让它监听所有网卡——设置环境变量 OLLAMA_HOST 为 0.0.0.0,然后完全退出 Ollama 再重新打开(托盘图标右键退出,不是点开关)。
Windows 上设置方法:系统属性 → 高级 → 环境变量 → 新建用户变量 OLLAMA_HOST,值 0.0.0.0,确定后重启 Ollama。
第 4 步:确认是不是防火墙拦了
跨电脑访问超时,多半是对方 Windows 防火墙挡了 11434。到"Windows Defender 防火墙 → 高级设置 → 入站规则"放行 11434,或者临时关掉防火墙测一下(测完记得开回来)。
第 5 步:在容器里直接测一下
如果你会用 Docker 命令,这是最直接的诊断方式——进到 Dify 的容器里,看它能不能敲到那扇门:
docker ps # 找到 dify-api 容器
docker exec -it <容器ID> sh # 进容器
curl http://host.docker.internal:11434 # 从容器里探宿主机
返回 Ollama is running 就说明网络通了,问题在 Dify 的配置项;返回超时说明卡在网络/监听上,回到第 3 步。
六、这一篇要记住的四句话
- 基础 URL 就是"服务在哪",不含具体功能路径,后面那截软件自己拼。
- localhost 指"说话人自己",换了说话的人,同一个词指向的地方就变了。
- Docker 容器是隔离小院,想访问宿主机必须用
host.docker.internal—— Docker 专门留的门。 - Ollama 默认只听本机,要跨容器/跨机器访问,得设
OLLAMA_HOST=0.0.0.0。