Docker コンテナ間の通信

--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"
```


## 参考
- [Configure Networking - Docker Documentation](http://docs.docker.io/en/latest/use/networking/#container-intercommunication)
- [Link Containers - Docker Documentation](http://docs.docker.io/en/latest/use/working_with_links_names/)