Как запустить несколько контейнеров 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
.