2 docker 化 spring 启动应用程序之间的通信使用自定义 docker 网络
Communication between 2 dockerized spring boot applications using custom docker network
我有一个 Hello 服务和 World 服务。 Hello 服务有一个休息点 /hello/hw,它在内部调用世界服务中的休息端点到 return 字符串“Hello World”。
如果系统未 dockerized,应用程序可以正常工作。
然而,问题是当我想 dockerize 系统时。
我使用 docker-compose 来容器化这两个服务。我在 docker 组合文件中定义了一个自定义网络(命名为 custom_net)。
rest 端点 /hello/hw 可访问,但 Hello 服务无法调用 World 服务中的 rest 端点。
Hello服务中的application.properties有World服务的url为http://localhost:8082/world
当我将 url 设置为 http://custom_net:8082/world 或 http://custom_net:8092/world[=14= 时出现 UnknownHostException ]
当我不更改 application.properties 中的 url 时,出现连接被拒绝的异常。
日志消息指出 'failed: Connection refused: localhost/127.0.0.1:8082;'
我不确定桥接这两个服务需要什么配置
命令docker网络列表显示自定义网络名称为'tempfolder_custom_net'。
命令 docker inspect 显示 hello 和 world 服务都注册到这个网络
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
Application.yml 你好服务...
server:
port: 8081
services:
world:
url: http://localhost:8082/world
您应该基于 openjdk:8-jdk-alpine
图像构建新图像,并添加 ENTRYPOINT
你应该改变这个:
server:
port: 8081
services:
world:
url: http://localhost:8082/world
收件人:
server:
port: 8081
services:
world:
url: http://world_service:8092/world
确保两个容器都是 运行。
@Thanh Nuguyen Van 感谢您提供有用的故障排除提示。
问题出在主机名 world_service 上。看起来下划线不是有效的 URL。下面是我更新的 docker 撰写文件。我什至不必使用自定义 docker 网络。我将 application.yml 中的 url 更新为 http://worldservice:8082/world。
还要注意端口是 8082 而不是 8092。我们必须提到应用程序的端口而不是 docker 暴露的端口。
version: '3'
services:
helloservice:
image: 'openjdk:8-jdk-alpine'
restart: always
container_name: helloservice
volumes:
- ./deploy:/root
#networks:
#- custom_net
depends_on:
- worldservice
command: sh -c "java -Xdebug -jar -Dspring.config.location=file:///root/hello/application.yml /root/hello/hello-0.0.1-SNAPSHOT.jar "
ports:
- 8091:8081
worldservice:
image: 'openjdk:8-jdk-alpine'
restart: always
container_name: worldservice
volumes:
- ./deploy:/root
command: sh -c "java -Xdebug -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
我有一个 Hello 服务和 World 服务。 Hello 服务有一个休息点 /hello/hw,它在内部调用世界服务中的休息端点到 return 字符串“Hello World”。 如果系统未 dockerized,应用程序可以正常工作。
然而,问题是当我想 dockerize 系统时。 我使用 docker-compose 来容器化这两个服务。我在 docker 组合文件中定义了一个自定义网络(命名为 custom_net)。
rest 端点 /hello/hw 可访问,但 Hello 服务无法调用 World 服务中的 rest 端点。
Hello服务中的application.properties有World服务的url为http://localhost:8082/world
当我将 url 设置为 http://custom_net:8082/world 或 http://custom_net:8092/world[=14= 时出现 UnknownHostException ]
当我不更改 application.properties 中的 url 时,出现连接被拒绝的异常。 日志消息指出 'failed: Connection refused: localhost/127.0.0.1:8082;' 我不确定桥接这两个服务需要什么配置
命令docker网络列表显示自定义网络名称为'tempfolder_custom_net'。 命令 docker inspect 显示 hello 和 world 服务都注册到这个网络
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
Application.yml 你好服务...
server:
port: 8081
services:
world:
url: http://localhost:8082/world
您应该基于 openjdk:8-jdk-alpine
图像构建新图像,并添加 ENTRYPOINT
你应该改变这个:
server:
port: 8081
services:
world:
url: http://localhost:8082/world
收件人:
server:
port: 8081
services:
world:
url: http://world_service:8092/world
确保两个容器都是 运行。
@Thanh Nuguyen Van 感谢您提供有用的故障排除提示。 问题出在主机名 world_service 上。看起来下划线不是有效的 URL。下面是我更新的 docker 撰写文件。我什至不必使用自定义 docker 网络。我将 application.yml 中的 url 更新为 http://worldservice:8082/world。 还要注意端口是 8082 而不是 8092。我们必须提到应用程序的端口而不是 docker 暴露的端口。
version: '3'
services:
helloservice:
image: 'openjdk:8-jdk-alpine'
restart: always
container_name: helloservice
volumes:
- ./deploy:/root
#networks:
#- custom_net
depends_on:
- worldservice
command: sh -c "java -Xdebug -jar -Dspring.config.location=file:///root/hello/application.yml /root/hello/hello-0.0.1-SNAPSHOT.jar "
ports:
- 8091:8081
worldservice:
image: 'openjdk:8-jdk-alpine'
restart: always
container_name: worldservice
volumes:
- ./deploy:/root
command: sh -c "java -Xdebug -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