🐳

Docker ネットワークについて

2021/05/03に公開

はじめに

以前、 CentOS のコンテナを構築した際、 IPv6 が有効になっていないため Postfix が起動しないということが起きました。
このとき Docker ネットワークについて調査したことを以下に纏めます。

Docker ネットワーク

以下のページを参照しました。

https://docs.docker.jp/engine/userguide/networking/dockernetworks.html
https://docs.docker.jp/engine/userguide/networking/work-with-networks.html

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