Что такое пулы адресов Docker?

Каждая сеть Docker получает собственный диапазон IP-адресов, называемый подсетью. Когда вы создаёте сеть, не выбирая подсеть, Docker берёт её из встроенного списка пулов адресов, который начинается с 172.17.0.0/16 и продолжается диапазонами до 172.31.0.0/16 и 192.168.0.0/16. Это работает до тех пор, пока выбранный диапазон не конфликтует с чем-либо ещё, например с VPN, офисной сетью или базой данных, размещённой по фиксированному адресу. Чтобы исправить это сразу для всех сетей, измените пулы адресов в настройках демона Docker.

Описание инструмента

Этот инструмент создаёт настройки daemon.json, определяющие, какие подсети использует Docker. Введите один или несколько диапазонов пулов адресов и размер каждой сети, чтобы получить настройку default-address-pools. Также можно задать адрес моста docker0 по умолчанию с помощью bip. Инструмент показывает, сколько сетей помещается в ваших пулах и сколько хостов содержит каждая сеть, проверяет введённые данные по мере ввода и отмечает диапазоны, которые, вероятно, приведут к конфликтам. Все вычисления выполняются в вашем браузере.

Примеры

Выделить всем новым сетям подсеть /24 из диапазона 10.10.0.0/16, что позволяет разместить 256 сетей с 254 доступными хостами в каждой:

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

Перенести мост по умолчанию в другой диапазон и использовать два пула:

{
  "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
    }
  ]
}

Возможности

  • Несколько диапазонов пулов адресов одновременно, по одному в каждой строке
  • Размер сетей, которые Docker выделяет из каждого пула
  • Необязательный адрес моста docker0 по умолчанию
  • Отображение количества сетей, помещающихся в пулах, и количества доступных хостов в каждой сети
  • Предупреждения о публичных диапазонах, пересекающихся пулах и адресах с установленными битами хоста
  • Скачивание результата в виде файла daemon.json

Как это работает

Диапазон записывается в виде адреса и длины префикса, например 10.10.0.0/16. Префикс указывает, сколько из 32 бит относятся к части сети, а остальные используются для подсчёта хостов. Каждый пул имеет базовый диапазон и размер сети. Docker разделяет базовый диапазон на сети указанного размера и выдаёт их по одной, поэтому базовый диапазон 10.10.0.0/16 с размером 24 даёт 2^(24 − 16) = 256 сетей. Сеть /24 содержит 256 адресов, из которых 254 являются доступными, поскольку первый адрес является адресом сети, а последний — широковещательным адресом. Docker также использует первый доступный адрес в качестве шлюза мостовой сети.

Размер не может быть меньше префикса базового диапазона и ограничен значением /30, поскольку сети необходимы адрес для шлюза и как минимум один контейнер.

Советы

  • Выбирайте диапазоны из 10.0.0.0/8 или 172.16.0.0/12, которые не используются вашим VPN и офисной сетью. Диапазоны около 192.168.0.0/16 с наибольшей вероятностью вызовут конфликт, поскольку их используют домашние и офисные маршрутизаторы
  • Мост docker0 по умолчанию всегда использует 172.17.0.0/16. Если этот диапазон конфликтует с вашей сетью, задайте для bip другой адрес, например 10.200.0.1/24
  • Сохраните результат как /etc/docker/daemon.json в Linux или в разделе «Настройки → Docker Engine» в Docker Desktop, а затем перезапустите Docker. Объедините эти настройки с уже имеющимися в файле, не заменяйте их полностью
  • Изменение default-address-pools влияет только на сети, созданные после этого. Удалите существующие сети и создайте их заново, чтобы переместить их в новый диапазон
  • Пулы, которые пересекаются друг с другом, сложно анализировать, поэтому держите их раздельно
  • Когда появляется сообщение «все предопределённые пулы адресов полностью разбиты на подсети», это означает, что у Docker закончились диапазоны. Добавьте более крупный базовый диапазон или уменьшите размер сети, чтобы получить больше сетей