Administrator
Administrator
Published on 2025-02-25 / 3 Visits
0
0

Docker设置容器间相互通信

Docker 设置容器间相互通信

场景:使用 Docker 部署了 ragflow-server,但是使用的模型是通过 ollama 部署的 deepseek-r1:14b,Docker 访问宿主机的服务时不能使用 localhost,因此想到将 ollama 也使用 Docker 部署,将 ollama 服务和 ragflow 服务设置在 Docker 的同一网络下,解决了网络变化宿主机 ip 变化的问题

Docker 容器之间若要通过服务名互相访问,必须满足以下条件:

  1. 同一网络:所有容器必须连接到同一个 Docker 网络

  2. 服务名解析: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)


Comment