DockerのIP競合を修正する

Tips

はじめに

業務で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
        }
    ]
}

注意: bipdefault-address-pools に指定するIPレンジは、既存のネットワークで使用しているレンジと重複しないよう事前に確認してから設定してください。上記はあくまで例であり、環境に合わせて変更する必要があります。

各パラメータの意味

パラメータ説明
bipDockerデーモンが使用するブリッジの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"
                }
            ]
        },
        ...
    }
]

SubnetGateway が設定した値(192.168.0.0/24192.168.0.1)になっていれば、設定が正しく反映されています。

まとめ

設定後、DockerコンテナのIPアドレスが既存のネットワークと競合しないレンジに割り当てられるようになり、既存のネットワークからのアクセスが正常に機能するようになりました。

対応時の注意点は以下のとおりです。

  • fixed-cidrbip で指定したサブネット内に収まる範囲で指定する
  • 既に起動しているコンテナは設定変更後も古いIPを保持することがあるため、必要に応じて再起動する
  • IPレンジの選定は、既存のネットワーク設計と慎重に調整する

コメント

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