如何修复 Kafka Docker 容器抛出 0.0.0.0/0.0.0.0:2181:连接被拒绝?

Posted

技术标签:

【中文标题】如何修复 Kafka Docker 容器抛出 0.0.0.0/0.0.0.0:2181:连接被拒绝?【英文标题】:How to fix Kafka Docker container from throwing 0.0.0.0/0.0.0.0:2181: Connection refused? 【发布时间】:2021-05-11 02:44:04 【问题描述】:

我正在尝试为 Kafka 更改数据捕获设置 Docker 撰写文件环境,但遇到此错误:

正在打开与服务器 0.0.0.0/0.0.0.0:2181 的套接字连接。不会尝试使用 SASL 进行身份验证(未知错误)

发生套接字错误:0.0.0.0/0.0.0.0:2181:连接被拒绝

我一直在关注本教程https://hevodata.com/learn/kafka-cdc-postgres/,但它直接使用链接选项运行 docker 命令,而不是使用 docker-compose.yml 文件。

我试图转换这些:

docker run -it --name kafka -p 9092:9092 --link zookeeper:zookeeper debezium/kafka

到下面的 docker-compose.yml 文件。但是,它似乎完全忽略了 KAFKA_ZOOKEEPER_CONNECT 环境变量,因为这是我在日志中看到的:

使用 ZOOKEEPER_CONNECT=0.0.0.0:2181

尽管如此,文档 https://github.com/debezium/docker-images/tree/master/kafka/1.5 表明它应该可以工作。

当我按照教程使用 docker run 而不是创建 docker-compose 文件时,它完全可以正常工作。它显示了我本地计算机的 IP 地址,端口为 2181,而不是 0.0.0.0:2181。

docker-compose.yml:

version: "3.7"

services:
  postgres:
    image: debezium/postgres:10
    container_name: postgres
    ports:
      - "5000:5432"
    environment:
      POSTGRES_HOST_AUTH_METHOD: trust
      # POSTGRES_USER: db_user
      # POSTGRES_PASSWORD: db_password
  zookeeper:
    image: debezium/zookeeper:1.5
    container_name: zookeeper
    ports:
      - "2181:2181"
      - "2888:2888"
      - "3888:3888"
  kafka:
    image: debezium/kafka:1.5
    container_name: kafka
    ports:
      - "9092:9092"
    depends_on:
      - zookeeper
    environment:
      KAFKA_ADVERTISED_HOST_NAME: kafka
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
  connect:
    image: debezium/connect:1.5
    container_name: connect
    ports:
      - "8083:8083"
    environment:
      GROUP_ID: 1
      CONFIG_STORAGE_TOPIC: my-connect-configs
      OFFSET_STORAGE_TOPIC: my-connect-offsets
    depends_on: 
      - postgres
      - kafka
      - zookeeper

networks:
  default:
    name: kafkaCDC

Zookeeper 容器上的 zoo.cfg:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/zookeeper/data
dataLogDir=/zookeeper/txns
clientPort=2181
autopurge.snapRetainCount=3
autopurge.purgeInterval=1

关注这个问题好几次了;但是,我完全迷路了。特别是,因为很多例子都在使用链接。

这是让我想到使用 KAFKA_ZOOKEEPER_CONNECT 的 GitHub 帖子。 https://github.com/wurstmeister/kafka-docker/issues/512#issuecomment-505905161

除了我之外,我觉得 https://github.com/debezium/docker-images/blob/master/kafka/1.5/docker-entrypoint.sh 忽略了环境变量有问题,但可能只是我不理解某些东西并且出现了 conf 错误。

【问题讨论】:

请分享您的 zoo.cfg 文件 @Ashok 添加了 zoo.cfg 文件 尝试增加最大客户端连接数 刚刚从文件中取消注释 maxClientCnxns=60 。所以它现在设置为 60 并且仍然不起作用,即使在重新启动后也是如此。我认为这本身不是 zookeeper 问题,因为 Kafka 容器甚至无法与 zookeeper 容器通信。我相信 0.0.0.0.0:2181 是问题所在,我只是不知道如何将其更改为 zookeeper:2181。此外,当我通过 docker run 运行它时,它可以与 maxClientCnxns 注释一起使用。 你有没有运行这个运行%ZOOKEEPER_HOME%\bin\zkserver.cmd 【参考方案1】:

为了使debezium/kafka:1.5 图像在 docker compose 中工作,您可以尝试传递以下环境变量:

ZOOKEEPER_CONNECT: "zookeeper:2181"

它解决了我的问题,示例 docker compose yaml 如下:

version: "3.9"
services:
  zookeeper:
    image: debezium/zookeeper:1.5
    ports:
      - "2181:2181"
      - "2888:2888"
  kafka:
    image: debezium/kafka:1.5
    ports:
      - "9092:9092"
    environment:
      ZOOKEEPER_CONNECT: "zookeeper:2181"
    depends_on:
      - zookeeper

【讨论】:

【参考方案2】:

不要在 ENVIRONMENT 变量前加上 KAFKA_

这是我的工作集群:

version: '2'
services:
  postgres:
    image: debezium/postgres:13-alpine
    container_name: postgres
    hostname: postgres
    environment:
      POSTGRES_USER: nikamooz
      POSTGRES_PASSWORD: nikamooz
      
    ports:
      - 5432:5432
    
  zookeeper:
    image: debezium/zookeeper
    container_name: zookeeper
    hostname: zookeeper
    environment:
      ZOOKEEPER_SERVER_ID: 1
    ports:
      - 2182:2181
      - 2888:2888
      - 3888:3888
    volumes: 
      - ./data/zoo/data:/zookeeper/data
      - ./data/zoo/log:/zookeeper/txns

  kafka:
    image: debezium/kafka
    container_name: kafka
    hostname: kafka
    depends_on:
      - zookeeper
    ports:
      - 9092:9092
    environment:
      ZOOKEEPER_CONNECT: zookeeper:2181
      BOOTSTRAP_SERVERS: kafka:9092
    volumes: 
      - ./data/kafka/data:/kafka/data
      - ./data/kafka/logs:/kafka/logs


  connect:
    image: debezium/connect
    container_name: connect
    hostname: connect
    depends_on:
      - kafka
      - postgres
    ports:
      - 8083:8083
    environment:
      GROUP_ID: holding_group
      CONFIG_STORAGE_TOPIC: holding_storage_topic
      OFFSET_STORAGE_TOPIC: holding_offset_topic
      BOOTSTRAP_SERVERS: kafka:9092
     

【讨论】:

【参考方案3】:

我可以通过将 zookeeper 连接地址设置为 docker 容器 IP 地址来修复它

获取 IP 地址运行

docker inspect <container-name> --format=' .NetworkSettings.IPAddress '

并按如下方式启动kafka

docker run --name some-kafka -p 9092:9092 -e KAFKA_ZOOKEEPER_CONNECT=<zookeeper-ip>:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://:9092 -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 confluentinc/cp-kafka

Thisgithub 评论帮助我找出了我错过了什么

【讨论】:

以上是关于如何修复 Kafka Docker 容器抛出 0.0.0.0/0.0.0.0:2181:连接被拒绝?的主要内容,如果未能解决你的问题,请参考以下文章

带有 Kafka 的 Docker 集群无法与客户端容器建立连接

如何修复无法启动的docker容器

基于docker环境搭建kafka集群(三台真机之间)

如何在 docker 容器中修复 ctrl+c

docker容器中搭建kafka集群环境

Kafka学习篇1:Docker安装Kafka(单机默认参数版,依赖于Zookeeper)