Поиск по сайту:

Как запустить несколько контейнеров Docker на разных IP-адресах


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, конфигурация аналогична. В разделе ports службы вы можете использовать тот же синтаксис для привязки к определенным адресам.

version: "3"
services:
  nginx:
    image: nginx
    restart: always  
    ports: 
      - "123.0.0.1:80:80"

В любом случае вы можете создать несколько служб, привязанных к хост-порту 80, если службы не прослушивают одни и те же IP-адреса.

Однако если вы делаете это, вам нужно убедиться, что ни один контейнер не прослушивает только порт — это будет неправильная конфигурация, так как пропуск IP-адреса будет означать, что он будет прослушивать все порты. адреса для этого интерфейса.

Как получить несколько IP-адресов?

Большинство серверов имеют только один IP-адрес, поэтому вам, возможно, придется настроить дополнительные адреса самостоятельно.

Настройка нескольких IP-адресов на сервер будет зависеть от используемого вами хоста. Например, у AWS есть служба «Elastic IP», которую можно использовать бесплатно, если вы используете один IP-адрес на машину. Однако если вы хотите приобрести дополнительные эластичные IP-адреса, вы можете связать их с любым сервером. Вы будете платить $3,65 в месяц за каждый.

Некоторые сервисы позволят вам совершить разовую покупку IP-адресов, например OVH, который позволяет покупать блоки размером до /24.

Если вы хотите приобрести большие смежные блоки IP-адресов, чтобы фактически владеть ими, вы можете сделать это через различные брокерские конторы, хотя обычно это требует больших комиссий и в основном предназначено для крупных организаций.

Когда у вас есть IP-адреса, ваш облачный провайдер должен указать их на ваш адрес. Однако вы можете настроить свой сетевой интерфейс для его использования с помощью такого инструмента, как netplan.