Docker 设置容器间相互通信
场景:使用 Docker 部署了 ragflow-server,但是使用的模型是通过 ollama 部署的 deepseek-r1:14b,Docker 访问宿主机的服务时不能使用 localhost,因此想到将 ollama 也使用 Docker 部署,将 ollama 服务和 ragflow 服务设置在 Docker 的同一网络下,解决了网络变化宿主机 ip 变化的问题
Docker 容器之间若要通过服务名互相访问,必须满足以下条件:
同一网络:所有容器必须连接到同一个 Docker 网络。
服务名解析:Docker 内置的 DNS 会将服务名(如
ollama
)解析为对应容器的 IP 地址。
1:找到目标容器的网络名称
以 ragflow-server
为例,先确认它所在的网络名称:
# 查看容器的网络配置
docker inspect ragflow-server | grep "NetworkMode"
# 返回结果看到 ragflow-server 所在的网络是 docker_ragflow
"NetworkMode": "docker_ragflow",
记下网络名称(如 docker_ragflow
)。
2:修改 ollama 的 Docker Compose 文件
创建或修改 docker-compose.yml
,将ollama
服务加入现有网络:
services:
ollama:
container_name: ollama
image: ollama/ollama:latest
volumes:
- ollama_volume:/root/.ollama
ports:
- "11434:11434"
healthcheck:
test: ["CMD-SHELL", "curl --silent --fail http://localhost:11434/ || exit 1"]
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
networks:
- existing_network_ragflow # 指向自定义的网络标识,此名称需与下方 networks 定义一致
environment:
- OLLAMA_HOST=0.0.0.0:11434 # 监听所有网络接口,设置 ollama 允许外部访问
volumes:
ollama_volume:
# 定义网络配置
networks:
existing_network_ragflow: # 在 Compose 文件内部的网络标识(可自由命名,仅用于引用)
external: true # 声明这是一个外部已存在的网络,告知 Docker 此网络已存在,不要尝试新建。
name: docker_ragflow # 真实存在的网络名称(必须准确),这里使用第一步查到的 docker_ragflow
3:修改后的 docker-compose.yml 在已构建的容器中生效
执行一下命令,重新创建新的ollama
容器
docker-compose up -d --force-recreate
--force-recreate
:强制重新创建容器(即使配置未更改)-d
:后台运行
4:验证是否生效
# 检查容器 ragflow 容器 id
docker ps |grep ragflow-server
# 进入容器 ragflow 容器检查是否能和 ollama 通信
docker exec -it <container_id> bash
curl http://ollama:11434
使用 ollama
代理 ip
访问,是因为 Docker Compose 会以 services
下的服务名作为容器的主机名(hostname)