基础 URL 到底是什么?localhost 和 host.docker.internal 讲明白

5 阅读5分钟

这篇专门把"基础 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 步。

六、这一篇要记住的四句话

  1. 基础 URL 就是"服务在哪",不含具体功能路径,后面那截软件自己拼。
  2. localhost 指"说话人自己",换了说话的人,同一个词指向的地方就变了。
  3. Docker 容器是隔离小院,想访问宿主机必须用 host.docker.internal —— Docker 专门留的门。
  4. Ollama 默认只听本机,要跨容器/跨机器访问,得设 OLLAMA_HOST=0.0.0.0。