2016-05-31 75 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 
相關問題