三台主机:
- 主机一:172.16.3.52
- 主机一:172.16.3.63
- 主机一:172.16.3.64
1、下载镜像
docker pull zookeeper:3.4.12
2、在主机上建立挂载目录和zookeeper配置文件
mkdir -p /home/data/zookeeper_data/conf \
mkdir -p /home/data/zookeeper_data/data \
cd /home/data/zookeeper_data/conf
touch zoo.cfg
vi zoo.cfg
三台主机上的zoo.cfg配置信息如下:
clientPort=2181
dataDir=/data
dataLogDir=/data/log
tickTime=2000
initLimit=5
syncLimit=2
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
maxClientCnxns=60
server.0=172.16.3.52:2888:3888
server.1=172.16.3.63:2888:3888
server.2=172.16.3.64:2888:3888
3、在主机一上为自己分配server id,命令如下:
cd /home/data/zookeeper_data/data
echo "0" > myid
在主机二上为自己分配server id,命令如下:
cd /home/data/zookeeper_data/data
echo "1" > myid
在主机二上为自己分配server id,命令如下:
cd /home/data/zookeeper_data/data
echo "2" > myid
4、三台主机依次启动容器:
docker run --restart=always --network host -v /home/data/zookeeper_data/data:/data -v /home/data/zookeeper_data/conf:/conf --name zookeeper -d zookeeper:3.4.12
命令说明:
- --network host: 使用主机上的网络配置,如果不用这种模式,而用默认的bridge模式,会导致容器跨主机间通信失败
- -v /data/zookeeper_data/data:/data:主机的数据目录挂载到容器/data下
- -v /data/zookeeper_data/conf:/conf: 主机的配置目录挂载到容器的/conf下,容器内的zkServer.sh默认会读取/conf/zoo.cfg下的配置
都启动完成后,每台主机的2181/2888/3888端口都会开放出来了
5、验证
docker exec -it 容器id /bin/bash
docker logs 容器id/容器名称
使用windows工具zoolnspector
6、排错
前面两台发现没有问题,后面有台机器报错。
权限不足,发现用户不一样:
[root@bogon conf]# id
#不能启动的主机用户
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
#正常的主机用户
uid=0(root) gid=0(root) 组=0(root)
根据后面的信息我查到是因为selinux的原因。
[root@bogon conf]# docker logs -f 19f5e6824a57
chown: /data: Permission denied
chown: /data: Permission denied
这是因为开启了SELinux,解决办法:
①直接将SELinux的工作模式设置成 disabled,这样就不会出现策略拦截问题了,但是这样的话我们的系统就没有SELinux安全防护了
②通过 restorecon 或者 chcon 命令来修复我们的文件上下文信息
命令 restorecon 可以用来恢复文件默认的上下文:
restorecon -R -v /home/data/zookeeper_data/
//-R 表示递归,如果是目录,则该目录下的所有子目录、文件都会得到修复
命令 chcon 可以改变文件的上下文信息,通常我们使用一个参照文件来进行修改:
chcon --reference=/var/www/html/index.html /var/www/html/test.html
restorecon -v zoo.cfg