【问题标题】:How to set different admin ports for different Zookeeper Docker containers?如何为不同的 Zookeeper Docker 容器设置不同的管理端口?
【发布时间】:2021-01-23 11:31:51
【问题描述】:

我正在单个系统上创建一个由三个 zookeeper docker 容器组成的集群。 第一个 zookeeper docker 的管理服务器使用 8080 端口启动,因此对于其他两个 Zoo 容器,它给出“无法绑定到 /0.0.0.0:8080,地址正在使用”。我使用 zoo 版本作为“zookeeper:3.5.6”。

现在我的问题是如何为zookeeper管理服务器分配8080以外的不同管理端口?

我尝试了不同的选项来在不同的端口上设置管理服务器,但没有任何效果。

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

以下是一位动物园管理员的 docker compose。

 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"

谁能建议我怎么做?

【问题讨论】:

  • 在docker compose中,可以指定zookeeper 3次,每次使用不同的端口。另外,将第一个作为主节点,另外两个作为工作节点。

标签: java docker apache-zookeeper


【解决方案1】:

考虑到您发布的 docker compose 文件,有问题的元素是 network_mode: "host"。引用官方文档:

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

如果您对容器使用主机网络模式,则该容器的网络堆栈不会与 Docker 主机隔离(容器共享主机的网络命名空间),并且容器不会获得自己的 IP 地址分配。例如,如果您运行一个绑定到端口 80 的容器并使用主机网络,则容器的应用程序可在主机 IP 地址的端口 80 上使用。

因此,事实上,您启动的三个 zookeeper quorum 成员中的每一个都在竞争分配 8080 端口,忽略您稍后定义的端口绑定。

【讨论】:

  • 感谢@Arvanitis,我错过了从 docker-compose zookeeper 定义中删除 network_mode。
【解决方案2】:

管理服务器端口 8080 仅在容器内可用,直到您使用端口映射公开它。如果您想将端口公开给 docker 主机,您应该为两个 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 端口在容器内可用,我们将相同的端口暴露给 docker 主机。 zoo2 - 8080 端口在容器内可用,但我们将不同的端口(8078)暴露给 docker 主机。

现在您可以使用端口8080 访问第一个容器的接口,使用端口8078 访问您的 docker 主机上的第二个容器。

【讨论】:

  • 嗨@Ravi 感谢您的回复,但我已经尝试过相同的方法(内部容器端口 80 到不同的暴露端口 81)但在容器内部它也不允许我使用与它相同的端口 8080已被另一个 zookeeper 容器使用,但异常“org.apache.zookeeper.server.admin.AdminServer$AdminServerException:在地址 0.0.0.0、端口 8080 和命令 URL /commands 上启动 AdminServer 时出现问题”
  • 嗨@SuvenduGhosh,如果可能的话,您能否分享您的完整docker-compose.yml 文件?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-25
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
相关资源
最近更新 更多