前面的文章部署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}} - {