Docker позволяет легко запускать приложения с помощью бессерверных облачных решений, но многие люди предпочитают управлять несколькими контейнерами, работающими на нескольких мощных машинах.
В этом случае использование нескольких IP-адресов может стать отличным способом управления несколькими сервисами на одном порту.
Как работают сетевые интерфейсы?
Linux использует сетевые интерфейсы для представления физического оборудования, а также для создания виртуальных сетевых компонентов, таких как VLAN, мосты или алиасы.
Если вы перечислите все устройства в вашей системе с помощью ip addr show, вы найдете различные интерфейсы, такие как eth0 и eno1, которые представляют реальные соединения.
IP-адреса – это отдельная от сетевых интерфейсов история, но, по сути, вы можете иметь несколько IP-адресов, настроенных на один интерфейс, что позволяет вам привязывать сервисы к сетевым сокетам для каждой комбинации IP:PORT.
Это хорошо работает с Docker, который позволяет вам управлять сетевыми ресурсами на уровне Docker, а не на уровне приложения.
В Docker приложение внутри контейнера может просто привязаться к “порту 80”, который сопоставляется Docker с определенным IP-адресом на хосте.
Это значительно упрощает отделение уровня приложения от хоста, на котором оно работает.
Например, вы можете иметь несколько различных API-сервисов, работающих на одной машине, не настраивая базовые контейнеры.
Для Docker не имеет значения, на каком системном интерфейсе находится IP-адрес, так как внутренняя сеть Docker справится с этим за вас, если вы запустите контейнеры с правильной конфигурацией.
Запуск нескольких служб Docker на одном сервере
Запустить контейнер на определенном адресе довольно просто, в зависимости от того, как вы его запускаете.
По сути, большинство контейнеров Docker имеют свои порты, настроенные в формате host:container.
Например, 5000:80 забирает порт 80 контейнера и делает его доступным с порта 5000 хоста.
Однако на самом деле вы можете связывать сокеты напрямую, то есть вместо 5000 вы можете подставить пару IP:PORT, используя три двоеточия для всей привязки:
docker run -it -d ipaddress:hostport:containerport --name web nginx
Например, вы можете иметь два контейнера NGINX на разных IP-адресах, например, так (запомните, что Docker требует отдельных имен для контейнеров):
docker run -it -d 123.0.0.1:80:80 --name web nginx docker run -it -d 123.0.0.2:80:80 --name web2 nginx
Если вы используете Docker Compose, конфигурация будет аналогичной.
В разделе портов для службы вы можете использовать тот же синтаксис для привязки к определенным адресам.
version: "3" services: nginx: image: nginx restart: always ports: - "123.0.0.1:80:80"
В любом случае, вы можете создать несколько сервисов, привязанных к порту хоста 80, при условии, что сервисы не прослушивают одни и те же IP-адреса.
см. также:
- 🐳 Как использовать Docker с UFW параллельно
- 🐳 Как запустить несколько служб в одном контейнере Docker
- 🐳 Как установить Docker на Kali Linux
- 🐳 Полезные примеры использования команды Docker ps
- 🐳 Обновление патчей безопасности в контейнерах Docker
- 🐳 Запуск сервера Wazuh в контейнерах Docker с помощью Docker Compose
- 🐳 Что такое Docker без root (rootless)?
- 🐳 Как запустить Grafana в контейнере Docker
- 🐳 Как использовать Docker для упаковки приложений CLI
- 🐳 Мониторинг и управление Docker контейнерами – обзор инструментов CLI
- 🐳 Как защитить TCP-сокет Docker с помощью TLS