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 地址
hostname -I | awk '{print $1}'
示例输出:
192.168.0.105
📝 记下这个 IP 地址,后续配置需要使用。
步骤 2:检查 Ollama 当前监听状态
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 是否作为系统服务运行
sudo systemctl status ollama
如果返回服务状态信息,说明 Ollama 作为系统服务运行,需要修改服务配置文件。
如果提示服务不存在,Ollama 可能是手动启动的,可以直接用环境变量启动。
步骤 4:修改 Ollama 系统服务配置
4.1 查看当前配置
cat /etc/systemd/system/ollama.service
4.2 修改配置文件
使用以下命令修改配置文件,添加 OLLAMA_HOST
环境变量:
sudo nano /etc/systemd/system/ollama.service
或者直接使用命令一次性修改(推荐):
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:重新加载配置并重启服务
# 重新加载 systemd 配置
sudo systemctl daemon-reload# 重启 Ollama 服务
sudo systemctl restart ollama# 检查服务状态
sudo systemctl status ollama
步骤 6:验证配置是否生效
6.1 检查监听地址
sudo netstat -tuln | grep 11434
期望输出(监听所有接口):
tcp6 0 0 :::11434 :::* LISTEN
✅
:::11434
表示监听所有网络接口(IPv4 和 IPv6)
6.2 测试通过宿主机 IP 访问
# 替换 192.168.0.105 为您的宿主机 IP
curl http://192.168.0.105:11434/api/tags
成功输出示例:
{"models": [{"name": "deepseek-r1:1.5b","model": "deepseek-r1:1.5b",...}]
}
6.3 测试聊天功能
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:11434
或http://127.0.0.1:11434
防火墙配置(可选)
如果系统启用了防火墙,需要开放 11434 端口:
Ubuntu/Debian (UFW)
sudo ufw allow 11434/tcp
sudo ufw reload
CentOS/RHEL (firewalld)
sudo firewall-cmd --permanent --add-port=11434/tcp
sudo firewall-cmd --reload
常见问题排查
问题 1:容器仍然无法连接
检查项:
-
确认 Ollama 监听地址是否正确:
sudo netstat -tuln | grep 11434
-
测试宿主机 IP 是否可访问:
curl http://192.168.0.105:11434/api/tags
-
检查防火墙规则
问题 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
:
#!/bin/bashecho "🚀 开始配置 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"; thenecho "✅ Ollama 已成功监听所有网络接口"
elseecho "❌ Ollama 监听配置可能有问题"
fi# 测试访问
echo "🧪 测试访问..."
if curl -s http://$HOST_IP:11434/api/tags > /dev/null; thenecho "✅ 通过宿主机 IP 访问成功"echo ""echo "📋 请在 Docker 应用中使用以下配置:"echo " Base URL: http://$HOST_IP:11434"echo " 模型名称: deepseek-r1:1.5b"
elseecho "❌ 访问失败,请检查防火墙设置"
fi
使用方法:
chmod +x configure_ollama_for_docker.sh
./configure_ollama_for_docker.sh
手动启动方式(非系统服务)
如果 Ollama 不是作为系统服务运行,可以使用以下方式启动:
# 停止当前运行的 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
安全提示
⚠️ 注意事项:
- 局域网访问:配置后 Ollama 可被局域网内其他设备访问
- 生产环境:建议配置防火墙规则,只允许特定 IP 访问
- 敏感数据:不要在公网环境中暴露 Ollama 服务
限制访问的防火墙规则:
# 只允许 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 服务。
关键步骤:
- ✅ 获取宿主机 IP 地址
- ✅ 修改 Ollama 服务配置添加
OLLAMA_HOST=0.0.0.0:11434
- ✅ 重启服务并验证
- ✅ 在 Docker 应用中使用
http://宿主机IP:11434
配置完成后,所有 Docker 容器中的应用都可以通过宿主机 IP 访问 Ollama 服务了!
参考资料
- Ollama 官方文档
- Docker 网络配置
- RAGFlow 文档
文档版本:v1.0
更新时间:2025-10-14
适用系统:Ubuntu 20.04+, Debian 11+, CentOS 8+