--icc オプションに false を指定して Docker を立ち上げた場合に、コンテナ間の通信を許可するためには docker run の実行時に --link オプションを指定する必要があります
この状態で、コンテナ間の通信の設定をおこない、実際に通信できるかを確認してみました
icc (inter-container communication) の無効化
--icc オプションはデフォルトで true が設定されています
--icc=false を指定するために、/etc/default/docker に下記を追記して docker を再起動します
DOCKER_OPTS="--icc=false ${DOCKER_OPTS}"
コンテナの作成
2 つのコンテナに Apache をインストールして、他のコンテナから HTTP リクエストを送ってみます
まずは、Apache をインストールしたコンテナをコミットしておきます
$ docker run -d ubuntu:13.10 /bin/sh -c 'apt-get -y update && apt-get -y install apache2 && a2enmod ssl && a2ensite default-ssl'
d0f34aef58df5c166b23cf69974d72d97e981a92cfc448ef527023fb24ee3ed0
$ docker commit d0f34aef58df5c166b23cf69974d72d97e981a92cfc448ef527023fb24ee3ed0 hexa/base
676c043b591d158ad003a1b0265b214c4f0f4035944225cfaa9d72b6ed9b1580
Apache 用コンテナ
コンテナを 2 つ作成して Apache を立ち上げます
また、別コンテナからの HTTP リクエストの受信を確認するために tail -f access.log を実行しておきます
foo1 コンテナ
$ docker run -d -t --name foo1 -p 0.0.0.0:50080:80 -p 0.0.0.0:50443:443 hexa/base /bin/sh -c '/etc/init.d/apache2 start && tail -f /var/log/apache2/access.log'
f13e17260f7fce4633183a0436b4eca8f4021a6383e6615ce7f34f44e42ee359
$ docker attach foo1
foo2 コンテナ
$ docker run -d -t --name foo2 -p 0.0.0.0:60080:80 -p 0.0.0.0:60443:443 hexa/base /bin/sh -c '/etc/init.d/apache2 start && tail -f /var/log/apache2/access.log'
a5273956c024a81253ca9de917a2ffbda4ad9e0d7e08cbc2861369fcd0e252ca
$ docker attach foo2
起動中のコンテナの確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a5273956c024 hexa/base:latest /bin/sh -c /etc/init 19 seconds ago Up 18 seconds 0.0.0.0:60443->443/tcp, 0.0.0.0:60080->80/tcp foo2
f13e17260f7f hexa/base:latest /bin/sh -c /etc/init 44 seconds ago Up 43 seconds 0.0.0.0:50443->443/tcp, 0.0.0.0:50080->80/tcp foo1
リクエスト送信用コンテナ
docker run の --link オプションに、リンクさせるコンテナの名前を指定します
--link オプションは name:alias で指定します
今回は name に事前に立ちあげておいた foo1 と foo2 を指定します
$ docker run -i -t --name bar --link foo1:apache1 --link foo2:apache2 ubuntu:13.10 /bin/bash
立ち上げたコンテナの環境変数を確認します
root@11027ab6adfa:/# env | grep APACHE
APACHE2_PORT_443_TCP=tcp://172.17.0.3:443
APACHE2_PORT_80_TCP_PORT=80
APACHE1_PORT_443_TCP=tcp://172.17.0.2:443
APACHE1_PORT=tcp://172.17.0.2:80
APACHE2_PORT_443_TCP_PORT=443
APACHE2_PORT_80_TCP_PROTO=tcp
APACHE2_PORT_443_TCP_PROTO=tcp
APACHE1_PORT_80_TCP_PORT=80
APACHE1_PORT_80_TCP_PROTO=tcp
APACHE2_NAME=/bar/apache2
APACHE2_PORT=tcp://172.17.0.3:80
APACHE1_PORT_443_TCP_PROTO=tcp
APACHE1_NAME=/bar/apache1
APACHE2_PORT_80_TCP=tcp://172.17.0.3:80
APACHE1_PORT_443_TCP_ADDR=172.17.0.2
APACHE1_PORT_80_TCP_ADDR=172.17.0.2
APACHE1_PORT_443_TCP_PORT=443
APACHE1_PORT_80_TCP=tcp://172.17.0.2:80
APACHE2_PORT_80_TCP_ADDR=172.17.0.3
APACHE2_PORT_443_TCP_ADDR=172.17.0.3
foo1 コンテナと foo2 コンテナの IP アドレスと、docker run -p で指定した公開しているポート番号が設定されています
iptables
確認のために iptables も見ておきます
$ sudo iptables -L -v
Chain INPUT (policy ACCEPT 13 packets, 808 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- docker0 docker0 172.17.0.3 172.17.0.4 tcp spt:http
0 0 ACCEPT tcp -- docker0 docker0 172.17.0.4 172.17.0.3 tcp dpt:http
0 0 ACCEPT tcp -- docker0 docker0 172.17.0.3 172.17.0.4 tcp spt:https
0 0 ACCEPT tcp -- docker0 docker0 172.17.0.4 172.17.0.3 tcp dpt:https
0 0 ACCEPT tcp -- docker0 docker0 172.17.0.2 172.17.0.4 tcp spt:http
0 0 ACCEPT tcp -- docker0 docker0 172.17.0.4 172.17.0.2 tcp dpt:http
0 0 ACCEPT tcp -- docker0 docker0 172.17.0.2 172.17.0.4 tcp spt:https
0 0 ACCEPT tcp -- docker0 docker0 172.17.0.4 172.17.0.2 tcp dpt:https
0 0 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.2 tcp dpt:http
0 0 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.2 tcp dpt:https
0 0 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.3 tcp dpt:http
0 0 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.3 tcp dpt:https
11 732 DROP all -- docker0 docker0 anywhere anywhere
0 0 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.3 tcp dpt:http
0 0 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.3 tcp dpt:https
12 1582 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.2 tcp dpt:http
0 0 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.2 tcp dpt:https
40466 88M ACCEPT all -- any docker0 anywhere anywhere ctstate RELATED,ESTABLISHED
21506 990K ACCEPT all -- docker0 !docker0 anywhere anywhere
Chain OUTPUT (policy ACCEPT 7 packets, 712 bytes)
pkts bytes target prot opt in out source destination
foo1 コンテナ, foo2 コンテナにリクエストを送る
curl をインストールして、リクエストを送ります
# apt-get -y update && apt-get -y install curl
# curl -i -X GET http://$APACHE1_PORT_80_TCP_ADDR:$APACHE1_PORT_80_TCP_PORT/
# curl -i -X GET --insecure https://$APACHE1_PORT_443_TCP_ADDR:$APACHE1_PORT_443_TCP_PORT/
# curl -i -X GET http://$APACHE2_PORT_80_TCP_ADDR:$APACHE2_PORT_80_TCP_PORT/
# curl -i -X GET --insecure https://$APACHE2_PORT_443_TCP_ADDR:$APACHE2_PORT_443_TCP_PORT/
foo1 コンテナへのリクエスト
root@11027ab6adfa:/# curl -i -X GET http://$APACHE1_PORT_80_TCP_ADDR:$APACHE1_PORT_80_TCP_PORT/
HTTP/1.1 200 OK
Date: Sun, 06 Apr 2014 10:47:30 GMT
Server: Apache/2.4.6 (Ubuntu)
Last-Modified: Sun, 06 Apr 2014 10:41:33 GMT
ETag: "b1-4f65d64f4d140"
Accept-Ranges: bytes
Content-Length: 177
Vary: Accept-Encoding
Content-Type: text/html
<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>
root@11027ab6adfa:/# curl -i -X GET --insecure https://$APACHE1_PORT_443_TCP_ADDR:$APACHE1_PORT_443_TCP_PORT/
HTTP/1.1 200 OK
Date: Sun, 06 Apr 2014 10:47:33 GMT
Server: Apache/2.4.6 (Ubuntu)
Last-Modified: Sun, 06 Apr 2014 10:41:33 GMT
ETag: "b1-4f65d64f4d140"
Accept-Ranges: bytes
Content-Length: 177
Vary: Accept-Encoding
Content-Type: text/html
<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>
foo2 コンテナへのリクエスト
root@11027ab6adfa:/# curl -i -X GET http://$APACHE2_PORT_80_TCP_ADDR:$APACHE2_PORT_80_TCP_PORT/
HTTP/1.1 200 OK
Date: Sun, 06 Apr 2014 10:50:13 GMT
Server: Apache/2.4.6 (Ubuntu)
Last-Modified: Sun, 06 Apr 2014 10:41:33 GMT
ETag: "b1-4f65d64f4d140"
Accept-Ranges: bytes
Content-Length: 177
Vary: Accept-Encoding
Content-Type: text/html
<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>
root@11027ab6adfa:/# curl -i -X GET --insecure https://$APACHE2_PORT_443_TCP_ADDR:$APACHE2_PORT_443_TCP_PORT/
HTTP/1.1 200 OK
Date: Sun, 06 Apr 2014 10:50:21 GMT
Server: Apache/2.4.6 (Ubuntu)
Last-Modified: Sun, 06 Apr 2014 10:41:33 GMT
ETag: "b1-4f65d64f4d140"
Accept-Ranges: bytes
Content-Length: 177
Vary: Accept-Encoding
Content-Type: text/html
<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>
ログの確認
foo1 コンテナ の /var/log/apach2/access.log
$ docker attach foo1
172.17.0.4 - - [06/Apr/2014:10:47:30 +0000] "GET / HTTP/1.1" 200 427 "-" "curl/7.32.0"
172.17.0.4 - - [06/Apr/2014:10:47:33 +0000] "GET / HTTP/1.1" 200 1762 "-" "curl/7.32.0"
foo2 コンテナ の /var/log/apach2/access.log
$ docker attach foo2
172.17.0.4 - - [06/Apr/2014:10:50:13 +0000] "GET / HTTP/1.1" 200 427 "-" "curl/7.32.0"
172.17.0.4 - - [06/Apr/2014:10:50:21 +0000] "GET / HTTP/1.1" 200 1762 "-" "curl/7.32.0"