Dockerが自動で割り当てるIPアドレスの範囲を指定

docker-composeを使って多数のコンテナを作っていたら、いつの間にかNextcloudコンテナからLAN上のNASへのCIFS接続ができなくなってしまいました。さらに確認したところ、DockerホストにしているLXDコンテナ内からもLAN上の各ホストへの接続ができなくなっていました。

原因を調べたところ、docker-compose up -dした時に自動で作られるネットワークに割り当てられるIPv4アドレスが、物理LANに使っているアドレス(192.168.1.0/24)と重複していました。

どうも、デフォルトでは「172.17.0.0/16」「172.18.0.0/16」…と割り当てられていき、「172.31.0.0/16」まで使い切ると、「192.168.0.0/20」「192.168.16.0/20」…と割り当てられていくようです。LANでは「192.168.1.0/24」などを使っていたので、いつの間にか通信できなくなっていた、というわけでした。なお、31個のネットワークを作成して「192.168.240.0/20」まで達すると、「Error response from daemon: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network」というエラーが発生して作れなくなってしまうので、これもいずれ問題になりそうです。

ネットワークアドレスはdocker-compose.ymlで指定したり、docker network createのオプションで指定したりもできますが、自分で管理するのも面倒ですし、間違いの元になってしまいます。
そこで、LANで使っていない「172.16.0.0/12」を「/24」で分割して自動で割り当てるよう、「/etc/docker/daemon.json」に以下の設定を記述し、「sudo systemctl restart docker.service」を実行しました。

{
  "default-address-pools":
    [
      {"base":"172.16.0.0/12", "size":24}
    ]
}

この設定により、「172.16.1.0/24」「172.16.2.0/24」…「172.31.2.0/24」が割り当てられるようになりました。ただし、すでに作成済みのネットワークは作り直す必要があるため、適宜「docker-compose down」や「docker network rm ネットワーク名」で削除し、「docker-compose up -d」や「docker network create ネットワーク名」で再作成しました。

これで、LANのアドレスと重複はなくなり、DockerホストやコンテナからLAN内のホストへの通信も行えるようになりました。また、ネットワーク数の上限も31から4080にできました。その分、ネットワークごとに使えるホストアドレスは254に減りましたが、そんなに使うことはないでしょう。

コメント

タイトルとURLをコピーしました