Docker відмовляється створювати мережу з повідомленням, що пул перекривається з іншим у цьому адресному просторі, і хтось вирішує, що причиною має бути маршрут VPN. Цього не може бути. Ця помилка виникає, поки виділяється пул, до появи хоча б одного пакета, і ручний маршрут ядра на неї не впливає. VPN важливий кроком пізніше, коли контейнер, який уже має адресу, перестає бути доступним після появи маршруту. Дві проблеми, два набори доказів, і їх змішування дає зміну, яка не виправляє жодної.

Дві схожі помилки

Помилка виділення арифметична. Docker порівнює запитану підмережу з тими, якими вже керує, знаходить перетин і відмовляє. Нічого ще не працює, тому немає ні маршруту, ні контейнера, ні трафіку для перевірки.

Симптом під час роботи — питання доступності. Контейнер, який відповідав учора, не відповідає зараз, і щось змінилося в таблиці маршрутизації хоста. Контейнер досі тримає свою адресу; питання в тому, який шлях обирає ця адреса.

Обидві — проблеми плану адрес. Лише одна з них є проблемою Docker.

Спершу прочитайте виділені пули

Перелічіть мережі та перегляньте ті, що можуть перетинатися. Підмережа живе в конфігурації IPAM, а під'єднані контейнери перелічено окремо:

docker network ls
docker network inspect EXISTING_NETWORK

Порівняйте цю підмережу з пулом, який запитує нова мережа, і пам'ятайте, що Compose створює власну мережу за замовчуванням для кожного проєкту. Конфлікт із забутим проєктом виглядає точно як конфлікт із демоном.

Статичний ipv4_address у сервісі — це адреса одного контейнера, а не визначення пулу. Його зміна не усуває перекриття, бо перекриття між підмережами мереж, а не між контейнерами. Довідник network-create Docker вимагає підмереж, що не перекриваються, для звичайного виділення через міст і описує, як вибрати одну явно.

Виберіть префікс, який переживе VPN

Негайний конфлікт і майбутній маршрут вирішуються одним і тим самим вибором, тож зробіть його один раз. Порівняйте діапазон-кандидат із LAN, з кожним призначенням VPN, до якого може дістатися хост, і з будь-яким іншим overlay, що використовується.

Префікс, який задовольняє Docker і конфліктує з віддаленою мережею, дає контейнер, який чисто запускається і стає недоступним тієї миті, коли піднімається тунель. Це друга помилка в цій статті, і її значно важче діагностувати пізніше, ніж уникнути зараз.

Запишіть вибрані діапазони туди, звідки наступний проєкт зможе їх прочитати. Реєстр виділених префіксів в один рядок дешевший за тиждень незрозумілих тайм-аутів.

Виведіть або змініть мережу навмисно

Для нової мережі Compose задайте невикористаний префікс у конфігурації IPAM мережі. Для наявного проєкту сплануйте перенумерацію: фіксовані адреси, залежні сервіси та крок повторного створення мережі — усе треба врахувати, бо редагування YAML не перенумеровує робочу мережу.

Якщо застаріла мережа володіє конфліктним виділенням, перевірте, хто до неї під'єднаний, перш ніж її видаляти. docker network rm відмовляє, поки існують активні endpoint'и, а docker stop приймає імена або ID контейнерів, а не ім'я мережі. Зупинка контейнера також не видаляє визначення мережі, яке тримає пул.

Широкий prune — не інструмент діагностики. Він дістається незв'язаних проєктів і знищує докази, які ви збиралися зібрати.

Пули за замовчуванням допомагають лише наступному виділенню

Налаштування пулу адрес за замовчуванням у демона покращує майбутні автоматичні виділення, утримуючи їх поза діапазонами, які ви резервуєте. Воно не переназначає заднім числом адреси наявним мережам і не розв'язує явну підмережу, що перекривається з іншою явною підмережею.

Ставтеся до цього налаштування як до окремої, запланованої зміни з власним перезапуском, а не як до частини ремонту одного проєкту. Змішування двох означає, що перезапуск демона потрапляє в середину незв'язаного розслідування. Заплануйте його в окремому вікні. Потім підтвердьте, що одне нове автоматичне виділення справді потрапляє поза зарезервовані діапазони.

Коли створення вдасться, перевірте підмережу, яка фактично працює, і потім виконайте один справжній запит застосунку, коли VPN у передбаченому стані. Якщо пул коректний, а доступ усе ще не працює, залишок роботи — вибір маршруту, фільтрування та зворотний шлях. Це розслідування під час роботи, і воно не робить помилку виділення заднім числом безглуздою.

Порядок роботи: прочитайте виділені пули, виберіть префікс, який обходить і Docker, і призначення VPN, навмисно перестворіть мережу, потім перевірте один запит із піднятим тунелем.

Схожі статті