使用容器启动的zk无法暴露3888问题解决

1. 问题描述

zk配置如下:

我通过容器启动了一个zk,通过-p 参数暴露了2181和3888端口,容器启动脚本如下:

#!/bin/sh

docker rm -f myzookeeper1

docker 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后,给出以下可能的原因和解决方案:

  1. 服务未在正确端口监听

    • 确保Zookeeper服务在容器内的3888端口上正常运行,并且监听所有接口(通常是0.0.0.0)。
  2. 防火墙配置

    • 检查宿主机和Docker容器的防火墙设置,确保13888端口没有被阻止。
    • 在宿主机上,可以使用以下命令查看防火墙状态:
      sudo iptables -L
  3. Docker网络配置

    • 确保Docker网络没有配置问题。可以检查Docker网络配置:
      docker network ls
    • 如果使用自定义网络,确保容器能够正确地与外部通信。
  4. Docker运行参数

    • 确保在运行Docker容器时使用了正确的端口映射,命令格式为-p 宿主机端口:容器端口。确认你使用的命令是否是-p 13888:3888
  5. 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节点的访问地址。

### 回答1: 在Linux系统中启动ZK的步骤如下:1. 使用终端或者SSH登录Linux系统;2. 使用下列命令启动ZK:/path/to/zookeeper-server-start.sh /path/to/zoo.cfg;3. 启动完成后,使用下列命令检查ZK是否启动成功:/path/to/zookeeper-server-status.sh;4. 如果ZK启动成功,会显示ZK的运行状态。 ### 回答2: 在Linux系统中启动ZooKeeper可以按照以下步骤进行操作: 1. 首先,确保已经在Linux系统中安装了ZooKeeper。可以通过命令`sudo apt-get install zookeeper`来安装ZooKeeper。 2. 接下来,进入到ZooKeeper的安装目录,一般情况下是`/usr/share/zookeeper`。 3. 找到并编辑`zoo.cfg`文件,该文件是ZooKeeper的配置文件。可以使用命令`sudo vi zoo.cfg`来打开该文件。 4. 在`zoo.cfg`文件中,找到并修改以下几个关键配置项: - `dataDir=/var/lib/zookeeper`:将该项修改为用于存储ZooKeeper数据的目录。 - `clientPort=2181`:修改该项为ZooKeeper服务的监听端口,一般使用默认端口2181即可。 - `server.X=host:port:port`:根据需要,可以增加多个ZooKeeper服务器的配置,其中`X`表示服务器的唯一id,`host`表示服务器的主机名或IP地址,`port`表示服务器之间通信的端口。 5. 保存并关闭`zoo.cfg`文件。 6. 在命令行中,使用以下命令启动ZooKeeper服务:`sudo zkServer.sh start`。 7. 等待片刻,当看到类似`ZooKeeper JMX enabled by default`和`Using config: /usr/share/zookeeper/zoo.cfg`的输出时,表示ZooKeeper已经成功启动。 以上就是在Linux系统中启动ZooKeeper的基本步骤。需要注意的是,替换步骤4中的`X`、`host`和`port`为具体的值,并根据需要进行修改。 ### 回答3: 在Linux系统中启动zk(ZooKeeper)有几个步骤。 首先,确保ZooKeeper已被正确安装在你的Linux系统上。 接下来,打开终端窗口并输入以下命令以启动ZooKeeper: ``` zkServer.sh start ``` 这会执行一个名为`zkServer.sh`的脚本,用于启动ZooKeeper服务器。 如果一切正常,你将会看到一些启动相关的输出信息。ZooKeeper会在后台运行,并开始监听指定端口上的客户端连接。 你可以使用以下命令来检查ZooKeeper服务器是否正在运行: ``` zkServer.sh status ``` 如果输出结果显示"ZooKeeper server is running",这表示ZooKeeper已成功启动。 但是,在启动ZooKeeper之前,你可能需要编辑`zkServer.sh`脚本以符合你的需求。其中一种常见的需求是修改ZooKeeper服务器使用的端口号。你可以使用文本编辑器打开`zkServer.sh`文件,找到相关的端口配置,并进行相应修改。请确保以管理员(root)权限打开并保存该文件。 另外,需要注意的是,上述命令是使用默认的ZooKeeper配置文件来启动服务器。如果你想使用自定义配置文件,可以将其复制到ZooKeeper目录中,并使用以下命令启动: ``` zkServer.sh start <path_to_custom_config_file> ``` 请将`<path_to_custom_config_file>`替换为你的自定义配置文件的路径。 总之,要在Linux系统中启动ZooKeeper,只需打开终端窗口并运行适当的命令即可。确保进行适当的配置,并始终验证是否成功启动
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值