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

问题描述

我正在单个系统上创建一个由三个zookeeper docker容器组成的集群。 第一个Zookeeper泊坞窗的管理服务器使用端口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

下面是一个动物园管理员的码头工人组成。

 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文件,有问题的元素是 network_mode: "host"。引用官方文档:

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

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

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

,

管理服务器端口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在容器内可用,但我们向Docker主机公开了不同的端口(8078)。

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