1

Docker Toolbox for Windowsの古いバージョンを使用していたため、 。Docker For Windows - 別のコンテナに配置された別のJavaアプリケーションを呼び出すときに、コンテナにデプロイされたJavaアプリケーションが接続拒否エラーを受け取る

Dockerfileは、両方のアプリケーションで使用される:

私は2つのJavaアプリケーションは、独自のコンテナ上で動作している必要があり

FROM frolvlad/alpine-oraclejdk8:slim 
VOLUME /tmp 
ADD archimedes-0.0.1-SNAPSHOT.jar app.jar 
RUN sh -c 'touch /app.jar' 
ENV JAVA_OPTS="-Xms750m -Xmx750m" 
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ] 

私は(以前ドッカーツールボックスで、それは192.168.99.100をマッピングされた)archimedes1 \ 2マップ127.0.0.1を作るために私のWindows /etc/hostsファイルにを変更:

127.0.0.1   archimedes1 
127.0.0.1   archimedes2 

これは私が(気付かコンテナを起動する方法ですホスト名のコンテナに認識させるために--add-ホストの使用):

docker run -e "SPRING_PROFILES_ACTIVE=archimedes1" -p 8761:8761 --name archimedes1 --add-host archimedes1:127.0.0.1 --add-host archimedes2:127.0.0.1 -d storyteller/archimedes 
docker run -e "SPRING_PROFILES_ACTIVE=archimedes2" -p 8762:8762 --name archimedes2 --add-host archimedes1:127.0.0.1 --add-host archimedes2:127.0.0.1 -d storyteller/archimedes 

互いにショーでの接続を接触させたときに、コンテナをこのはドッカーツールボックスで働いていたが、私はWindows用ドッカーをインストールしてからエラーを拒否しました。 archimedes1呼び出そうとしarchimedes2この場合:

2017-01-25 13:10:27.406 DEBUG 5 --- [t_archimedes1-2] c.n.d.shared.MonitoredConnectionManager : Get connection: {}->http://archimedes1:8761, timeout = 200 
2017-01-25 13:10:27.406 DEBUG 5 --- [t_archimedes1-2] c.n.d.shared.NamedConnectionPool   : [{}->http://archimedes1:8761] total kept alive: 0, total issued: 0, total allocated: 0 out of 1000 
2017-01-25 13:10:27.406 DEBUG 5 --- [t_archimedes1-2] c.n.d.shared.NamedConnectionPool   : No free connections [{}->http://archimedes1:8761][null] 
2017-01-25 13:10:27.406 DEBUG 5 --- [t_archimedes1-2] c.n.d.shared.NamedConnectionPool   : Available capacity: 500 out of 500 [{}->http://archimedes1:8761][null] 
2017-01-25 13:10:27.406 DEBUG 5 --- [t_archimedes1-2] c.n.d.shared.NamedConnectionPool   : Creating new connection [{}->http://archimedes1:8761] 
2017-01-25 13:10:27.407 DEBUG 5 --- [t_archimedes1-2] c.n.d.shared.MonitoredConnectionManager : Released connection is not reusable. 
2017-01-25 13:10:27.407 DEBUG 5 --- [t_archimedes1-2] c.n.d.shared.NamedConnectionPool   : Releasing connection [{}->http://archimedes1:8761][null] 
2017-01-25 13:10:27.407 DEBUG 5 --- [t_archimedes1-2] c.n.d.shared.NamedConnectionPool   : Notifying no-one, there are no waiting threads 
2017-01-25 13:10:27.407 ERROR 5 --- [t_archimedes1-2] c.n.e.cluster.ReplicationTaskProcessor : Network level connection to peer archimedes1; retrying after delay 

com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused (Connection refused) 
     at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:187) ~[jersey-apache-client4-1.19.1.jar!/:1.19.1] 
     at com.netflix.eureka.cluster.DynamicGZIPContentEncodingFilter.handle(DynamicGZIPContentEncodingFilter.java:48) ~[eureka-core-1.4.12.jar!/:1.4.12] 
     at com.netflix.discovery.EurekaIdentityHeaderFilter.handle(EurekaIdentityHeaderFilter.java:27) ~[eureka-client-1.4.12.jar!/:1.4.12] 
     at com.sun.jersey.api.client.Client.handle(Client.java:652) ~[jersey-client-1.19.1.jar!/:1.19.1] 
     at com.sun.jersey.api.client.WebResource.handle(WebResource.java:682) ~[jersey-client-1.19.1.jar!/:1.19.1] 
     at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74) ~[jersey-client-1.19.1.jar!/:1.19.1] 
     at com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:570) ~[jersey-client-1.19.1.jar!/:1.19.1] 
     at com.netflix.eureka.transport.JerseyReplicationClient.submitBatchUpdates(JerseyReplicationClient.java:116) ~[eureka-core-1.4.12.jar!/:1.4.12] 
     at com.netflix.eureka.cluster.ReplicationTaskProcessor.process(ReplicationTaskProcessor.java:71) ~[eureka-core-1.4.12.jar!/:1.4.12] 
     at com.netflix.eureka.util.batcher.TaskExecutors$BatchWorkerRunnable.run(TaskExecutors.java:187) [eureka-core-1.4.12.jar!/:1.4.12] 
     at java.lang.Thread.run(Thread.java:745) [na:1.8.0_121] 
Caused by: java.net.ConnectException: Connection refused (Connection refused) 

私はarchimedes2のコンテナからのコンテナとping archimedes1へのshを起動して、それがに答えるん。私はのtelnetをすれば

-> docker exec -it archimedes2 sh 
/# ping archimedes1 
PING archimedes1 (127.0.0.1): 56 data bytes 
64 bytes from 127.0.0.1: seq=0 ttl=64 time=0.072 ms 

は、しかし、それは接続を拒否します:

docker exec -it archimedes2 sh 
/# telnet archimedes1 8761 
telnet: can't connect to remote host (127.0.0.1): Connection refused 

私はそれが動作する独自のコンテナに対してTelnetを実行する場合は、次の

C:\Users\jinga4x>docker exec -it archimedes2 sh 
/# telnet archimedes2 8762 

何が起こっていますここに?

UPDATE:私もこれをテストしている

コンテナで通常のJavaのWindows上のアプリケーションとarchimedes2としてarchimedes1始まります。

Archimedes1はが、archimedes2はそれがarchimedes1を接続しようとしたときに接続がを拒否し得るarchimedes2に連絡することができます。

UPDATE 2:

これは私のdocker network inspect bridge情報です:

[ 
    { 
     "Name": "bridge", 
     "Id": "546e7a5ef627c8d23e8ffdc05911fcae096167a359701fa4ee08ada0f7e1ae7f", 
     "Created": "2017-01-25T11:09:27.651777Z", 
     "Scope": "local", 
     "Driver": "bridge", 
     "EnableIPv6": false, 
     "IPAM": { 
      "Driver": "default", 
      "Options": null, 
      "Config": [ 
       { 
        "Subnet": "172.17.0.0/16", 
        "Gateway": "172.17.0.1" 
       } 
      ] 
     }, 
     "Internal": false, 
     "Attachable": false, 
     "Containers": { 
      "58634d0c4430895cf0dfbee294c3ea75ca38921441684d614a670421661eb628": { 
       "Name": "archimedes2", 
       "EndpointID": "b2f40396b4c0f8210ca667d93c7d787296f3dad2d0eb295c31d4f01bfe3b39e1", 
       "MacAddress": "02:42:ac:11:00:03", 
       "IPv4Address": "172.17.0.3/16", 
       "IPv6Address": "" 
      }, 
      "85f70520ad900e729944dc768f8c6951e9221650269b5669a2d0269506a4c16b": { 
       "Name": "archimedes1", 
       "EndpointID": "651bf095eed639ecc61a24ffdaf2130bddd338f38f42f47a6c54b460c3a979ab", 
       "MacAddress": "02:42:ac:11:00:02", 
       "IPv4Address": "172.17.0.2/16", 
       "IPv6Address": "" 
      } 
     }, 
     "Options": { 
      "com.docker.network.bridge.default_bridge": "true", 
      "com.docker.network.bridge.enable_icc": "true", 
      "com.docker.network.bridge.enable_ip_masquerade": "true", 
      "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", 
      "com.docker.network.bridge.name": "docker0", 
      "com.docker.network.driver.mtu": "1500" 
     }, 
     "Labels": {} 
    } 
] 

archimedes1コンテナifconfigコマンド:

eth0  Link encap:Ethernet HWaddr 02:42:AC:11:00:02 
      inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0 
      inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link 
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
      RX packets:133 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:105 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:0 
      RX bytes:13158 (12.8 KiB) TX bytes:345156 (337.0 KiB) 

lo  Link encap:Local Loopback 
      inet addr:127.0.0.1 Mask:255.0.0.0 
      inet6 addr: ::1/128 Scope:Host 
      UP LOOPBACK RUNNING MTU:65536 Metric:1 
      RX packets:64 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:64 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:1 
      RX bytes:3200 (3.1 KiB) TX bytes:3200 (3.1 KiB) 

archimedes1猫etc/hostsの:

127.0.0.1  localhost 
::1  localhost ip6-localhost ip6-loopback 
fe00::0 ip6-localnet 
ff00::0 ip6-mcastprefix 
ff02::1 ip6-allnodes 
ff02::2 ip6-allrouters 
127.0.0.1  archimedes1 
127.0.0.1  archimedes2 
172.17.0.2  a8045a473784 

UPDATE 3:

容器は、内部のプライベートIPアドレスではなく、公共の一方(127.0.0.1)を使用して相互にアクセスすることができます。

UPDATE 4:

私は、プロキシモニタリングarchimedes1開始:22233をし、それがarchimedes1するトラフィックです送信する:8761。 archimedes2はプロキシを通ってコミュニケートしようとしますが、トラフィックは到達しません。

答えて

0

正しいIPアドレスを取得するには、docker-machine ipを使用する必要があります。

は、Windows 10用のWindowsのための新しいドッカーについて、 docker psでコンテナIDを取得し、 docker inspect $CID$CID ==検査するコンテナID)の出力に IPAddressを探します。

背景:DockerはWindows上でコンテナを実行できません。 Dockerは純粋なLinuxソフトウェアです。動作するには、実行中のLinuxカーネルが必要です。 Docker for Windowsのユーザーが使用する回避策は、ネットワークカード、ハードディスクドライブ、CPUなどを含む、PC全体をシミュレートする仮想マシン(VirtualBox)をコンピュータにインストールすることです。新しいバージョンのソフトウェアは、類似したHyper-Vを使用します。

その仮想PCの中には、完全なLinuxとDockerがインストールされています。 Windowsツールはその仮想PCに接続して、内部で実行されているDockerと通信します。

実際には、アドレス127.0.0.1はコンテナから離れることはありません。「Dockerが動作している仮想PC」を意味するものではありません。すべてのコンピュータがアドレス127.0.0.1に応答するので、Pingはもちろん機能します。つまり、それは同じコンピュータであるとは限りません。

[EDIT]ファイル/etc/hostsが間違っになります

10.0.75.1  archimedes1 
10.0.75.1  archimedes2 

これら2つの異なるコンテナです。異なるIPアドレスを持つ必要があります。

あなたはdocker runにタイプミスがあると思います。 --add-host archimedes2:10.0.75.1--add-host archimedes2:10.0.75.2

+0

である必要があります。私は 'docker-machine ip'を実行していますが、エラー:マシン名が指定されておらず、デフォルトマシンが存在しません。私のマシンの名前はどのように知ることができますか? – codependent

+0

'docker-machine ls'を試して、すべてのマシンのリストを取得してください。しかし、エラーは変です。インストーラは 'default'マシンを作成します。 –

+0

Windows用ドッカーの設定 - >ネットワーク内部仮想スイッチ:10.0.75.0を参照してください。 127.0.0.1を使用する代わりに10.0.75.1を使用すると、アプリケーションはブラウザ経由でアクセスできますが、それでも通信はできません – codependent

関連する問題