Дать контейнеру собственный адрес в сети: что вы выигрываете и чем платите
Контейнер можно опубликовать по собственному адресу, а не по номеру порта. Выигрыш реален, и цена тоже, причём вторую обычно обнаруживают уже после сборки.
AtlasPVE ·
Эта статья отвечает на
- docker контейнер собственный ip адрес
- docker macvlan что это
- docker macvlan хост не видит контейнер
- docker контейнер не виден в сети
- docker выдать ip вместо порта
Устройство по умолчанию такое: контейнер делит адрес машины, а вы обращаетесь к нему через номер порта. Это просто, это безопасно, и для большинства задач этого хватает.
Есть случаи, когда не хватает, и они предсказуемы.
Когда номера порта мало
Двум приложениям нужен один и тот же номер. Вы переносите одно на другой номер, а потом ссылки, которые это приложение создаёт само, того номера не содержат, и всё запутывается.
Приложение объявляет себя в сети. Поиск принтеров, поиск медиапроигрывателей, поиск устройств умного дома работают через самообъявляющие сообщения. Эти сообщения не переживают отображения портов. Приложение объявляет себя, но объявляет адрес машины, и другая сторона до него не доберётся.
Вы хотите видеть приложение в списке устройств маршрутизатора. Чтобы выдать постоянный адрес, написать отдельное правило брандмауэра, видеть его трафик отдельно. При отображении портов для сети такого приложения не существует; существует только машина.
Другой путь: дать контейнеру собственную личность
Контейнер появляется в сети со своим аппаратным адресом, берёт свой адрес у маршрутизатора и стоит в списке устройств как физический прибор.
Первая реакция обычно такая: «почему все не делают так». Ответ в цене.
Цена первая: машина не достаёт до собственного контейнера
Это удивляет сильнее всего и обычно обнаруживается, когда работа уже сделана.
Все устройства сети до этого контейнера достают. Машина, на которой он работает, нет.
Причина разумна: оба используют один и тот же физический интерфейс, и трафик не возвращается с коммутатора. Машина отправляет пакет наружу, и пакет не приходит обратно на её собственную карту.
Последствия повседневные: проверка состояния, работающая на машине, до приложения не дотягивается, другой контейнер на той же машине не может подключиться, написанный вами сценарий не работает. И всё это при том, что снаружи сеть выглядит безупречно.
Решение есть, но это дополнительная деталь: открыть на машине второй виртуальный интерфейс, привязанный к той же карте, и пустить через него путь к адресу контейнера. После установки проблема исчезает, но поскольку это дополнение, при забывчивости никто ничего не поймёт.
Цена вторая: вы тратите настоящий адрес
Каждый контейнер расходует адрес из вашей сети. Десять приложений это десять адресов. В небольшой сети предел наступает быстро.
Кроме того, если адрес выдан во временное пользование, он может смениться. После смены всё, что было к нему привязано, включая написанное вами правило, молча указывает не туда.
Цена третья: сетевая карта и брандмауэр
Карта должна принимать больше одного аппаратного адреса. Большинство беспроводных соединений этого не делают, а некоторые виртуальные среды приходят с отключённой возможностью. Не решайте без проверки.
И ваш брандмауэр теперь видит в сети устройство, которого не знает. Для вас это контейнер; для того, кто пишет правила, обычный прибор. Это не беда, но, оставшись несказанным, однажды кого-то запутает.
Адреса мало, нужно ещё имя
Приложение с адресом и без имени это половина выигрыша. Никто не хочет запоминать адрес.
Чтобы имя объявлялось в сети, эту работу должен кто-то делать. В собственном образе приложения такой части обычно нет, и быть не должно: образу базы данных нечего объявлять о себе в сети.
Правило
Отображение порта даёт двери номер. Сетевая личность даёт гражданство.
Давайте гражданство только тогда, когда сети действительно нужно обращаться с этим приложением как с устройством. Если не нужно, номер порта и проще, и безопаснее.
Что делает Atlas
Настраивая это, Atlas не трогает собственный образ приложения. Рядом с приложением он открывает небольшой помощник, и помощник разделяет сетевой стек приложения. Именно помощник просит адрес у маршрутизатора и именно он объявляет имя в сети.
Эта привязка сделана намеренно и даёт две вещи. В образе приложения не нужны ни клиент получения адреса, ни объявитель имени. И поскольку сетевой стек принадлежит приложению, когда приложение останавливается, помощник падает вместе с ним, не оставляя осиротевшего контейнера.
Для проблемы, когда машина не достаёт до собственного контейнера, устанавливается описанный выше мост, причём как служба, чтобы он восстанавливал себя при перезапуске машины.
По-настоящему стоит рассказать об ошибке, найденной в этом мосте при испытании на живой системе.
Мост открывал путь к адресу контейнера. Но он не удалял путь исчезнувшего контейнера. После перезапуска путь временного адреса остался висеть. Последствие: если позже другое устройство займёт этот адрес, предназначенный ему трафик уйдёт в мост. То есть ошибка бьёт не по контейнеру, а по невиновной третьей стороне в сети.
Исправление состояло в том, чтобы мост перестал быть тем, что только добавляет пути, и стал тем, что удаляет пути, которым больше не соответствует живой контейнер.
Общий вывод верен и вне сетей: добавить это лёгкая половина. Путь, правило, отображение это утверждение, которое вы делаете о мире. Когда мир меняется, неотозванное утверждение превращается в ложь, и бьёт оно обычно не по вам, а по тому, кто к вам не имеет никакого отношения.
Источники
Собственная документация Proxmox. На английском, и последнее слово в этом вопросе за ней.