1. 问题描述
zk配置如下:
我通过容器启动了一个zk,通过-p 参数暴露了2181和3888端口,容器启动脚本如下:
#!/bin/shdocker rm -f myzookeeper1docker run -p 12181:2181 -p 13888:3888 --name myzookeeper1 --restart always -d zookeeper:3.9.2
执行脚本启动容器后,在容器外curl 12181端口是可以curl通的,返回结果如下:
但是curl 13888端口的时候,curl不通,如下:
在容器内curl 3888是可以curl通的,如下:
可以看到,在容器内是可以curl通的。
在容器外使用tcpdump开启抓包,然后再次curl localhost:13888端口:
可以看出请求从主机(VM-4-12-centos)发送到了Docker容器的IP地址(172.17.0.3),但是容器返回了一个重置(RST)包。这通常表示容器内的服务没有在你所映射的端口上监听,或者防火墙配置阻止了访问。
2.解决过程
询问chatgpt后,给出以下可能的原因和解决方案:
-
服务未在正确端口监听:
- 确保Zookeeper服务在容器内的3888端口上正常运行,并且监听所有接口(通常是
0.0.0.0
)。
- 确保Zookeeper服务在容器内的3888端口上正常运行,并且监听所有接口(通常是
-
防火墙配置:
- 检查宿主机和Docker容器的防火墙设置,确保13888端口没有被阻止。
- 在宿主机上,可以使用以下命令查看防火墙状态:
sudo iptables -L
-
Docker网络配置:
- 确保Docker网络没有配置问题。可以检查Docker网络配置:
docker network ls
- 如果使用自定义网络,确保容器能够正确地与外部通信。
- 确保Docker网络没有配置问题。可以检查Docker网络配置:
-
Docker运行参数:
- 确保在运行Docker容器时使用了正确的端口映射,命令格式为
-p 宿主机端口:容器端口
。确认你使用的命令是否是-p 13888:3888
。
- 确保在运行Docker容器时使用了正确的端口映射,命令格式为
-
SELinux/AppArmor:
- 在某些系统上,SELinux或AppArmor可能会影响容器与宿主机之间的网络连接。可以尝试暂时禁用它们以进行排查。
排查过程:
1. 查看服务是否在正确端口监听:
可以看出,3888端口只监听了127.0.0.1地址,所以在容器外是连接不上的,因此需要修改下配置文件:
将server.1的内容改为:0.0.0.0:2888:3888
重新启动后,在集群外可以curl通3888端口了。
3. 总结
对server.x=ip:2888:3888配置的理解
server.x配置的作用需要结合myid来理解
1. 当myid的内容和x的内容相同时,ip表示当前zk节点的2888和3888端口需要监听的网络接口地址,如果配置成127.0.0.1,在容器外是访问不到的,因此需要改成监听所有地址,即0.0.0.0。
2. 当myid的内容和x的内容不相同时,ip地址表示zk x节点的地址,因此需要配置成zk节点的访问地址。