如何使用AWS Beanstalk和Spring Cloud Netflixbuild立Docker容器之间的连接

我的应用程序由几个微服务组成。 我想使用NetFlix Eureka作为发现服务器,我想将我的应用程序部署为Docker容器。 我想build立我的服务之间的沟通,但几乎没有问题:

  1. Beanstalk始终使用nginx作为容器的反向代理,默认情况下将所有请求路由到端口80.好的,我已经用一些棘手的脚本殴打。
  2. 我的EC2 Beanstalk实例上有几个networking接口 – docker0,它是docker和eth0的主机IP。 问题是,我无法dynamic确定容器内的主机IP地址,因此无法将其传递到Eureka发现服务器(也作为Docker映像运行),而无需进行硬编码。 使用代码或configuration我只能公开内部的Docker接口,而不是桥接。

所以,底线 – 我想用Docker,Beanstalk和Eureka构build支持微服务的应用程序。 解决scheme应该是可扩展的,除了Eureka主机IP之外,不应该有任何硬编码的值。

谢谢。

  1. 不要使用Elastic Beanstalk – 而是使用ECS进行Docker部署。
  2. 要告诉Eureka应该使用哪个IP,如https://github.com/spring-cloud/spring-cloud-netflix/issues/30中所述 ,使用以下代码片段:

    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; }