You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两个独立Docker容器通过REST通信的配置问题

问题描述

我通过make命令启动两个单体应用,它们依赖众多组件、启动耗时较长。其中一个单体的API需要调用另一个单体的REST接口,本地主机可正常访问两者,但从容器内部调用时会超时。我不太熟悉Docker及网络相关知识,想了解需向调用方API容器传递接收方API的哪些信息才能实现通信。

两个单体分别通过不同的docker-compose.yaml文件定义服务,其中一个服务的配置示例如下:

services:
  pims-api.lh.local:
    container_name: pims-api.lh.local
    env_file: .env.local
    build:
      dockerfile: Dockerfile
      target: pims-image
      context: .
    volumes:
      - '.:/var/www/html:cached'
    depends_on:
      - db.lh.local
      - redis.lh.local

  pims-api-nginx.lh.local:
    container_name: pims-api-nginx.lh.local
    image: nginx:1.21
    restart: 'always'
    entrypoint:
      - '/usr/sbin/nginx'
      - '-c'
      - '/etc/nginx/nginx.conf'
      - '-g'
      - 'daemon off;'
    volumes:
      - '.:/var/www/html:cached'
      - './config/nginx/nginx.conf:/etc/nginx/nginx.conf'
      - './config/nginx/app.conf.local:/etc/nginx/conf.d/app.conf'
    ports:
      - 8100:80
    depends_on:
      - pims-api.lh.local
    links:
      - pims-api.lh.local

本地主机可通过http://pims-api.lh.local:8100/访问该服务,但另一个单体的服务调用此地址时会超时。现有Docker网络列表如下:

will$ docker network ls
NETWORK ID     NAME                     DRIVER    SCOPE
2e83faeabb3c   bridge                   bridge    local
159d8ffaace3   host                     host      local
abe217b17a92   pims-api_default         bridge    local
2f09770d776a   product_default          bridge    local

我希望桥接pims-api_default和product_default网络,不清楚正确的实现方法,恳请指导。


解决方案

要让两个不同docker-compose项目的容器互相通信,核心是让它们处于同一个Docker网络中。以下是两种可行的实现方式:

方法一:让调用方容器加入接收方的现有网络

假设调用方属于product_default网络的项目,接收方属于pims-api_default网络:

  1. 确认接收方网络存在:
    docker inspect pims-api_default
    
  2. 修改调用方的docker-compose.yaml,将服务加入pims-api_default网络。如果需要保留原项目网络,可配置多网络:
    services:
      # 调用方服务的原有配置保持不变
      product-api.lh.local:
        # ...其他配置项
        networks:
          - default
          - pims-api-network
    
    networks:
      default:
        name: product_default
      pims-api-network:
        external: true
        name: pims-api_default
    
    如果直接替换默认网络,可简化为:
    networks:
      default:
        external: true
        name: pims-api_default
    
  3. 重启调用方服务使配置生效:
    docker-compose down && docker-compose up -d
    
  4. 调整容器内的调用地址:此时调用方容器无需使用主机端口,直接通过接收方的服务名/容器名+内部端口访问,例如:
    curl http://pims-api-nginx.lh.local/
    

方法二:创建独立共享网络让两个项目都加入

如果不想依赖任意一个项目的默认网络,可创建一个独立的共享网桥:

  1. 创建共享网络:
    docker network create shared-api-network
    
  2. 修改第一个项目(pims-api)的docker-compose.yaml,指定使用共享网络:
    services:
      # 原有服务配置保持不变
    networks:
      default:
        name: shared-api-network
    
  3. 修改第二个项目(product)的docker-compose.yaml,同样指定使用共享网络:
    services:
      # 原有服务配置保持不变
    networks:
      default:
        name: shared-api-network
    
  4. 分别重启两个项目的服务:
    # 在pims-api项目目录下执行
    docker-compose down && docker-compose up -d
    # 在product项目目录下执行
    docker-compose down && docker-compose up -d
    
  5. 容器内调用:直接使用服务名/容器名+内部端口访问即可。

关键注意事项

  • 容器间通信无需依赖主机映射端口,直接使用容器内部的端口(例如Nginx的80端口,而非主机的8100)。
  • 同一网络内的容器可通过docker-compose定义的服务名直接解析,无需手动配置IP。
  • 避免使用links配置,这是Docker的旧特性,自定义网络已替代其功能。

内容的提问来源于stack exchange,提问作者Will

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:40:50