0

docker で eureka を使用して spring-server と spring-client を構築し、クライアントをサーバーに接続しようとしています。私の中でこれを試すとbuild.gradle

docker {
  maintainer = 'Me'
  baseImage = 'java:8'
}

distDocker {
  exposePort 8080
  setEnvironment 'JAVA_OPTS', '-Dspring.profiles.active=docker'
}

すべてが機能します。

Dockerfileしかし、私が書いたを使いたいので、buildDocker代わりに使用し、次のように使用distDockerします。

task buildDocker(type: Docker, dependsOn: build) {
  dockerfile = file('src/main/docker/Dockerfile')
  doFirst {
    copy {
      from jar
      into stageDir
    }
  }
}

これでDockerfile

FROM java:8
ADD myjar-1.0.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]

そしてそれは常に

接続拒否エラーまたはより正確には ClientHandleException: http://localhost:8761への接続が拒否されました

どこに問題があるのか​​ よくわかりませんか?サーバーに接続しようとしない場合は両方の方法で機能しますが、接続しようとすると機能しdistDockerます。

4

1 に答える 1

4

コンテナー内で実行されている Spring Boot クライアント アプリは、localhost:8761 に到達しようとしています。この Docker コンテナーのコンテキストでは、'localhost' はコンテナーのアドレスを参照しているためです。コンテナーのポート 8761 で何も実行されていないため、connection refusedエラーが表示されます。

これは役立つかもしれません:

クライアント アプリの構成で Eureka の場所を次のように指定しますapplication.yml

eureka:
  client:
    serviceUrl:
      defaultZone: <IP-address-of-Eureka-server>/eureka/

は、コンテナー<IP-address-of-Eureka-server>から解決できる IP アドレスまたはホスト名のいずれかです。ホストVM (Docker コンテナーを実行するホスト)のアドレスを渡したい場合は、フォームを使用して環境変数として渡すことができます。このようなもの:--env eureka.client.serviceUrl.defaultZone=xx.xx.xx.xx

$ docker run ... --env eureka.client.serviceUrl.defaultZone=xx.xx.xx.xx

関連する注意事項として、Spring Boot クライアント アプリケーションもそれ自体を Eureka に登録する必要がある場合は、Spring Boot アプリの解決可能なホスト名とポートを Eureka に公開するための追加の構成が必要になります。次のものを に追加できますapplication.yml

eureka:
  instance:
    hostname: <client-host>
    nonSecurePort: <client-port>

ここで、 <client-host>はクライアント アプリ コンテナーの解決可能なホスト名です。コンテナの公開ポートにバインドされて <client-port>いるホスト VM のポートです。

繰り返しますが、--env上記のように引数を使用してこれらを渡すことができます。

$ docker run -p 9001:8080 ... \
             --env eureka.instance.hostname=yy.yy.yy.yy \
             --env eureka.instance.nonSecurePort=9001

yy.yy.yy.yy必ずVM の IP アドレスに設定してください。

于 2015-11-18T04:17:55.297 に答える