Как установить разные порты администратора для разных контейнеров Zookeeper Docker?

Я создаю кластер из трех док-контейнеров zookeeper в одной системе. Административный сервер первого докера zookeeper работает с использованием порта 8080, поэтому для двух других контейнеров Zoo он выдает Failed to bind to /0.0.0.0:8080, используемый адрес. Я использую версию зоопарка как zookeeper: 3.5.6.

Теперь мой вопрос: как назначить другой порт администратора для сервера администратора zookeeper, отличный от 8080?

Я пробовал разные варианты установки сервера администратора на разные порты, но ничего не получалось.

1) - zookeeper.admin.serverPort=8078
2) - ZOO_CFG_EXTRA="admin.serverPort=8077"
3) - admin.serverPort=8078

Ниже представлен докер для одного смотрителя зоопарка.

 zk2:
  hostname: ${LOCAL_HOST}
  image: ${ZOOKEEPER_IMAGE}
  environment:
    - u=${USER}:${USER}
    - JVM_OPTS=-Xmx12g -Xms12g -XX:MaxPermSize=2048m
    - ZOO_MY_ID=${ZOO_MY_ID2}
    - ZOO_SERVERS=${ZOO_SERVER_1} ${ZOO_SERVER_2} ${ZOO_SERVER_3}
    - ZOO_ADMINSERVER_ENABLED=true
    - ZOO_STANDALONE_ENABLED=false
    - zookeeper.admin.serverPort=8078
  volumes:
    - ${VOLUMES_PATH}/zk2/data:/data
    - ${VOLUMES_PATH}/zk2/logs:/datalog
  network_mode: "host"
  ports:
    - ${ZOOK_CL_PORT2}:${ZOOK_CL_PORT2}
    - ${ZOOK_SR_PORT2}:${ZOOK_SR_PORT2}
    - ${ZOOK_EL_PORT2}:${ZOOK_EL_PORT2}
    - ${ZOOK_ADM_PORT2}:8078"

Может ли кто-нибудь предложить мне, как это сделать?


person Suvendu Ghosh    schedule 08.10.2020    source источник
comment
В docker compose можно указать zookeeper 3 раза, каждый раз с другим портом. Кроме того, сделайте 1-й узел главным, а два других — рабочими.   -  person Peter Majko    schedule 09.10.2020


Ответы (2)


Учитывая опубликованный вами файл компоновки докеров, проблемным элементом является network_mode: "host". Ссылаясь на официальную документацию:

https://docs.docker.com/network/host/

Если вы используете сетевой режим хоста для контейнера, сетевой стек этого контейнера не изолирован от хоста Docker (контейнер разделяет сетевое пространство имен хоста), и контейнеру не выделяется собственный IP-адрес. Например, если вы запускаете контейнер, который привязывается к порту 80, и используете сеть хоста, приложение контейнера будет доступно на порту 80 по IP-адресу хоста.

Таким образом, фактически каждый из трех членов кворума zookeeper, которых вы активируете, конкурирует за выделение порта 8080, игнорируя привязку порта, которую вы определили позже.

person Arvanitis Christos    schedule 11.10.2020
comment
спасибо @Arvanitis, я пропустил удаление network_mode из определений зоопарка, составленного докером. - person Suvendu Ghosh; 12.10.2020

Порт сервера администрирования 8080 доступен только внутри контейнера, пока вы не предоставите его с помощью сопоставления портов. Если вы хотите предоставить порт хосту докера, вы должны назначить разные сопоставления портов для обоих ваших контейнеров zookeeper.

В этом случае вы пытаетесь изменить внутренний порт сервера администрирования контейнера, который не требуется. Вы можете взять пример следующего файла docker-compose —

version: '3.4'

services:
  zoo1:
    image: 'zookeeper'
    ports:
      - '2181:2181'
      - '8080:8080'
    environment:
      ZOO_SERVER_ID: 1
      ALLOW_ANONYMOUS_LOGIN: "yes"
      ZOO_ADMINSERVER_ENABLED: "true"
      ZOO_SERVERS: "zoo1:2888:3888,zoo2:2888:3888"
  zoo2:
    image: 'zookeeper'
    ports:
      - '3181:2181'
      - '8078:8080'
    environment:
      ZOO_SERVER_ID: 2
      ALLOW_ANONYMOUS_LOGIN: "yes"
      ZOO_ADMINSERVER_ENABLED: "true"
      ZOO_SERVERS: "zoo1:2888:3888,zoo2:2888:3888"

zoo1 — порт 8080 доступен внутри контейнера, и мы предоставляем этот же порт хосту докера. zoo2 — порт 8080 доступен внутри контейнера, но мы предоставляем хосту докера другой порт (8078).

Теперь вы можете получить доступ к интерфейсу, используя порт 8080 для первого контейнера и 8078 для второго контейнера с вашего узла докера.

person Ravi    schedule 08.10.2020
comment
привет @Ravi спасибо за ответ, но я уже пробовал то же самое (внутренний порт контейнера 80 на другой открытый порт 81), но внутри контейнера это также не позволяет мне использовать тот же порт 8080, поскольку он уже используется другим контейнером zookeeper, за исключением org.apache.zookeeper.server.admin.AdminServer$AdminServerException: проблема с запуском AdminServer по адресу 0.0.0.0, порту 8080 и URL-адресу команды /commands - person Suvendu Ghosh; 08.10.2020
comment
привет @SuvenduGhosh, Не могли бы вы поделиться своим полным docker-compose.yml файлом, если это возможно? - person Ravi; 08.10.2020