zookeeper基于容器多节点部署

docker-compose 里用 host 网络模式,意思是:容器不再拥有自己的网络 namespace,而是直接使用宿主机的网络栈。


env

  • 3x ecs
  • zk image
  • docker-v26.1.3

⚠️:低版本的docker会导致启动异常

zk-compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
services:
zk:
image: harbor.pxb7.com/public/zookeeper:3.9
container_name: zk01
#hostname: zk
restart: always
network_mode: host
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: >
server.1=172.21.208.220:2888:3888;2181
server.2=172.21.208.221:2888:3888;2181
server.3=172.21.208.222:2888:3888;2181
JVMFLAGS: "-Xms512m -Xmx512m"
volumes:
- ./zk/data:/data
- ./zk/log:/log
- ./zk/datalog:/datalog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
services:
zk:
image: harbor.pxb7.com/public/zookeeper:3.9
container_name: zk02
#hostname: zk
restart: always
network_mode: host
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: >
server.1=172.21.208.220:2888:3888;2181
server.2=172.21.208.221:2888:3888;2181
server.3=172.21.208.222:2888:3888;2181
JVMFLAGS: "-Xms512m -Xmx512m"
volumes:
- ./zk/data:/data
- ./zk/log:/log
- ./zk/datalog:/datalog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
services:
zk:
image: harbor.pxb7.com/public/zookeeper:3.9
container_name: zk03
#hostname: zk
restart: always
network_mode: host
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: >
server.1=172.21.208.220:2888:3888;2181
server.2=172.21.208.221:2888:3888;2181
server.3=172.21.208.222:2888:3888;2181
JVMFLAGS: "-Xms512m -Xmx512m"
volumes:
- ./zk/data:/data
- ./zk/log:/log
- ./zk/datalog:/datalog

二、host 模式的运行机制

flowchart LR
A[ZooKeeper Container] --> B[Host Network Stack]
B --> C[eth0 172.21.208.220]

对内核来说,这个容器进程就像:

/usr/bin/java -jar zookeeper.jar

只不过被 namespace 隔离了文件系统。


三、容器网络模型应用场景

容器网络模型有三种思路:

flowchart TB
A[bridge] -->|NAT| B[适合业务服务]
C[host] -->|无NAT| D[适合中间件]
E[macvlan] -->|真实IP| F[适合大型集群]

如果你是三台物理机,每台跑一个 zk 容器,最干净模型是(network_mode: host):

  • host 模式
  • 每台只跑一个实例
  • IP 就是物理 IP

这比 macvlan 更简单。