nazo6 noteblog

DockerでIPアドレスが枯渇した時の対処法

作成:2024/05/23

更新:2024/05/23

この記事は、Zennにも投稿しています。
自宅サーバーでdocker-compose upをしたとき
could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network
というエラーが出ました。どうやらデフォルトの設定ではIPアドレスが使い果たされてしまうため30個以上のネットワークをDockerで作ることができないみたいです。
ググったところdocker network pruneなどの解決策が出てきましたが実際に30個のネットワークを使っているのでこれでは意味がありません。
根本から解決するには、1ネットワークあたりのIPアドレスを少なくするように変更する必要があります。
これはネットワークにアドレスを設定することで可能です。例えば以下の記事ではそのようにやっています。

新たなコンテナアプリを起動したところネットワーク関連エラーで起動できない

zenn.dev

ですが今後のために今回はdockerの設定を変更することにしました。Dockerのdefault-address-poolsという設定を変更することでdocker compose upで作られるネットワークのデフォルト設定をすることができます。
デフォルトではdockerのdefault-address-poolsは以下のようになっています(実際にこういう設定が記述されているわけではありませんが概念としてはこうなります)。
"default-address-pools" : [
{
"base" : "172.17.0.0/12",
"size" : 16
},
{
"base" : "192.168.0.0/16",
"size" : 20
}
]
これは1ネットワークあたり最大で/16という巨大領域を割り当てています。1コンテナに対してこれは明らかに過剰なので減らしてしまいましょう。
"default-address-pools" : [
{
"base" : "172.17.0.0/12",
"size" : 20
},
{
"base" : "192.168.0.0/16",
"size" : 24
}
]
にして1ネットワークあたりのホスト数を少なくしてやればより多くのネットワークを作れるというわけです。
以下の記事に非常に詳しく説明されていて分かりやすいです。

The definitive guide to docker's default-address-pools option

What the default pools are, why you can't make more than 31 bridge networks, & how to fix that.

straz.to

SynologyのContainer Managerでの設定方法

SynologyのContainer Managerを使っている人だけに関係がある話です。
通常であれば以上の設定を/etc/docker/daemon.jsonに加えればいいのですが、Synology NAS上のdockerでは
/var/packages/ContainerManager/etc/dockerd.json
に設定しなければなりません。
また、ここはContainer Managerの更新で上書きされる可能性があるため注意する必要があります。