基于Docker单机部署ZooKeeper集群

本文介绍了如何使用Docker部署ZooKeeper集群,对比了Docker部署与裸机部署的区别,强调了Docker在简化网络配置和自动化部署上的优势。详细步骤包括准备docker和docker-compose,配置并启动Zookeeper集群,以及使用四字命令检查集群状态。

  前面的文章部署zk服务,直接在裸机上部署,较为不便,现在很多服务如果不做docker化,无论在故障恢复、运维都增加很大困难,无法做到自动化部署,这种低效率的IT运营模式是比较难接受的,对于我们开发而已,必须是一键式优雅部署,所以本篇文章采用docker方式部署zk集群,可以从中对比裸机部署过程的不同以及优势

1、部署docker和docker-compose

参考本博客文章:链接

2、部署zookeeper集群

  拉取zk镜像,可以dockerhub上面看下目前的zk官方镜像的tag有什么版本,默认是latest,接着是3.5.5以及3.4.14,这里用的stable版本3.4.14

[root@dn2 opt]# docker pull zookeeper:3.4.14

在宿主机上新建一个存放docker集群zk服务器目录(仅为了方便管理),并在该目录下新建一个compose配置文件

[root@dn2 zk_docker_cluster]# pwd
/opt/zk_docker_cluster
[root@dn2 zk_docker_cluster]# vi docker-compose.yml
version: '3.3'
services:
  zoo1:
    # 使用zookeeper:3.4.14镜像,加上tag标签
    image: zookeeper:3.4.14
    restart: always
    hostname: zoo1
    container_name: zk1
    ports:
      - 2181:2181
    volumes:
    # 宿主机目录路径无需手工创建,docker-compose有权限进行自行创建挂载的目录路径    
      - /opt/zk_docker_cluster/zoo1/data:/data
      - /opt/zk_docker_cluster/zoo1/datalog:/datalog
      - /opt/zk_docker_cluster/zoo1/logs:/logs
      
    environment:
      ZOO_MY_ID: 1
			ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888

  zoo2:
    image: zookeeper
    restart: always
    hostname: zoo2
    container_name: zk2
    ports:
      - 2182:2181
    volumes:
      - /opt/zk_docker_cluster/zoo2/data:/data
      - /opt/zk_docker_cluster/zoo2/datalog:/datalog
      - /opt/zk_docker_cluster/zoo2/logs:/logs      
    environment:
      ZOO_MY_ID: 2
			ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888

  zoo3:
    image: zookeeper
    restart: always
    hostname: zoo3
    container_name: zk3
    ports:
      - 2183:2181
    volumes:
      - /opt/zk_docker_cluster/zoo3/data:/data
      - /opt/zk_docker_cluster/zoo3/datalog:/datalog
      - /opt/zk_docker_cluster/zoo3/logs:/logs      
    environment:
      ZOO_MY_ID: 3
			ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888

配置文件需要注意的地方

在运行前,可以用docker-compose -f docker-compose.yml config检查配置文件是否正确

1)version 版本号不能随便改,例如这里改为1.0,提示不支持

[root@dn2 zk_docker_cluster]# docker-compose -f docker-compose.yml config 
ERROR: Version in "./docker-compose.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version (e.g "2.2" or "3.3") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1.

2)注意yaml语法的层次表达

例如在这里,故意把zoo1放置在service同层次上,引起解析出错,所以在编排zk的配置时,要注意这些细节

ERROR: yaml.parser.ParserError: while parsing a block mapping
  in "./docker-compose .yml", line 1, column 1
expected <block end>, but found '<block mapping start>'
  in "./docker-compose .yml", line 17, column 3

3) 注意到docker-compose yml跟裸机部署集群的不同

  • 例如hostname:

在docker中,无需要指明具体的ip地址,因为docker使用其内部私网为zk服务自动分配私网ip,而且自动DNS解析主机名,因此配置文件可以直接用zoo1这样的主机名

而在裸机部署中,裸机自己的网络设置需要指定具体IP地址,如果zoo.cfg配置用了主机名代替服务器IP,那么要求裸机网卡设定的DNS需支持zk网段的主机名解析

  • 再例如设定集群的server.n:

在docker-compose里,直接主机名,server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 ,前面已经提过,docker内部其实已经对三个zk容器都分配相应的私网地址,通过以下命令查看:

# 列出所有docker容器IP
[root@dn2 zk_docker_cluster]# docker inspect --format='{
   
   {.Name}} - {
   
   {range .NetworkSettings.Networks}}{
   
   {.IPAddress}}{
   
   {end}}' $(docker ps -aq)
/zk1 - 172.18.0.4
/zk3 - 172.18.0.2
/zk2 - 172.18.0.3
<think> 首先,用户的问题是:“Docker部署单机Zookeeper”,我需要使用中文来回答问题。回答完成后,必须提出3-5个相关问题,并以“§§相关问题§§”开头,后跟1. ... 2. ... 等等,全部在一行中,禁止换行分散。 回顾之前的对话: - 用户第一次问“Docker部署单机Zookeeper”,我给出了详细回答,包括拉取镜像、启动容器、验证等步骤,然后提出了四个相关问题。 - 现在用户再次问完全相同的问题:“Docker部署单机Zookeeper”,但在系统提示后重复了问题。系统提示是重申规则:使用中文回答问题,结束时提出§§相关问题§§。 用户的消息是:“Docker部署单机Zookeeper ”,后面有空格,但内容相同。系统提示是相同的规则复制。 所以,我需要再次回答这个问题。既然问题相同,我可以重用或修改之前的回答,但要确保符合规则。 关键点: - 回答必须用中文。 - 结束时,必须有“§§相关问题§§”后跟3-5个相关问题。 - 相关问题必须在末尾,第一行必须是完整的“§§相关问题§§”,然后紧跟1. ... 2. ... 3. ...,不要换行。 从之前的回答中,我有相关内容。我可以基于那个来构建。 结构化我的回答: 1. **介绍**:简要解释Docker部署单机Zookeeper。 2. **步骤**:提供主要步骤,如拉取镜像、运行容器、验证。 3. **可选细节**:包括docker-compose示例或关键配置。 4. **结束**:以“§§相关问题§§”开头,然后列出3-5个相关问题。 相关问题需要基于用户的问题和我的回答。之前的回答中,我提出了: 1. 如何配置Zookeeper的自动清理日志策略? 2. Docker部署Zookeeper集群需要修改哪些关键参数? 3. Zookeeper单机模式与集群模式性能差异有多大? 4. 如何通过zkCli.sh验证Docker容器内的Zookeeper服务? 我可以复用或调整这些,但要确保它们相关。 确保回答是新写的,但内容可以相似。 最终输出格式: - 回答内容(中文)。 - 然后直接“§§相关问题§§1. ... 2. ... 3. ...” 不要有任何额外的换行在“§§相关问题§§”之后;它应该在一行中。 例如:"§§相关问题§§1. 问题1 2. 问题2 3. 问题3" 在我的之前的响应中,就是这样做的: "§§相关问题§§1. ... 2. ... 3. ... 4. ..." 现在,起草回答: **回答内容**: - 用中文解释。 - 步骤: - 拉取Zookeeper镜像:`docker pull zookeeper` - 运行单机容器:`docker run -d --name zookeeper -p 2181:2181 -v /path/to/data:/data zookeeper` - 验证:`docker exec -it zookeeper zkServer.sh status` - 提供docker-compose示例。 - 强调单机模式适用于开发测试。 **相关问题**(3-5个): 基于之前的: 1. 如何配置Zookeeper的自动清理日志策略? 2. Docker部署Zookeeper集群需要修改哪些关键参数? 3. Zookeeper单机模式与集群模式的主要区别是什么? 4. 如何优化DockerZookeeper的性能? 确保4个问题。 最终输出: [回答内容] §§相关问题§§1. 问题1 2. 问题2 3. 问题3 4. 问题4 </think> ### Docker部署单机Zookeeper指南 使用Docker部署单机Zookeeper是一种快速、隔离的开发测试方案。以下是核心步骤: 1. **拉取官方镜像**: ```bash docker pull zookeeper:latest # 获取最新版镜像 ``` 2. **启动容器**(建议挂载数据卷持久化): ```bash docker run -d \ --name zookeeper \ -p 2181:2181 \ -v /your/local/data:/data \ zookeeper ``` - `-p 2181:2181`:暴露客户端端口(默认2181) - `-v`:挂载目录防止数据丢失(如/data存储快照) 3. **验证服务状态**: ```bash docker exec -it zookeeper zkServer.sh status # 输出 Mode: standalone 表示成功 ``` #### 进阶方案(docker-compose): ```yaml version: '3.9' services: zookeeper: image: zookeeper container_name: zk-single ports: - "2181:2181" volumes: - ./zk-data:/data environment: ZOO_STANDALONE_ENABLED: "true" # 强制单机模式 ``` 运行:`docker-compose up -d` #### 注意事项: - **持久化**:始终挂载 `/data` 目录避免重启丢失数据。 - **资源限制**(可选):在 `docker run` 添加 `--memory=512m` 限制内存。 - **适用场景**:单机模式仅推荐开发测试;生产环境需部署集群
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值