🐳
Docker ネットワークについて
はじめに
以前、 CentOS のコンテナを構築した際、 IPv6 が有効になっていないため Postfix が起動しないということが起きました。
このとき Docker ネットワークについて調査したことを以下に纏めます。
Docker ネットワーク
以下のページを参照しました。
Docker ネットワークを確認します。
$ sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
82833672a6da bridge bridge local
44e9d1eb41dd host host local
eb945576b1a2 none null local
このうち bridge
という名称のネットワークがデフォルトで使用されるネットワークになっています。
console
$ ip addr
(snip)
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:ab:34:6b:f2 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:abff:fe34:6bf2/64 scope link
valid_lft forever preferred_lft forever
(snip)
ip addr
コマンドなどで確認できる docker0
という名称のネットワークが該当するとのこと。
bridge
ネットワークの詳細を確認します。
$ sudo docker network inspect bridge
[
{
"Name": "bridge",
"Id": "82833672a6daf60dcbcc08d705fc6f29aa167798d83812529dfbe432aee20573",
"Created": "2021-04-30T15:48:43.127612576+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": {}
}
]
この情報からは以下のことが分かります。
- IPv6 が無効化されていること
- サブネットは
172.17.0.0/16
であること - ゲートウェイは
172.17.0.1
であること - 名称が
docker0
であること
docker0
では IPv6 が無効化されているため、 Postfix が起動しなかったようです。
(Postfix のデフォルト設定では IPv6 が有効になっていることが前提になっている)
docker0
で IPv6 を有効化するのもアリなのですが、デフォルトネットワークの設定は変更したくなかったので、新規にネットワークを作成しました。
$ sudo docker network create\
--subnet 10.0.0.0/24\
--gateway 10.0.0.1\
--ipv6\
--subnet fc00::/7\
-o 'com.docker.network.bridge.enable_icc'='true'\
-o 'com.docker.network.bridge.enable_ip_masquerade'='true'\
-o 'com.docker.network.bridge.host_binding_ipv4'='0.0.0.0'\
-o 'com.docker.network.bridge.name'='apps_segment'\
-o 'com.docker.network.driver.mtu'='1500'\
apps_segment
docker0
との差異は以下の通りです。
- IPv6 が有効化されていること
- サブネットは
10.0.0.0/24
であること - ゲートウェイは
10.0.0.1
であること - 名称が
apps_segment
であること
サブネットを変更したのは見分け易くするためです。
docker0
と同様に詳細を確認してみます。
console
$ ip addr
(snip)
2: apps_segment: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:dd:bd:cf:2d brd ff:ff:ff:ff:ff:ff
inet 10.0.0.1/24 brd 10.0.0.255 scope global apps_segment
valid_lft forever preferred_lft forever
inet6 fe80::42:ddff:febd:cf2d/64 scope link
valid_lft forever preferred_lft forever
(snip)
console
$ sudo docker network inspect apps_segment
[
{
"Name": "apps_segment",
"Id": "07bf6b91764d99f374100d0c6070cc01af8542a246b3a896a3cd56bcb9b82569",
"Created": "2021-04-30T09:06:26.042618805+09:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": true,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "10.0.0.0/24",
"Gateway": "10.0.0.1"
},
{
"Subnet": "fc00::/7",
"Gateway": "fc00::1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"6fb8fb165f9f2c7704f4dbfadfc17340e6e28acadf001a705b2af92533b4730f": {
"Name": "php",
"EndpointID": "2846bb12a73bd5828e9792593cb6bea7640e3453b47c114efaf590bcad4bcb00",
"MacAddress": "02:42:0a:00:00:02",
"IPv4Address": "10.0.0.2/24",
"IPv6Address": "fc00::2/7"
}
},
"Options": {
"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": "apps_segment",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
こんな感じです。
(コンテナを一つ配置しているので Containers
というデータが出力されています)
これで IPv6 が有効な Docker ネットワークを作成できました。
おわりに
以降は docker0
の代わりに作成したネットワーク(apps_segment
)を利用していきます。
Discussion