このドキュメントで説明されているソフトウェアはサポートされていないか、拡張サポートが提供されています。
現在サポートされているリリースにアップグレードすることをお薦めします。

4.6 Dockerコンテナ間の通信

docker run--linkオプションを使用すると、サーバー・コンテナに関するネットワーク接続情報をクライアント・コンテナで使用できます。 クライアント・コンテナはプライベート・ネットワーク・インタフェースを使用して、サーバー・コンテナの公開ポートにアクセスします。 Dockerは、利用可能なインタフェースとポートを示したサーバー・コンテナに関する環境変数をクライアント・コンテナに設定します。

次の例は、oraclelinux:6ベースのクライアント・コンテナを、4.4項DockerfileからのDockerイメージの作成で作成したmymod/httpd:v2イメージをベースとするHTTPサーバー・コンテナにリンクする方法を示しています。

HTTPサーバー・コンテナとクライアント・コンテナのリンクを作成する手順:

  1. http_serverというHTTPサーバー・コンテナを作成します。

    [root@host ~]# docker run -d --name http_server mymod/httpd:v2 
    a47169154222329eed66762128755cd9fdd24d0f27ff8e0f678ef136bbc66d03
  2. bashシェルを実行して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_serverserverという別名を付けます。 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_serverclient1およびclient2serverとしてリンクしていることがわかります。 PORTS列では、Dockerがhttp_serverのTCPポート80をホストの別のポートに再マップしていないことがわかります。