Docker のアドレスプールとは?

すべての Docker ネットワークには、サブネットと呼ばれる独自の IP アドレス範囲があります。サブネットを指定せずにネットワークを作成すると、Docker は 172.17.0.0/16 から 172.31.0.0/16、さらに 192.168.0.0/16 まで続く、組み込みのアドレスプール一覧から範囲を割り当てます。これは、選択された範囲が VPN、社内ネットワーク、固定アドレスで稼働するデータベースなど、別のものと競合するまでは問題なく動作します。すべてのネットワークに対して一度にこの問題を解決するには、Docker デーモンの設定でアドレスプールを変更します。

ツールの説明

このツールは、Docker が使用するサブネットを制御する daemon.json の設定を生成します。1 つ以上のアドレスプール範囲と各ネットワークのサイズを入力すると、default-address-pools 設定を取得できます。また、bip を使用してデフォルトの docker0 ブリッジのアドレスを設定することもできます。このツールは、入力したプールに収まるネットワーク数と各ネットワークのホスト数を表示し、入力中に内容を検証して、競合を引き起こす可能性が高い範囲を警告します。すべての計算はブラウザー内で行われます。

10.10.0.0/16 からすべての新しいネットワークに /24 を割り当てます。これにより、各ネットワークで 254 個の使用可能なホストを持つネットワークを 256 個確保できます。

{
  "default-address-pools": [
    {
      "base": "10.10.0.0/16",
      "size": 24
    }
  ]
}

デフォルトブリッジを別の範囲に移動し、2 つのプールを使用します。

{
  "bip": "10.200.0.1/24",
  "default-address-pools": [
    {
      "base": "10.10.0.0/16",
      "size": 24
    },
    {
      "base": "10.20.0.0/20",
      "size": 24
    }
  ]
}

機能

  • 複数のアドレスプール範囲を一度に指定(1 行につき 1 つ)
  • Docker が各プールから切り出すネットワークのサイズを指定
  • デフォルトの docker0 ブリッジ用アドレスを任意で指定
  • プールに収まるネットワーク数と、各ネットワークの使用可能なホスト数を表示
  • パブリックIPアドレス範囲、重複するプール、ホストビットが設定されたアドレスを警告
  • 結果を daemon.json としてダウンロード

仕組み

範囲は、アドレスとプレフィックス長を組み合わせて記述します。たとえば 10.10.0.0/16 のように指定します。プレフィックスは 32 ビットのうちネットワーク部分に使用するビット数を示し、残りがホスト数を表します。各プールにはベース範囲とネットワークサイズがあります。Docker はベース範囲をそのサイズのネットワークに分割し、1 つずつ割り当てます。そのため、サイズ 24 の 10.10.0.0/16 では、2^(24 − 16) = 256 個のネットワークが得られます。/24 ネットワークには 256 個のアドレスがあり、そのうち 254 個が使用可能です。最初のアドレスはネットワークアドレス、最後のアドレスはブロードキャストアドレスとして使用されるためです。Docker は、ブリッジネットワークのゲートウェイとして最初の使用可能なアドレスも使用します。

サイズはベースのプレフィックスより小さくすることはできません。また、ネットワークにはゲートウェイと少なくとも 1 つのコンテナを収容する必要があるため、/30 に制限されています。

ヒント

  • VPN や社内ネットワークで使用していない、10.0.0.0/8 または 172.16.0.0/12 の範囲を選択してください。192.168.0.0/16 付近の範囲は、自宅やオフィスのルーターで使用されるため、競合する可能性が最も高くなります
  • デフォルトの docker0 ブリッジは常に 172.17.0.0/16 を使用します。この範囲がネットワークと競合する場合は、たとえば 10.200.0.1/24 のように、bip を別のアドレスに設定してください
  • Linux では結果を /etc/docker/daemon.json として保存し、Docker Desktop では「設定 → Docker Engine」に保存してから、Docker を再起動してください。ファイルにすでに存在する設定は置き換えるのではなく、統合してください
  • default-address-pools の変更は、その後に作成されるネットワークにのみ影響します。既存のネットワークを新しい範囲に移動するには、既存のネットワークを削除して再作成してください
  • 相互に重複するプールは管理しにくいため、互いに離して設定してください
  • 「すべての事前定義済みアドレスプールが完全にサブネット化されています」と表示された場合、Docker の範囲が不足しています。より大きなベース範囲、またはより小さなネットワークサイズを追加すると、ネットワーク数を増やせます生