2016-05-31 357 views
1

我试图在Eureka上注册一些微服务。他们部署在远程机器上,我希望能够在Eureka上看到机器的IP,但我所能看到的只是一个私人IP,如172.17.0.8,这是不能从外部访问的。在Eureka上注册Docker内部IP的微服务而不是公共的一个

由于这些微服务在Docker容器上运行,我知道我需要告诉服务器来取代主机的IP而不是Docker,但我真的不知道如何。

我看到在github上这个问题 - >https://github.com/spring-cloud/spring-cloud-netflix/issues/432

,并试图:

eureka.instance.prefer-ip-address=true 
eureka.instance.ip-address= 

这完全不是那么回事。有没有办法做到这一点,而不需要将代码添加到我的服务或使用AWS的API?

+0

你需要在这个问题上看得更远。特别是对于aws,你可以从'http:// 169.254.169.254/latest/meta-data/public-ipv4'获得你的主机的ip,以防万一你有春天的麻烦:你可以注入'@Value(“$ {public- ipv4}“)',或者使用那里提到的其他方法。基本上所有人都最终使用该网址。如果您不想在代码中使用它,请在其外部进行检查并使用属性将其带入代码中(https://github.com/spring-cloud/spring-cloud-netflix/issues/432#issuecomment -134512416并阅读这些环境变量) – zapl

+0

您可以尝试设置环境变量'eureka.instance.hostname'中的主机名。但是如果你在aws云上运行并且你的实例是短暂的,你将不得不使用实例元数据来填充环境变量 – Shibashis

+0

我已经看到诸如'hostname:$ {DOCKER_HOST:localhost}'之类的东西,尽管我没有尝试过呢。那是你的意思@Shibashis? –

回答

1

的解决方案是使用一个小的脚本注入多克尔容器内的公网IP:

entrypoint.sh

export DOCKER_HOST_IP=$(curl --retry 3 --connect-timeout 2 --max-time 2 -s 169.254.169.254/latest/meta-data/public-ipv4) 

echo $DOCKER_HOST_IP > /var/log/dockerIp.log 

exec "[email protected]" 

然后修改Dockerfile在开始运行:

FROM java:8 
VOLUME /tmp 
EXPOSE 9000 
ADD service-1.0-SNAPSHOT.jar app.jar 
RUN bash -c 'touch /app.jar' 

COPY entrypoint.sh /usr/local/bin/entrypoint.sh 
RUN chmod +x /usr/local/bin/entrypoint.sh 

CMD bash -c 'source /usr/local/bin/entrypoint.sh && java -Djava.security.egd=file:/dev/./urandom -jar /app.jar' 

主要问题是导出变量因为我们使用source,它只在bash中可用,这就是CMD的原因。

该脚本可以手动放置在项目中,虽然我们将其配置为我们的Maven构建一个自动的资源下载:

  <plugin> 
       <groupId>com.googlecode.maven-download-plugin</groupId> 
       <artifactId>download-maven-plugin</artifactId> 
       <version>1.3.0</version> 
       <executions> 
        <execution> 
         <phase>process-resources</phase> 
         <goals> 
          <goal>wget</goal> 
         </goals> 
         <configuration> 
          <url>https://url/entrypoint.sh</url> 
          <outputDirectory>${project.build.directory}/docker</outputDirectory> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
+0

还有另一种选择:https://github.com/spring-cloud/spring-cloud-netflix/issues/432#issuecomment-135327850 –

0

我已经在我的environments-同样的问题,它与容器编号登记尤里卡而不是主机名。但这不是在AWS上,所以无法将公共IP称为API。下面的命令解决了我的问题 -

sudo docker run -i --net=host <dockerregistry_host>/<appName>:tag 
相关问题