Docker Toolbox for Windows の古いバージョンを使用していたので、それをアンインストールし、最新の安定した Docker for Windows をインストールしました。
独自のコンテナーで実行されている 2 つの Java アプリケーションがあります。
- アプリケーション1: http://archimedes1:8761
- アプリケーション 2: http://archimedes2:8762
両方のアプリで使用されるDockerfile :
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" ]
Windows の/etc/hostsを変更して archimedes1\2 を 127.0.0.1 にマップするようにしました (以前の Docker Toolbox では 192.168.99.100 にマップされていました)。
127.0.0.1 archimedes1
127.0.0.1 archimedes2
これは、コンテナを起動する方法です ( --add-host を使用してコンテナにホスト名を認識させることに注意してください):
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
これは Docker Toolboxで機能しましたが、Docker for Windows コンテナーをインストールしたため、コンテナー同士で接続すると、接続拒否エラーが表示されます。この場合、archimedes2 は archimedes1 を呼び出そうとします。
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)
コンテナへの sh を開始し、archimedes2 のコンテナから archimedes1 に ping を実行すると、応答が返されます。
-> 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
ただし、telnetを実行すると、接続が拒否されます。
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
何が起きてる?
アップデート:
これもテストしました: Windows で archimedes1 を通常の Java アプリケーションとして起動し、コンテナーで archimedes2 を起動します。
Archimedes1はarchimedes2に接続できますが、archimedes2はarchimedes1 に接続しようとすると接続が拒否されます。
更新 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 猫など/ホスト:
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
更新 3:
コンテナーは、内部プライベート IP を使用して相互にアクセスできますが、パブリック IP (127.0.0.1) を使用することはできません。
更新 4:
archimedes1:22233 を監視するプロキシを開始し、そのトラフィックを archimedes1:8761 に送信しました。archimedes2 はプロキシ経由で通信しようとしますが、トラフィックが到達しません。