Docker | Linking Containers #docker

# Docker | Linking Containers #docker
## <i class="fa  fa-cubes" style="font-size:1em;"></i> 概要
Docker の Containers のリンクについて。

## <i class="fa fa-refresh" style="font-size:1em;"></i> Network port mapping refresher
* 49153 to 65535 の間でランダムにポート割り当て

~~~bash
$ sudo docker run -d -P training/webapp python app.py
$ sudo docker ps -a
CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS                         PORTS                     NAMES
69ce337d84ee        training/webapp:latest       "python app.py"     17 seconds ago      Up 17 seconds                  0.0.0.0:49154->5000/tcp   evil_torvalds
$ curl http://localhost:49154
Hello world!
$ sudo docker port evil_torvalds 5000
0.0.0.0:49154
~~~

* 任意のポートを割り当て

~~~bash
$ sudo docker run -d -p 5000:5000 training/webapp python app.py
$ sudo docker ps -a
CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS                         PORTS                    NAMES
33c253754927        training/webapp:latest       "python app.py"     4 seconds ago       Up 3 seconds                   0.0.0.0:5000->5000/tcp   clever_carson
$ curl http://localhost:5000
Hello world!
$ sudo docker port clever_carson 5000
0.0.0.0:5000
~~~

## <i class="fa fa-cube" style="font-size:1em;"></i> Container naming
### Naming
Link のためには、 コンテナの name が必要になる。
すでにみてきたように、デフォルトでコンテナに一意の名前が自動的に付与される。
`--name` オプションを利用することで、自分で任意の名前を付けることも可能である。

~~~bash
$ sudo docker run -d -P --name hogehogehoge training/webapp python app.py
757338e884317b47f66350bcb5ba6335a7c6ddd2a1ae6be04ce5d471ac265703
$ sudo docker ps -a
CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS                   PORTS                     NAMES
757338e88431        training/webapp:latest       "python app.py"     2 seconds ago       Up 2 seconds             0.0.0.0:49156->5000/tcp   hogehogehoge
~~~

### docker inspect
`docker inspect` コマンドでコンテナの名前を確認できます。

~~~bash
$ sudo docker run -d -P --name hogehogehoge training/webapp python app.py
757338e884317b47f66350bcb5ba6335a7c6ddd2a1ae6be04ce5d471ac265703
$ sudo docker inspect -f "{{ .Name }}" 757338e884317b47f66350bcb5ba6335a7c6ddd2a1ae6be04ce5d471ac265703
/hogehogehoge
$ sudo docker run -d -P training/webapp python app.py
c022b25a6f471412132bb56ad16f56e885d5e537c186a961e66bec75931ed0bc
$ sudo docker inspect -f "{{ .Name }}" c022b25a6f471412132bb56ad16f56e885d5e537c186a961e66bec75931ed0bc
/naughty_wilson
~~~

## <i class="fa fa-external-link-square" style="font-size:1em;"></i> Container Linking
送り手のコンテナの起動時に、 `--link` オプションを利用して受け手のコンテナの名前を指定することで、
コンテナをリンクすることができます。

~~~bash
# DB コンテナを起動
$ sudo docker run -d --name db training/postgres
# WEB コンテナを起動 (db:db は link先の名前:Alias)
$ sudo docker run -d -P --name web --link db:db training/webapp python app.py
# inspect でリンク設定を確認
$ sudo docker inspect -f "{{ .HostConfig.Links }}" web
[/db:/web/db]
~~~

Docker は送り手に対して二つの接続方法を用意しています。
以下に続く

* Environment Variables
* `/etc/hosts`

です。

## <i class="fa fa-cube" style="font-size:1em;"></i> Environment Variables

Docker は `--link` オプション使用時に自動的に 環境変数を追加します。

~~~bash
$ sudo docker run --rm --name web2 --link db:db training/webapp env
:
DB_PORT=tcp://db_sever_ip:5432
DB_PORT_5432_TCP=tcp://db_sever_ip:5432
DB_PORT_5432_TCP_ADDR=db_sever_ip
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/web2/db
DB_ENV_PG_VERSION=9.3
:
~~~

## <i class="fa fa-refresh" style="font-size:1em;"></i> Updating the `/etc/hosts` file

Docker は `--link` オプション使用時に自動的に `/etc/hosts` を更新します。

~~~bash
$ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash
root@5a3f442ff902:/opt/webapp# cat /etc/hosts
: # 略
db_sever_ip      db
~~~

## <i class="fa fa-arrow-circle-right" style="font-size:1em;"></i> 参照
<i class="fa fa-external-link" style="font-size:1.5em;"></i> [Docker Official | Linking Containers Together](https://docs.docker.com/userguide/dockerlinks/)