Docker部署Ollama+PDF聊天机器人时出现连接拒绝问题
问题排查与解决方案
核心原因分析
连接拒绝(Errno 111)的本质是聊天机器人应用容器无法正确访问Ollama容器的服务,结合你的部署场景,常见触发点如下:
1. 容器内Ollama访问地址错误
本地环境用localhost:11434能正常访问Ollama,但Docker容器内的localhost指向容器自身,而非Ollama容器。必须改用Docker网络内的服务名(即docker-compose中Ollama的服务名称)作为访问地址。
解决方案:
修改ChatbotManager类中Ollama的初始化代码,将base_url替换为Ollama服务名:
from langchain_community.llms import Ollama # 假设docker-compose中Ollama服务名为"ollama" llm = Ollama(model="llama3.2:3B", base_url="http://ollama:11434")
2. Docker网络配置不一致
即使你提到三者桥接到同一网络,仍需确认所有服务都加入同一自定义网络(默认桥接网络可能存在解析问题)。
解决方案:
检查docker-compose.yml,确保三个服务都配置在同一自定义网络下:
version: '3.8' # 定义自定义网络 networks: chatbot-network: driver: bridge services: qdrant: image: qdrant/qdrant:latest networks: - chatbot-network # 其他配置... ollama: image: ollama/ollama:latest networks: - chatbot-network volumes: - ollama-data:/root/.ollama # 无需映射宿主机端口(容器间访问用服务名即可) # ports: # - "11434:11434" chatbot-app: build: . networks: - chatbot-network ports: - "8501:8501" depends_on: - qdrant - ollama
3. Ollama服务未完全就绪就被调用
Ollama启动后需要加载Llama3.2模型,这个过程可能需要数分钟,若应用容器先启动并发起请求,会因Ollama服务未就绪导致连接拒绝。
解决方案:
- 方案1:添加健康检查依赖
在docker-compose的app服务中增加健康检查,确保Ollama就绪后再启动应用:
chatbot-app: # 其他配置... healthcheck: test: ["CMD", "curl", "-f", "http://ollama:11434/api/tags"] interval: 10s timeout: 5s retries: 5 depends_on: ollama: condition: service_healthy
- 方案2:代码层添加重试逻辑
在调用Ollama的代码中加入重试机制,避免一次性连接失败:
from tenacity import retry, stop_after_attempt, wait_exponential @retry(stop=stop_after_attempt(5), wait=wait_exponential(multiplier=1, min=2, max=10)) def get_llm_response(query): llm = Ollama(model="llama3.2:3B", base_url="http://ollama:11434") return llm.invoke(query)
4. 容器间网络连通性验证
如果上述方案无效,可手动验证应用容器与Ollama容器的连通性:
# 进入应用容器 docker exec -it <你的应用容器名称> sh # 测试能否ping通Ollama服务名 ping ollama # 测试Ollama API是否可访问 curl http://ollama:11434/api/tags
如果ping不通或curl失败,说明网络配置存在问题,需重新检查docker-compose的网络定义。
额外提示:Chain.run过时问题
将chain.run(query)替换为chain.invoke({"question": query})(具体参数名需匹配你的Chain定义),避免后续版本兼容性问题。
内容的提问来源于stack exchange,提问作者Karan R
相关产品推荐
相关产品推荐

