Dockerコンテナのネットワーク設定
コンテナのネットワークについては、3つのオプションbridge,host,noneが用意されています。
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
17e324f45964 bridge bridge local
6ed54d316334 host host local
7092879f2cc8 none null local
bridgeモード
コンテナ稼働時にはデフォルトでbridgeモードが選択されます。bridgeモードではコンテナ専用のネットワークが割り当てられ、ホストマシンのネットワークとは隔離されます。“docker network inspect bridge” や “ifconfig” コマンドで割り当てられたIPアドレスなどの確認ができます。
$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "c0c58b4d39d158XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"Created": "2019-07-29T16:45:03.528703512+09:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
$ ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:53ff:fe85:7593 prefixlen 64 scopeid 0x20<link>
ether 02:42:53:85:75:93 txqueuelen 0 (イーサネット)
RX packets 1 bytes 28 (28.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 229 bytes 38983 (38.9 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ユーザ定義のbridgeネットワークを作成することも出来ます。コンテナイメージ毎にbridgeネットワークを定義して、コンテナ稼働時にこのネットワークを指定する使用方法が推奨されているようです。
例)以下alpine-netという名称のbridgeネットワークを定義します。
$ docker network create --driver bridge alpine-net
Dockerネットワークリストにより、bridgeモードにalpine-netが追加されていることが確認できます。
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
e9261a8c9a19 alpine-net bridge local
17e324f45964 bridge bridge local
6ed54d316334 host host local
7092879f2cc8 none null local
$ docker network inspect alpine-net
[
{
"Name": "alpine-net",
"Id": "e9261a8c9a19eabf2bf1488bf5f208b99b1608f330cff585c273d39481c9b0ec",
"Created": "2017-09-25T21:38:12.620046142Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
alpineコンテナイメージをネットワーク指定して以下4種類のコンテナを稼働します。
$ docker run -dit --name alpine1 --network alpine-net alpine ash
$ docker run -dit --name alpine2 --network alpine-net alpine ash
$ docker run -dit --name alpine3 alpine ash
$ docker run -dit --name alpine4 --network alpine-net alpine ash
$ docker network connect bridge alpine4
各コンテナに割り当てられるIPアドレス、異なるbridgeネットワーク間通信については、上記リンク先ドキュメントを参照願います。
hostモード
ホストマシンのネットワーク環境をコンテナに適用します。
例)nginxウェブサーバをホストマシンネットワークで稼働させます。(–rmオプション:コンテナ停止時にコンテナを削除。–dオプション:バックグラウンド動作)
$ docker run --rm -d --network host --name my_nginx nginx