はじめに
業務でDockerでホストしているアプリケーションに既存のネットワークからのリクエストが届かない問題が発生しました。今回はその原因と対処方法を備忘録としてまとめます。
原因
調査の結果、Dockerがデフォルトでコンテナに割り当てるIPと、既存のネットワークで割り当てられているIPが競合していることが原因でした。
Dockerのデフォルト設定では、ブリッジネットワークに 172.17.0.0/16 のアドレス空間を使用します。環境によっては既存ののIPレンジと重複する可能性があります。
対策
/etc/docker/daemon.json を編集することで、Dockerに割り当てられるIPアドレスレンジを変更できます。
daemon.jsonの設定例
{
"bip": "192.168.0.1/24",
"fixed-cidr": "192.168.0.128/25",
"default-address-pools": [
{
"base": "10.0.0.0/8",
"size": 24
}
]
}
注意:
bipやdefault-address-poolsに指定するIPレンジは、既存のネットワークで使用しているレンジと重複しないよう事前に確認してから設定してください。上記はあくまで例であり、環境に合わせて変更する必要があります。
各パラメータの意味
| パラメータ | 説明 |
|---|---|
bip | Dockerデーモンが使用するブリッジのIPアドレスとサブネット。コンテナのデフォルトゲートウェイになります |
fixed-cidr | コンテナに割り当てる固定IPアドレスのレンジ。bipのサブネット内に収まる必要があります |
default-address-pools | 複数のコンテナネットワークを作成する際のデフォルトアドレスプール。sizeは新たなネットワークに割り当てるサブネットのマスク長です |
設定反映
設定ファイルを編集したら、Dockerデーモンを再起動します。
sudo systemctl restart docker
ネットワークのリセット
Dockerデーモンの再起動後、既存のネットワークが古い設定のまま残っている場合があります。新しい設定を確実に反映させるため、以下のコマンドでネットワークをリセットします。
docker network prune
このコマンドは使用されていないネットワークを削除するため、新たなコンテナ起動時に新しい設定が適用されるようになります。
確認方法
設定が正しく適用されたかどうかは、以下のコマンドでブリッジネットワークの構成を確認できます。
docker network inspect bridge
出力例:
[
{
"Name": "bridge",
"Id": "...",
"Created": "...",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Config": [
{
"Subnet": "192.168.0.0/24",
"Gateway": "192.168.0.1"
}
]
},
...
}
]
Subnet と Gateway が設定した値(192.168.0.0/24 と 192.168.0.1)になっていれば、設定が正しく反映されています。
まとめ
設定後、DockerコンテナのIPアドレスが既存のネットワークと競合しないレンジに割り当てられるようになり、既存のネットワークからのアクセスが正常に機能するようになりました。
対応時の注意点は以下のとおりです。
fixed-cidrはbipで指定したサブネット内に収まる範囲で指定する- 既に起動しているコンテナは設定変更後も古いIPを保持することがあるため、必要に応じて再起動する
- IPレンジの選定は、既存のネットワーク設計と慎重に調整する


コメント