问题修复记录:Linux docker 部署 dify,无法调用宿主机本地服务

911 阅读2分钟

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》

本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经验分享,旨在帮助读者更好地理解和应用这些领域的最新进展

使用docker compose启动Dify后,在其中配置本地中的xinference模型,报错:

get xinference model extra parameter failed, url: http://127.0.0.1:9997/v1/models/bge-m3, error: HTTPConnectionPool(host='127.0.0.1', port=9997): Max retries exceeded with url: /v1/models/bge-m3 (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fb3b25de7d0>: Failed to establish a new connection: [Errno 111] Connection refused'))

原因:

当一个应用在一个Docker容器内运行时,它试图连接到另一个同样运行在本地机器上的服务时,通常会使用127.0.0.1或localhost作为目标地址。然而,在Docker容器内部,127.0.0.1指的是容器自身的回环接口,而不是宿主机的回环接口。

因此,当在Docker容器内部的应用试图连接到宿主机上的服务时,需要一种方法来从容器内部正确地引用宿主机的IP地址。host.docker.internal是一个特殊的域名,它在Docker容器中解析为主机的IP地址,这使得容器可以与宿主机上的服务进行通信。

具体来说:

在Docker for Windows和Docker for Mac环境下,host.docker.internal会解析为宿主机的IP地址。 在Linux系统中,虽然没有专门的host.docker.internal域名,但如果使用的是Docker网络(比如桥接网络),通常可以通过172.17.0.1(或者/proc/net/route中的LOCAL行所指向的地址)来访问宿主机的网络接口。

修复步骤

1. 关闭防火墙

sudo ufw disable
# 防火墙在系统启动时自动禁用
sudo ufw status
# 状态:不活动

2. 本地服务监听所有接口

配置 如xinference 服务监听所有接口:如果 xinference 是在宿主机上运行的服务,并且默认只监听 localhost 或 127.0.0.1,你需要修改它的配置,使其监听所有可用的网络接口(通常是 0.0.0.0),以便可以从 Docker 容器内访问它。

xinference-local --host 0.0.0.0 --port 8193

3. dify 配置使用 docker0 ip 地址

在这里插入图片描述

在这里插入图片描述