Java 微服务在Eureka上注册Docker内部IP而不是公共IP
我想在Eureka上注册一些微服务。它们部署在远程机器上,我希望能够在Eureka上看到机器的IP,但我只能看到像Java 微服务在Eureka上注册Docker内部IP而不是公共IP,java,docker,spring-cloud,netflix-eureka,Java,Docker,Spring Cloud,Netflix Eureka,我想在Eureka上注册一些微服务。它们部署在远程机器上,我希望能够在Eureka上看到机器的IP,但我只能看到像172.17.0.8这样的私有IP,无法从外部访问 由于这些微服务是在Docker容器上运行的,我知道我需要告诉服务获取主机的IP而不是Docker的IP,但我真的不知道怎么做 我在github上看到了这个问题-> 并尝试: eureka.instance.prefer-ip-address=true eureka.instance.ip-address= 这不太管用。有没有一种方
172.17.0.8
这样的私有IP,无法从外部访问
由于这些微服务是在Docker容器上运行的,我知道我需要告诉服务获取主机的IP而不是Docker的IP,但我真的不知道怎么做
我在github上看到了这个问题->
并尝试:
eureka.instance.prefer-ip-address=true
eureka.instance.ip-address=
这不太管用。有没有一种方法不涉及向我的服务添加代码或使用AWS的API 解决方案是使用一个小脚本将公共IP注入Docker容器中: 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 "$@"
然后修改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>
com.googlecode.maven-download-plugin
下载maven插件
1.3.0
过程资源
wget
https://url/entrypoint.sh
${project.build.directory}/docker
我在我的环境中也遇到了同样的问题-它是用eureka上的容器ID而不是主机名注册的。但这不在AWS上,因此无法为公共ip调用API。下面的命令解决了我的问题-
sudo docker run -i --net=host <dockerregistry_host>/<appName>:tag
sudo docker run-i--net=host/:tag
您需要进一步了解该问题。特别是对于aws,您可以从http://169.254.169.254/latest/meta-data/public-ipv4
,如果您有spring aws:您可以注入@Value(“${public-ipv4}”)
,或者使用这里提到的其他方法。基本上,他们最终都会使用这个url。如果您不希望它出现在代码中,请在其外部某处进行检查,并使用属性将其放入代码中(并读取这些环境变量)。您可以尝试在环境变量eureka.instance.hostname
中设置主机名。但是,如果您在aws云上运行,并且您的实例是短暂的,那么您必须使用实例元数据来填充环境变量。我已经看到了类似这样的内容:hostname:${DOCKER\u HOST:localhost}
,尽管我还没有尝试过。这就是你所说的@Shibashis吗?这取决于你是否在主机上设置了DOCKER_主机。我建议在docker Startup中添加一个环境变量还有另一个选项: