问题描述
我正在单个系统上创建一个由三个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
访问接口。