Dockerのリンク機能をつかってコンテナ間通信をしてみよう

**---2017.03.04追記---**
docker runの --link機能はもうオワコンなので、本記事はもう役目を終えたようです。
**---追記こまで---**



例としてMongoDBをとりあげます。

MongoDBサーバコンテナとMongoDBクライアントコンテナを立ち上げて、クライアントからデーモンに接続してみましょう。

## 準備
dockerをインストールして、mongodbイメージを取得します。

```
docker pull mongo
```

このイメージにはデーモン用プログラム(/usr/bin/mongod)とクライアントプログラム(/usr/bin/mongo)が両方入っているのでそれを確認します。

Mongoクライアント

```
[vagrant@localhost ~]$ docker run -it mongo  /usr/bin/mongo --version
MongoDB shell version: 3.0.0
```

Mongoサーバ

```
[vagrant@localhost ~]$ docker run -it mongo  /usr/bin/mongod --version
db version v3.0.0
git version: a841fd6394365954886924a35076691b4d149168
OpenSSL version: OpenSSL 1.0.1e 11 Feb 2013
```

## MongoDBサーバコンテナを起動する

`mongoserver`というコンテナ名でMongoサーバを起動します。

```
$ docker run -d  --name mongoserver mongo
```

## MongoDBクライアントコンテナを起動する

`mongoc`というコンテナ名でMongoクライアントを起動します。
このとき、`--link`オプションを使って通信相手先(Mongoサーバ)のホスト名を注入します。

```
$ docker run -it --link mongoserver:mongoserver mongo bash
root@f986fdc303bb:/#
```

mongocコンテナ内の/etc/hostsを見てみましょう。

```
root@f986fdc303bb:/# cat /etc/hosts
172.17.0.45     f986fdc303bb
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.44     mongoserver
```

`172.17.0.41     mongoserver`という行が出現しています。
これが、--link機能が用意してくれたホスト名です。

mongoserverにpingを飛ばしてみましょう。

```
root@f986fdc303bb:/# ping mongoserver
PING mongoserver (172.17.0.44): 48 data bytes
56 bytes from 172.17.0.44: icmp_seq=0 ttl=64 time=0.097 ms
56 bytes from 172.17.0.44: icmp_seq=1 ttl=64 time=0.090 ms
56 bytes from 172.17.0.44: icmp_seq=2 ttl=64 time=0.213 ms
```

pingが通りました！

環境変数も見てみましょう。

```
root@f986fdc303bb:/# env
MONGOSERVER_ENV_MONGO_VERSION=3.0.0
HOSTNAME=f986fdc303bb
MONGO_VERSION=3.0.0
TERM=xterm
MONGOSERVER_PORT_27017_TCP=tcp://172.17.0.44:27017
MONGOSERVER_PORT=tcp://172.17.0.44:27017
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
MONGOSERVER_ENV_MONGO_MAJOR=3.0
MONGOSERVER_NAME=/nostalgic_bell/mongoserver
HOME=/root
SHLVL=1
MONGO_MAJOR=3.0
MONGOSERVER_PORT_27017_TCP_PORT=27017
MONGOSERVER_PORT_27017_TCP_PROTO=tcp
MONGOSERVER_PORT_27017_TCP_ADDR=172.17.0.44
_=/usr/bin/env
```

`MONGOSERVER_`ではじまる環境変数がいくつかセットされています。

さて、MongoクライアントからMongoサーバにMongoプロトコルで接続してみましょう。

```
root@f986fdc303bb:/# mongo --host mongoserver
MongoDB shell version: 3.0.0
connecting to: mongoserver:27017/test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
        http://docs.mongodb.org/
Questions? Try the support group
        http://groups.google.com/group/mongodb-user
Server has startup warnings:
2015-03-20T02:15:15.071+0000 I CONTROL  [initandlisten]
2015-03-20T02:15:15.071+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2015-03-20T02:15:15.071+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2015-03-20T02:15:15.071+0000 I CONTROL  [initandlisten]
```

接続できました！

このあと、コレクションにドキュメントを保存して、それがサーバコンテナにちゃんと保存されているか確認したら、ちゃんとできていました。

## 参考
* http://deeeet.com/writing/2014/12/01/docker-link-pattern/
* http://docs.docker.com/userguide/dockerlinks/
* https://registry.hub.docker.com/_/mongo/