Docker公式ドキュメント"network コマンドを使う"を読む

(2016-07-15)

Docker version 1.12.0-rc2

公式ドキュメントnetwork コマンドを使う の内容をまとめてみた。

dockerには3つのデフォルトネットワークが存在する。docker run時に--netオプションでネットワークを指定しない限り、 docker0として表示されるbridgeネットワークにコンテナを接続する。

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
a3b712537566        bridge              bridge              local               
f6d86cb54edd        host                host                local               
33cb30b024d9        none                null                local            

ただし、後方互換性を維持するため、デフォルトのbridgeネットワークでは自動的に名前解決が行われない。

これらのネットワークとは別にユーザー定義のネットワークを作成することもできる。 単一ホストのbridgeネットワークと、複数ホストにまたがるoverlayネットワークから選択でき、 何も指定しなかったらbridgeになる。subnetを指定しなければ、 dockerデーモンがネットワークに対してサブネットを自動的に割り当てるが、 dockerが管理していないサブネットと重複するのを避けるために指定することが推奨されている。

$ docker network create -d bridge --subnet 172.25.0.0/16 isolated_nw
$ docker network inspect isolated_nw
$ docker network rm isolated_nw  # 削除

docker network inspectで以下のようなネットワークの情報が得られる。

[
    {
        "Name": "isolated_nw",
        "Id": "c81547cf7ed897054ea645192c6c47dcf7a248e77bc8067609becab5330e417d",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.25.0.0/16"
                }
            ]
        },
        "Internal": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

起動時に--netオプションでネットワークに接続したり、 既に存在するコンテナをdocker network connectで接続することができる。

$ docker run --net=isolated_nw -itd --name=container1 --link container2:c2 busybox
$ docker network connect isolated_nw container1
$ docker network disconnect isolated_nw container1 # 切断

上のrunによって同一ネットワークからこのコンテナへ、ping container1が届くようになり、 このコンテナから同一ネットワークのconteiner2にc2というエイリアスが付くため、ping c2が届くようになる。

$ docker attach container1
# ping c2
PING c2 (172.25.0.2): 56 data bytes
64 bytes from 172.25.0.2: seq=0 ttl=64 time=0.094 ms
...
CTRL-p CTRL-q

この設定時点でcontainer2が存在しなかったとしてもエラーにならない。 また、この--linkによるエイリアスは所属するネットワーク全体に適用される。

他にrunで指定しているオプションは以下の通り。 どれも良く使うもの。

-i コンテナの STDIN にアタッチ
-t 疑似ターミナル (pseudo-TTY) を割り当てる
-d コンテナをバックグラウンドで実行し、コンテナIDを表示

--linkは、コンテナ内におけるプライベートな名前解決のために、他のコンテナのnameに対してエイリアスを付けるものだったが、 これとは別に同一ネットワークの他のコンテナからの名前解決のために使われる、ネットワーク範囲のエイリアスを--net-aliasで付けることができる。 このエイリアスは同一ネットワークの複数のコンテナで同じものに設定でき、有効ないずれかのコンテナに名前解決される。 つまり、コンテナが停止するかネットワークから切断されると、同じネットワーク範囲のエイリアスを持った別のコンテナに名前解決されることになる。

$ docker run --net=isolated_nw -itd --name=container3 --net-alias app busybox
$ docker run --net=isolated_nw -itd --name=container4 --net-alias app busybox
$ docker network connect --alias app isolated_nw container5 # connectで指定するとき