Docker公式ドキュメント"network コマンドを使う"を読む
dockerDocker 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で指定するとき