Docker部署Spring Boot微服务WebClient调用报错:无法解析address-api
问题原因
两个微服务分别通过独立的docker-compose up启动,默认会被分配到不同的Docker专属网络中,导致Person服务无法解析Address服务的address-api主机名,因为跨网络的服务无法直接通过主机名/服务名互相访问。
解决方案
方案1:合并到同一个docker-compose文件
将两个服务的配置放到同一个docker-compose.yml中,Docker Compose会自动创建一个共享网络,所有服务默认加入该网络,可直接通过服务名/主机名通信。
示例合并后的配置:
services: # Address服务配置 address-api: build: ./address-service # 替换为Address服务的实际项目路径 restart: always ports: - "8083:8080" depends_on: sale: condition: service_healthy hostname: address-api # Person服务配置 person-api: build: ./person-service # 替换为Person服务的实际项目路径 restart: always ports: - "8082:8080" # 根据实际需求调整外部映射端口 # 依赖的sale服务(需确保配置完整) sale: image: your-sale-image:tag # 根据实际情况填写镜像信息 restart: always healthcheck: test: ["CMD", "curl", "-f", "http://localhost:xxx/health"] # 配置健康检查规则 interval: 10s timeout: 5s retries: 3
方案2:手动创建共享网络
如果不想合并配置,可创建一个公共Docker网络,让两个服务的compose文件都加入该网络:
- 先创建共享网络:
docker network create microservices-shared-net
- 修改Address服务的
docker-compose.yml,加入网络配置:
services: address-api: build: . restart: always ports: - "8083:8080" depends_on: sale: condition: service_healthy hostname: address-api networks: - microservices-shared-net sale: # 原sale服务配置 networks: - microservices-shared-net networks: microservices-shared-net: external: true # 声明使用已存在的外部网络
- 修改Person服务的
docker-compose.yml,加入同一个网络:
services: person-api: build: . restart: always ports: - "8082:8080" networks: - microservices-shared-net networks: microservices-shared-net: external: true
额外注意点
- 确认Address服务的
sale依赖已正确配置健康检查规则,避免Address服务未完全启动就被Person服务调用。 - Person服务中调用地址
http://address-api:8080/address/是正确的(容器内部使用8080端口,无需用外部映射的8083端口)。
内容的提问来源于stack exchange,提问作者java12399900
相关产品推荐
相关产品推荐

