通过 Docker 主机名在两个微服务之间进行通信
Posted
技术标签:
【中文标题】通过 Docker 主机名在两个微服务之间进行通信【英文标题】:Communication between two microservices by Docker hostname 【发布时间】:2018-09-07 03:39:42 【问题描述】:现在如何运作:
微服务 X 使用静态 IP 向微服务 Y 发出 REST API 请求
http://ip-address:port/doSomething
问题:
问题是我不能长期保证静态ip。 我不想通过使用 docker 主机名来解决这个问题:
http://hostname:port/doSomething
我尝试通过在 docker-compose 中创建已使用的已定义网络来实现此目的:
#part of docker-compose file
streamapp:
hostname: twitterstreamapp
image: twitterstreamapp
container_name: twitterstreamapp
restart: always
ports:
- '8090:8080'
build:
context: ./TwitterStream
dockerfile: Dockerfile
storeapp:
hostname: twitterstoreapp
image: twitterstoreapp
container_name: twitterstoreapp
restart: always
ports:
- '8095:8080'
build:
context: ./TwitterStore
dockerfile: Dockerfile
depends_on:
- 'mysql-db'
networks:
- backend
volumes:
MyDataVolume:
networks:
backend:
driver: bridge
我可以从 Container X ping 到 Container Y。但不是 Curl。 我该如何解决这个问题,或者这不是实现我想要的最佳方式。
【问题讨论】:
【参考方案1】:解决方案非常简单,您可以使用服务名称来代替使用 IP 或主机名。
在您的示例中,在streamapp
服务中,您可以使用http://storeapp:8080
访问另一个服务。
同样,在storeapp
服务中,您可以通过http://streamapp:8080
访问另一个服务。
请注意,您必须使用内部端口,而不是导出的端口。
这不适用于您从其他机器(即互联网)访问服务时。在这种情况下,您必须使用http://IP_OF_THE_MACHINE:8090
【讨论】:
你是我的英雄!我没有意识到我需要使用内部端口。谢谢! 我想在同一台机器上做这个?,几个节点,所以它可能......或者简单的方法就是做你的例子。以上是关于通过 Docker 主机名在两个微服务之间进行通信的主要内容,如果未能解决你的问题,请参考以下文章