两个Docker化Spring Boot应用通过自定义Docker网络通信失败如何解决?
问题根因
Docker自定义网桥网络内置了DNS解析能力,同网络下的容器只能通过服务名/容器名互相访问,你之前的错误配置原因如下:
- 用
localhost访问时,指向的是当前Hello服务容器自身的环回地址,自然找不到运行在World服务容器的8082端口,触发连接拒绝错误 - 用
custom_net作为域名访问时,网络名称本身不具备DNS解析能力,所以会抛出未知主机异常
调整步骤
- 修正Hello服务的application.yml配置,将world服务的访问地址改为容器名+容器内部端口:
server: port: 8081 services: world: url: http://world_service:8082/world
注:此处用的是World服务的容器名world_service,端口用的是World服务容器内部监听的8082端口,不需要使用宿主机映射的8092端口,同网络容器通信不需要走宿主机端口映射。
- 修正docker-compose.yml的缩进错误,你原配置中
hello_service下的networks、depends_on等字段缩进层级错误,需要和image、container_name字段保持同级,修正后的完整配置如下:
version: '3' services: hello_service: image: 'openjdk:8-jdk-alpine' restart: always container_name: hello_service volumes: - ./deploy:/root networks: - custom_net depends_on: - world_service command: sh -c "java -jar -Dspring.config.location=file:///root/hello/application.yml /root/hello/hello-0.0.1-SNAPSHOT.jar " ports: - 8091:8081 world_service: image: 'openjdk:8-jdk-alpine' restart: always container_name: world_service volumes: - ./deploy:/root command: sh -c "java -jar -Dspring.config.location=file:///root/world/application.yml /root/world/world-0.0.1-SNAPSHOT.jar " ports: - 8092:8082 networks: - custom_net networks: custom_net: driver: bridge
- 重启服务生效:
docker-compose down && docker-compose up -d
内容的提问来源于stack exchange,提问作者mAsK
相关产品推荐
相关产品推荐

