两个独立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网络:
- 确认接收方网络存在:
docker inspect pims-api_default - 修改调用方的
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_defaultnetworks: default: external: true name: pims-api_default - 重启调用方服务使配置生效:
docker-compose down && docker-compose up -d - 调整容器内的调用地址:此时调用方容器无需使用主机端口,直接通过接收方的服务名/容器名+内部端口访问,例如:
curl http://pims-api-nginx.lh.local/
方法二:创建独立共享网络让两个项目都加入
如果不想依赖任意一个项目的默认网络,可创建一个独立的共享网桥:
- 创建共享网络:
docker network create shared-api-network - 修改第一个项目(pims-api)的
docker-compose.yaml,指定使用共享网络:services: # 原有服务配置保持不变 networks: default: name: shared-api-network - 修改第二个项目(product)的
docker-compose.yaml,同样指定使用共享网络:services: # 原有服务配置保持不变 networks: default: name: shared-api-network - 分别重启两个项目的服务:
# 在pims-api项目目录下执行 docker-compose down && docker-compose up -d # 在product项目目录下执行 docker-compose down && docker-compose up -d - 容器内调用:直接使用服务名/容器名+内部端口访问即可。
关键注意事项
- 容器间通信无需依赖主机映射端口,直接使用容器内部的端口(例如Nginx的80端口,而非主机的8100)。
- 同一网络内的容器可通过docker-compose定义的服务名直接解析,无需手动配置IP。
- 避免使用
links配置,这是Docker的旧特性,自定义网络已替代其功能。
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

