fixed-cidrとdefault-address-poolsの意味を把握しておらず、コンテナ作成時に振られるIPアドレスが狙い通りにならなかったため、これらについてまとめました。
--ipオプションやDocker Composeのnetworksで明示的にIPアドレスを指定するのではなく、コンテナ作成時にデフォルトで割り当てられるIPアドレスの範囲をdaemon.jsonで設定する方法です。
fixed-cidrとdefault-address-poolsの意味
fixed-cidr
fixed-cidrは、デフォルトブリッジネットワーク(docker0)のサブネット内でコンテナに割り当てるIPアドレスの範囲を制限する設定です。
例えば、bipで172.20.0.0/24を指定した際に、fixed-cidrで172.20.0.128/25のような範囲を指定することで、コンテナがその範囲内からIPを取得するように制御します。bipで指定したサブネット範囲全体を使っても構わない場合、fixed-cidrを指定する必要はありません。
ちなみにbipは、docker0のIPアドレスとネットワークアドレス範囲を指定する設定値です。
default-address-pools
default-address-poolsは、新規作成したDockerネットワーク内でコンテナに割り当てられるIPアドレスの範囲を指定するための設定です。
dockerコマンドでコンテナを作成する場合は、明示的にネットワークを指定しなければdocker0ネットワークに属するためdefault-address-poolsの設定値は関係ありませんが、Docker Composeの場合は、network_mode: bridgeと設定しなければ自動的に新たなネットワークが作成されるため、default-address-poolsで設定したネットワークアドレス範囲からIPアドレスが割り当てられます。
daemon.jsonの例
daemon.jsonの例を書いておきます。
以下の設定では、docker0ブリッジのIPアドレスを192.168.0.1/24に設定し、docker0に接続するコンテナのIPアドレスを192.168.0.128/25の範囲内から割り当てます。その他のネットワークには、172.16.0.0/12の範囲をベースとして、172.16.0.0/20、172.16.16.0/20、172.16.32.0/20、...、172.31.240.0/20といったサブネットが払い出されることになり、コンテナにはこれらのサブネットからIPアドレスが割り当てられます。
{
"bip": "192.168.0.1/24",
"fixed-cidr": "192.168.0.128/25",
"default-address-pools": [
{
"base": "172.16.0.0/12",
"size": 20
}
]
}
まとめ
デフォルトブリッジネットワークを適用する場合はfixed-cidr、Docker Composeで特に設定せず起動するなどして別途作成されたネットワークを適用する場合はdefault-address-poolsを使うことでコンテナに割り当てるIPアドレスをコントロールすることができます。