如何使用 AWS Beanstalk 和 Spring Cloud Netflix 在 Docker 容器之间建立连接
Posted
技术标签:
【中文标题】如何使用 AWS Beanstalk 和 Spring Cloud Netflix 在 Docker 容器之间建立连接【英文标题】:How to set up connection between Docker containers using AWS Beanstalk and Spring Cloud Netflix 【发布时间】:2015-09-18 20:07:11 【问题描述】:我的应用由多个微服务组成。 我想使用 NetFlix Eureka 作为发现服务器,我想将我的应用程序部署为 Docker 容器。我想在我的服务之间建立通信,但是有几个问题:
-
Beanstalk 始终使用 nginx 作为容器的反向代理,默认情况下将所有请求路由到端口 80。好的,我已经使用一些棘手的脚本解决了这个问题。
我的 EC2 Beanstalk 实例上有多个网络接口 - docker0 是 docker 的网桥,eth0 是主机 IP。问题是,我无法动态确定容器内的主机 IP 地址,因此我无法在没有硬编码的情况下将其传递给 Eureka 发现服务器(也作为 Docker 映像运行)。使用代码或配置,我只能公开内部 Docker 接口而不能桥接。
所以,底线 - 我想使用 Docker、Beanstalk 和 Eureka 构建支持微服务的应用程序。解决方案应该是可扩展的,并且除了 Eureka 主机 IP 之外不应有任何硬编码值。
谢谢。
【问题讨论】:
这可能与***.com/questions/29971909/…重复 好的,我找到了答案 - 需要使用 AmazonDataCenterInfo 来获取正确的 IP。稍后会写完整的答案。 How to let different Docker containers talk to each other without exposing the ports to the whole world的可能重复 @PaulSweatte – 不,这是完全不同的问题。这是关于在 Elastic Beanstalk 上的 Docker 内运行的应用程序中为 Eureka 配置提供适当的 IP。 【参考方案1】:-
不要使用 Elastic Beanstalk - 改为使用 ECS 进行 Docker 部署。
要告诉 Eureka 应该使用哪个 IP,如 https://github.com/spring-cloud/spring-cloud-netflix/issues/30 中所述,请使用以下 sn-p:
public EurekaInstanceConfigBean eurekaInstanceConfig()
InetUtilsProperties inetUtilsProperties = new InetUtilsProperties();
inetUtilsProperties.setDefaultHostname(EC2MetadataUtils.getLocalHostName());
inetUtilsProperties.setDefaultIpAddress(EC2MetadataUtils.getPrivateIpAddress());
EurekaInstanceConfigBean config = new EurekaInstanceConfigBean(new InetUtils(inetUtilsProperties));
AmazonInfo info = AmazonInfo.Builder.newBuilder().autoBuild("eureka");
config.setDataCenterInfo(info);
info.getMetadata().put(AmazonInfo.MetaDataKey.publicHostname.getName(), EC2MetadataUtils.getLocalHostName());
config.setHostname(EC2MetadataUtils.getLocalHostName());
config.setIpAddress(EC2MetadataUtils.getPrivateIpAddress());
config.setNonSecurePort(port);
return config;
【讨论】:
以上是关于如何使用 AWS Beanstalk 和 Spring Cloud Netflix 在 Docker 容器之间建立连接的主要内容,如果未能解决你的问题,请参考以下文章
如何在中国区域的AWS beanstalk实例上部署美国区域的AWS beanstalk实例
如何在 ECS(容器存储)上验证 AWS EBS(Beanstalk)? AccessDeniedException
AWS Elastic Beanstalk - 如何使用 npm 和 webpack 构建捆绑 JS
如何在 AWS Elastic Beanstalk、连接池和领域上配置 Glassfish