Docker 容器访问宿主机 Ollama 服务配置教程

Docker 容器访问宿主机 Ollama 服务配置教程

问题描述

当在 Docker 容器中的应用(如 RAGFlow)尝试连接宿主机上的 Ollama 服务时,会遇到以下错误:

复制代码
CONNECTION_ERROR - litellm.APIConnectionError: Ollama_chatException - [Errno 111] Connection refused

问题原因

  • Ollama 默认配置 :只监听 127.0.0.1:11434(本地回环地址)
  • Docker 容器网络隔离 :容器内的 localhost 指向容器自身,无法访问宿主机的 127.0.0.1
  • 结果:Docker 容器无法连接到宿主机的 Ollama 服务

解决方案概述

让 Ollama 服务监听所有网络接口(0.0.0.0:11434),使其可以通过宿主机 IP 被 Docker 容器访问。


详细操作步骤

步骤 1:获取宿主机 IP 地址

bash 复制代码
hostname -I | awk '{print $1}'

示例输出

复制代码
192.168.0.105

📝 记下这个 IP 地址,后续配置需要使用。


步骤 2:检查 Ollama 当前监听状态

bash 复制代码
sudo netstat -tuln | grep 11434

典型输出

复制代码
tcp        0      0 127.0.0.1:11434         0.0.0.0:*               LISTEN

⚠️ 如果显示 127.0.0.1:11434,说明只监听本地,需要修改配置。


步骤 3:检查 Ollama 是否作为系统服务运行

bash 复制代码
sudo systemctl status ollama

如果返回服务状态信息,说明 Ollama 作为系统服务运行,需要修改服务配置文件。

如果提示服务不存在,Ollama 可能是手动启动的,可以直接用环境变量启动。


步骤 4:修改 Ollama 系统服务配置

4.1 查看当前配置
bash 复制代码
cat /etc/systemd/system/ollama.service
4.2 修改配置文件

使用以下命令修改配置文件,添加 OLLAMA_HOST 环境变量:

bash 复制代码
sudo nano /etc/systemd/system/ollama.service

或者直接使用命令一次性修改(推荐):

bash 复制代码
sudo tee /etc/systemd/system/ollama.service > /dev/null << 'EOF'
[Unit]
Description=Ollama Service
After=network-online.target

[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=/opt/TensorRT-10.9.0.34/bin:/opt/ros/humble/bin:/home/wanglin/miniconda3/bin:/home/wanglin/miniconda3/condabin:/usr/local/cuda-12.1/bin:/home/wanglin/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin"
Environment="OLLAMA_HOST=0.0.0.0:11434"

[Install]
WantedBy=default.target
EOF

🔑 关键配置:Environment="OLLAMA_HOST=0.0.0.0:11434"


步骤 5:重新加载配置并重启服务

bash 复制代码
# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 重启 Ollama 服务
sudo systemctl restart ollama

# 检查服务状态
sudo systemctl status ollama

步骤 6:验证配置是否生效

6.1 检查监听地址
bash 复制代码
sudo netstat -tuln | grep 11434

期望输出(监听所有接口):

复制代码
tcp6       0      0 :::11434                :::*                    LISTEN

:::11434 表示监听所有网络接口(IPv4 和 IPv6)

6.2 测试通过宿主机 IP 访问
bash 复制代码
# 替换 192.168.0.105 为您的宿主机 IP
curl http://192.168.0.105:11434/api/tags

成功输出示例

json 复制代码
{
  "models": [
    {
      "name": "deepseek-r1:1.5b",
      "model": "deepseek-r1:1.5b",
      ...
    }
  ]
}
6.3 测试聊天功能
bash 复制代码
curl -X POST http://192.168.0.105:11434/api/generate \
  -d '{"model": "deepseek-r1:1.5b", "prompt": "你好", "stream": false}'

步骤 7:在 RAGFlow(或其他 Docker 应用)中配置

配置参数

访问 RAGFlow 模型设置页面:http://localhost:8880/user-setting/model

Ollama 配置

  • Base URL / API 地址http://192.168.0.105:11434
  • 模型名称deepseek-r1:1.5b(或其他已安装的模型)
  • API Key:留空(Ollama 本地服务不需要)

⚠️ 重要

  • ✅ 使用宿主机 IP:http://192.168.0.105:11434
  • ❌ 不要使用:http://localhost:11434http://127.0.0.1:11434

防火墙配置(可选)

如果系统启用了防火墙,需要开放 11434 端口:

Ubuntu/Debian (UFW)

bash 复制代码
sudo ufw allow 11434/tcp
sudo ufw reload

CentOS/RHEL (firewalld)

bash 复制代码
sudo firewall-cmd --permanent --add-port=11434/tcp
sudo firewall-cmd --reload

常见问题排查

问题 1:容器仍然无法连接

检查项

  1. 确认 Ollama 监听地址是否正确:

    bash 复制代码
    sudo netstat -tuln | grep 11434
  2. 测试宿主机 IP 是否可访问:

    bash 复制代码
    curl http://192.168.0.105:11434/api/tags
  3. 检查防火墙规则

问题 2:Docker 网络模式为 host

如果 Docker 使用 --network host 模式,可以直接使用 localhost:11434

问题 3:宿主机 IP 地址变化

如果使用 DHCP 动态 IP,可以考虑:

  • 配置静态 IP 地址
  • 使用 host.docker.internal(部分 Docker 版本支持)
  • 在 Docker 启动时添加:--add-host=host.docker.internal:host-gateway

完整快捷脚本

将以下内容保存为 configure_ollama_for_docker.sh

bash 复制代码
#!/bin/bash

echo "🚀 开始配置 Ollama 以支持 Docker 容器访问..."

# 获取宿主机 IP
HOST_IP=$(hostname -I | awk '{print $1}')
echo "📍 宿主机 IP: $HOST_IP"

# 修改 Ollama 服务配置
echo "🔧 修改 Ollama 服务配置..."
sudo tee /etc/systemd/system/ollama.service > /dev/null << 'EOF'
[Unit]
Description=Ollama Service
After=network-online.target

[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=/opt/TensorRT-10.9.0.34/bin:/opt/ros/humble/bin:/home/wanglin/miniconda3/bin:/home/wanglin/miniconda3/condabin:/usr/local/cuda-12.1/bin:/home/wanglin/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin"
Environment="OLLAMA_HOST=0.0.0.0:11434"

[Install]
WantedBy=default.target
EOF

# 重新加载并重启服务
echo "🔄 重启 Ollama 服务..."
sudo systemctl daemon-reload
sudo systemctl restart ollama

# 等待服务启动
sleep 3

# 验证配置
echo "✅ 验证配置..."
if sudo netstat -tuln | grep -q ":::11434"; then
    echo "✅ Ollama 已成功监听所有网络接口"
else
    echo "❌ Ollama 监听配置可能有问题"
fi

# 测试访问
echo "🧪 测试访问..."
if curl -s http://$HOST_IP:11434/api/tags > /dev/null; then
    echo "✅ 通过宿主机 IP 访问成功"
    echo ""
    echo "📋 请在 Docker 应用中使用以下配置:"
    echo "   Base URL: http://$HOST_IP:11434"
    echo "   模型名称: deepseek-r1:1.5b"
else
    echo "❌ 访问失败,请检查防火墙设置"
fi

使用方法

bash 复制代码
chmod +x configure_ollama_for_docker.sh
./configure_ollama_for_docker.sh

手动启动方式(非系统服务)

如果 Ollama 不是作为系统服务运行,可以使用以下方式启动:

bash 复制代码
# 停止当前运行的 Ollama
pkill ollama

# 设置环境变量并启动
export OLLAMA_HOST=0.0.0.0:11434
nohup ollama serve > /tmp/ollama.log 2>&1 &

# 验证
sleep 2
netstat -tuln | grep 11434

安全提示

⚠️ 注意事项

  1. 局域网访问:配置后 Ollama 可被局域网内其他设备访问
  2. 生产环境:建议配置防火墙规则,只允许特定 IP 访问
  3. 敏感数据:不要在公网环境中暴露 Ollama 服务

限制访问的防火墙规则

bash 复制代码
# 只允许 Docker 网桥访问
sudo ufw allow from 172.17.0.0/16 to any port 11434

# 或只允许特定 IP 段
sudo ufw allow from 192.168.0.0/24 to any port 11434

总结

通过修改 Ollama 服务配置,将监听地址从 127.0.0.1:11434 改为 0.0.0.0:11434,使得 Docker 容器可以通过宿主机 IP 地址访问 Ollama 服务。

关键步骤

  1. ✅ 获取宿主机 IP 地址
  2. ✅ 修改 Ollama 服务配置添加 OLLAMA_HOST=0.0.0.0:11434
  3. ✅ 重启服务并验证
  4. ✅ 在 Docker 应用中使用 http://宿主机IP:11434

配置完成后,所有 Docker 容器中的应用都可以通过宿主机 IP 访问 Ollama 服务了!


参考资料


文档版本 :v1.0
更新时间 :2025-10-14
适用系统:Ubuntu 20.04+, Debian 11+, CentOS 8+

相关推荐
鸿蒙小白龙5 小时前
OpenHarmony平台大语言模型本地推理:llama深度适配与部署技术详解
人工智能·语言模型·harmonyos·鸿蒙·鸿蒙系统·llama·open harmony
AI大模型3 天前
轻松搞定百个大模型微调!LLaMA-Factory:你的AI模型量产神器
程序员·llm·llama
fly五行7 天前
大模型基础入门与 RAG 实战:从理论到 llama-index 项目搭建(有具体代码示例)
python·ai·llama·llamaindex
德育处主任Pro11 天前
前端玩转大模型,DeepSeek-R1 蒸馏 Llama 模型的 Bedrock 部署
前端·llama
relis11 天前
AVX-512深度实现分析:从原理到LLaMA.cpp的性能优化艺术
性能优化·llama
relis13 天前
llama.cpp RMSNorm CUDA 优化分析报告
算法·llama
云雾J视界13 天前
开源革命下的研发突围:Meta Llama系列模型的知识整合实践与启示
meta·开源·llama·知识管理·知识整合·知识迭代·知识共享
丁学文武14 天前
大模型原理与实践:第三章-预训练语言模型详解_第3部分-Decoder-Only(GPT、LLama、GLM)
人工智能·gpt·语言模型·自然语言处理·大模型·llama·glm
余衫马15 天前
llama.cpp:本地大模型推理的高性能 C++ 框架
c++·人工智能·llm·llama·大模型部署