如何为不同的 Zookeeper Docker 容器设置不同的管理端口?

How to set different admin ports for different Zookeeper Docker containers?

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

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

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

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

下面是一位动物园管理员的docker撰写。

 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"

谁能建议我怎么做?

管理服务器端口 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 端口从您的 docker 主机访问第一个容器的接口,第二个容器使用 8078 端口。

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

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

If you use the host network mode for a container, that container’s network stack is not isolated from the Docker host (the container shares the host’s networking namespace), and the container does not get its own IP-address allocated. For instance, if you run a container which binds to port 80 and you use host networking, the container’s application is available on port 80 on the host’s IP address.

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

简单的方法

ZOO_ADMIN_SERVER_PORT_NUMBER:9999 

ZOO_ADMIN_SERVER_PORT_NUMBER: Admin server port. Default: 8080

bitnami/zookeeper Reference URL