docker - составное масштабирование возвращает ошибку «адрес уже используется». Как я могу масштабировать и поддерживать предсказуемые / фиксированные IP-адреса? - PullRequest
0 голосов
/ 21 января 2020

Я ищу способ масштабирования своих контейнеров, сохраняя при этом предсказуемые IP-адреса для каждого из них. Например, у меня есть следующий файл docker -compose.yaml с произвольным изображением. У него фиксированный IP-адрес, работающий в определенной сети:

например,

version: '3'

services:
  my_postgres_db:
    image: postgres:9.6.16-alpine
    networks:
      static-network:
        ipv4_address: 172.20.128.2

networks:
  static-network:
    ipam:
      config:
        - subnet: 172.20.0.0/16

Я запускаю следующие команды:

docker-compose up -d
docker-compose scale my_postgres_db=4

И получаю следующие ошибки:

Creating and starting root_my_postgres_db_2 ... error
Creating and starting root_my_postgres_db_3 ... error
Creating and starting root_my_postgres_db_4 ... error

ERROR: for root_my_postgres_db_2  Cannot start service my_postgres_db: Address already in use

ERROR: for root_my_postgres_db_3  Cannot start service my_postgres_db: Address already in use

ERROR: for root_my_postgres_db_4  Cannot start service my_postgres_db: Address already in use

Это понятно, так как я пытаюсь вызвать несколько контейнеров, использующих один и тот же фиксированный IP-адрес.

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

Я начинаю больше двигаться в сторону Kubernetes. Я знаю, что у вас могут быть Deployments, которые содержат несколько «реплик» контейнеров, существенно масштабируя и группируя их в одну концепцию. Затем мы можем связаться с Развертыванием по одному IP / порту с помощью Сервиса.

Мне интересно, есть ли способ сделать это, используя только Docker / Docker Compose?

1 Ответ

1 голос
/ 21 января 2020

Я думаю, что единственный способ достичь этого только с помощью docker -compose - это создание отдельных сервисов с фиксированным ip для каждого в ваших docker -композиционных файлах, таких как:

version: '3'

services:
  my_postgres_db_1:
    image: postgres:9.6.16-alpine
    networks:
      static-network:
        ipv4_address: 172.20.128.2
  my_postgres_db_2:
    image: postgres:9.6.16-alpine
    networks:
      static-network:
        ipv4_address: 172.20.128.3
  my_postgres_db_3:
    image: postgres:9.6.16-alpine
    networks:
      static-network:
        ipv4_address: 172.20.128.4

networks:
  static-network:
    ipam:
      config:
        - subnet: 172.20.0.0/16

In kubernetes вы можете использовать лучший подход, например Сервис или StatefulSet .

StatefulSet - отличный выбор для достижения того, чего вы хотите, потому что он поддерживает контейнер spe c:

Каждый Pod в StatefulSet получает свое имя хоста из имени StatefulSet и порядкового номера Pod. Шаблон для созданного имени хоста: $ (имя набора состояний) - $ (порядковый номер).

Поэтому, если вы создадите StatefulSet с именем 'my_postgres_db' с 3-мя репликами, ваш контейнер будет иметь одно и то же имя (my_postgres_db-1, my_postgres_db-2 e my_postgres_db-3).

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...