このドキュメントで説明されているソフトウェアはサポートされていないか、拡張サポートが提供されています。
現在サポートされているリリースにアップグレードすることをお薦めします。
docker runで--linkオプションを使用すると、サーバー・コンテナに関するネットワーク接続情報をクライアント・コンテナで使用できます。 クライアント・コンテナはプライベート・ネットワーク・インタフェースを使用して、サーバー・コンテナの公開ポートにアクセスします。 Dockerは、利用可能なインタフェースとポートを示したサーバー・コンテナに関する環境変数をクライアント・コンテナに設定します。
次の例は、oraclelinux:6
ベースのクライアント・コンテナを、4.4項DockerfileからのDockerイメージの作成で作成したmymod/httpd:v2
イメージをベースとするHTTPサーバー・コンテナにリンクする方法を示しています。
HTTPサーバー・コンテナとクライアント・コンテナのリンクを作成する手順:
http_server
というHTTPサーバー・コンテナを作成します。[root@host ~]#
docker run -d --name http_server mymod/httpd:v2
a47169154222329eed66762128755cd9fdd24d0f27ff8e0f678ef136bbc66d03bashシェルを実行して
http_server
コンテナにリンクされるclient1
という名前のクライアント・コンテナを作成します。[root@host httpd]#
docker run --rm -t -i --name client1 --link http_server:server
\oraclelinux:6 /bin/bash
[root@client1 ~]#--linkオプションの引数http_server:serverは、名前
http_server
にserver
という別名を付けます。 Dockerは別名を大文字(SERVER
)に変換し、クライアント上で環境変数の名前を設定する際に、この文字列を使用します。
これで、環境変数をclient1
コンテナで表示できます。 pingを使用して、名前またはIPアドレスでサーバー・コンテナを検出し、curlを使用して、サーバー上で実行されているWebサーバーにアクセスすることも可能です。
[root@client1 ~]#env
HOSTNAME=10815c22e5b4 TERM=xterm SERVER_PORT=tcp://172.17.0.16:80 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PWD=/ SERVER_PORT_80_TCP_PORT=80 SERVER_PORT_80_TCP_ADDR=172.17.0.16 SERVER_PORT_80_TCP=tcp://172.17.0.16:80 SERVER_PORT_80_TCP_PROTO=tcp SHLVL=1 SERVER_NAME=/client1/server HOME=/ _=/usr/bin/env [root@client1 ~]#ping -c 1 server
PING server (172.17.0.16) 56(84) bytes of data. 64 bytes from server (172.17.0.16): icmp_seq=1 ttl=64 time=0.105 ms --- server ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.105/0.105/0.105/0.000 ms [root@client1 ~]#ping -c 1 172.17.0.16
PING 172.17.0.16 (172.17.0.16) 56(84) bytes of data. 64 bytes from 172.17.0.16: icmp_seq=1 ttl=64 time=0.171 ms --- 172.17.0.16 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.171/0.171/0.171/0.000 ms [root@client1 ~]#curl http://server
HTTP server running on guest [root@client1 ~]#curl http://172.17.0.16
HTTP server running on guest
クライアント・コンテナの複数のインスタンスを別々の名前で起動でき、各インスタンスはサーバー・コンテナのポート80にアクセスできます。 Dockerはクライアントごとに異なるIPアドレスを割り当てます。 次の出力例で示したように、Dockerは各クライアント上の/etc/hosts
ファイル内にサーバーのエントリを作成しますが、クライアント・コンテナ自身の名前のエントリは作成しません。
[root@client1 ~]#cat /etc/hosts
172.17.0.17 10815c22e5b4 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 172.17.0.16 server [root@client1 ~]#ping -c 1 client2
ping: unknown host client2 [root@client1 ~]#ping -c 1 172.17.0.18
PING 172.17.0.18 (172.17.0.18) 56(84) bytes of data. 64 bytes from 172.17.0.18: icmp_seq=1 ttl=64 time=0.268 ms --- 172.17.0.18 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.268/0.268/0.268/0.000 ms
デフォルトで、クライアントはIPアドレスのみがプライベート・ネットワーク上で相互に表示されます。
docker psコマンドでは、実行中のコンテナが表示されます。
[root@host ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
449abeac3041 oraclelinux:6 /bin/bash ... Up 1 minutes client2
10815c22e5b4 oraclelinux:6 /bin/bash ... Up 2 minutes client1
a47169154222 mymod/httpd:v2 /usr/sbin/httpd ... Up 3 minutes 80/tcp
client1/server,client2/server,http_server
NAMES
列では、http_server
がclient1
およびclient2
にserver
としてリンクしていることがわかります。 PORTS
列では、Dockerがhttp_server
のTCPポート80をホストの別のポートに再マップしていないことがわかります。