Docker networkを軽く試した



## 何ができるの？

コンテナを接続できる仮想のネットワークを作成できます。
Dockerのインストールを行うとホストとなるコンピュータのネットワークカードとの間にブリッジが作成されます。Docker
 Networkは利用者が最初に作成されるブリッジとは別に、コンテナ間をつなぐブリッジや、福栖のホストを跨るオーバーレイのネットワークを構築することが容易になります。

## 試すシナリオ

今回は標準的に作成されるネットワーク以外に新規に別のネットワークを１つ作成し、そこへコンテナを１つ接続することを試します。これにより、外部に接続していないホストコンピュータ内に閉じたネットワークを作成することができるます。

発展させると、Nginxを２つ連携させリバースプロキシとWebサーバという構成を作るときの設定ファイルテストするなどに使えると思います。

## 準備

まずは環境の準備です。以下の作業を実施しました。

- Ubuntu15.10の入ったマシンを起動＆システムの更新
- Docker Engine1.9のインストール
    - http://docs.docker.com/engine/installation/ubuntulinux/
    - Ubuntu15.10は「Wily」という名前です

DockerのインストールはUbuntuのリポジトリを使わず、上記ドキュメントの手順を実行します。UbuntuリポジトリのDocker.ioには最新版がないためです。作業手順は書かれてる内容を上から順に行うだけなので、ここでは割愛します。上記URL先のドキュメントを参照してください。

## 作業内容

まず、ネットワークの作成です。

```bash
$ sudo docker network create frontend
e4edbbf4d7c4e63d3e4c453cb6b1f6069d644181e716a62a8d034f4b43e88e00
```

ネットワークの一覧を見てみます。

```bash
$ sudo docker network ls
NETWORK ID          NAME                DRIVER
03914132f51a        none                null
b39cf0f9941f        host                host
8d1c0bf46536        bridge              bridge
e4edbbf4d7c4        frontend            bridge
```

frontendが加わっていることがわかります。

作成されたネットワークの詳細を確認します。

```bash
$ sudo docker network inspect frontend
[
    {
        "Name": "frontend",
        "Id": "e4edbbf4d7c4e63d3e4c453cb6b1f6069d644181e716a62a8d034f4b43e88e00",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {}
            ]
        },
        "Containers": {},
        "Options": {}
    }
]
```

Scopeを見るとlocalとなっており、Driverはbridgeとなってます。


次に、１つコンテナを作成し、このネットワークへ接続させます。

```bash
$ sudo docker run -itd --net=frontend  --name web nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
d0ca40da9e35: Pull complete
d1f66aef36c9: Pull complete
192997133528: Pull complete
c4b09a941684: Pull complete
4174aa7c7be8: Pull complete
0620b22b5443: Pull complete
87c3b9f58480: Pull complete
7d984375a5e7: Pull complete
e491c4f10eb2: Pull complete
edeba58b4ca7: Pull complete
a96311efcda8: Pull complete
914c82c5a678: Pull complete
Digest: sha256:b24651e86659a5d1e4103f8c1ea49567335528281c1678697783ae7569114e1e
Status: Downloaded newer image for nginx:latest
4a1b10ae09a9fb1024a0ffedd248db4880e8eccdce09de19cbe01ab584a4b73e
```

今回はNginxの最新版が入っているコンテナを使いました。無事起動したようです。


このコンテナに割り振られたIPアドレスを調べてみます。先ほど使ったinspectを実行してみます。

```bash
$ sudo docker network inspect frontend
[
    {
        "Name": "frontend",
        "Id": "e4edbbf4d7c4e63d3e4c453cb6b1f6069d644181e716a62a8d034f4b43e88e00",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {}
            ]
        },
        "Containers": {
            "4a1b10ae09a9fb1024a0ffedd248db4880e8eccdce09de19cbe01ab584a4b73e": {
                "EndpointID": "a81e13e57cd9aecd9fd978e0a59051fa50b7b7dc864025c5a1bac7fc0325ca65",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {}
    }
]
```

ネットワーク作成直後と異なり、Containersを見ると **4aib10** で始まる記述があります。その配下を見るとIPv4に **172.18.0.2**という記述が確認できます。


先ほど作成されたコンテナを確認します。

```bash
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
4a1b10ae09a9        nginx               "nginx -g 'daemon off"   5 minutes ago       Up 5 minutes        80/tcp, 443/tcp     web
```

コンテナIDを見てみると、ネットワークにて表示されていたのと同じIDであることが分かります。つまり、このコンテナにアクセスするには、ローカルから **172.18.0.2** に通信してみればよいことがわかりました。

では、やってみます。

```bash
$ curl http://172.18.0.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
```


cURLでアクセスしてみると、Nginxのデフォルト画面を表示するためのHTMLが返ってきました。



## まとめ

非常に簡単にネットワークを作成できることがわかりました。ちょっとした構成を組みたいとき、これまではLink機能を使ってきましたが、クラウド上のVMを連携させるような作業を手元や一時環境でやってみたいときには少し使いにくかった点がNetworkを使うと解消できそうですね。いやはや、便利ですわ。


## 参照先

network機能の公式ドキュメント
http://docs.docker.com/engine/userguide/networking/work-with-networks/

network機能のプレスリリース（翻訳版 from [muddydixon](http://qiita.com/muddydixon) ）
http://qiita.com/muddydixon/items/d256f63eaf47681bea95

## 追加

もっと詳しく書かれたエントリーが出てきたので、そちらがおすすめです！
http://qiita.com/muddydixon/items/e69279d332f77fc00c3e