记录一次,docker和本机网络方面的实践经验

wsl 中 docker-compose 搭建 kafka 集群出现的外部访问错误 在上面的配置中,KAFKA_ADVERTISED_LISTENERS 的 EXTERNAL 配置了 localhost:19092,这是因为我的客户端程序运行在 wsl 中,而 19092 端口已经映射到了容器的 9092 端口上所以可以正确访问,如果 kafka 集群客户端程序运行在两个不同的服务器上,这里应该配置 kfaka 集群所在的主机 ip,只需要记住这一串地址的 ip+port 部分是原封不动的传给客户端的,想想客户端程序所在的机器能不能解析它吧。 阅读详情

事情的开始是这样的:
我在学习某个项目的时候,需要在docker中创建kafka容器。当我创建容器完毕后,执行golang的程序,发现报错:panic: cannot create Kafka producer: kafka: client has run out of available brokers to talk to: dial tcp: lookup kafka: no such host

原因如下:

我需要访问的地址为:kafka:9092,这里需要golang程序与kafka容器在同一个docker网络中,无法通过本机网络直接访问docker中的kafka服务。因为kafka服务并没有暴露端口给外部。

当我想到大致方向之后,和chatGPT确认了下详细思路,chatGPT给到的回复如下:

当您在macOS主机上直接运行Go程序,而该程序尝试访问Docker容器内的Kafka服务(如通过kafka:9092),它会遇到DNS解析问题,因为kafka这个主机名只在Docker内部网络中有效。

为了使您的Go程序能够正确访问Kafka服务,有几种解决方案:
方案1:在Docker容器内运行Go程序

将您的Go程序也放在Docker容器中运行,这样它就能和Kafka服务在同一个Docker网络中通信。可以使用Docker Compose来管理多容器应用。
Dockerfile

首先,创建一个Dockerfile来构建您的Go程序容器。

Dockerfile

使用官方的Go镜像作为基础镜像

FROM golang:1.18

设置工作目录

WORKDIR /app

将当前目录中的所有文件复制到工作目录中

COPY . .

编译Go程序

RUN go build -o myapp

运行可执行文件

CMD [“./myapp”]

docker-compose.yml

然后,更新您的docker-compose.yml文件,包含您的Go应用程序服务。

yaml

version: '3.8'

services:
  zookeeper:
    image: confluentinc/cp-zookeeper:7.3.1
    logging:
      driver: json-file
    restart: unless-stopped
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
    networks:
      - kafka-net

  kafka:
    image: confluentinc/cp-kafka:7.3.1
    logging:
      driver: json-file
    restart: unless-stopped
    depends_on:
      - zookeeper
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
    ports:
      - "9092:9092"
    networks:
      - kafka-net

  myapp:
    build: .
    depends_on:
      - kafka
    networks:
      - kafka-net

networks:
  kafka-net:

构建和启动

构建和启动您的Docker Compose服务。

sh

docker-compose up --build

方案2:通过主机网络连接Kafka服务

如果您希望继续在本地主机上运行Go程序,可以在Kafka服务中配置主机网络,使Kafka服务在主机上暴露其端口,然后通过主机名访问Kafka。
更新docker-compose.yml

更新您的docker-compose.yml文件,将Kafka服务的KAFKA_ADVERTISED_LISTENERS环境变量配置为主机地址,并暴露端口。

yaml

version: '3.8'

services:
  zookeeper:
    image: confluentinc/cp-zookeeper:7.3.1
    logging:
      driver: json-file
    restart: unless-stopped
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
    networks:
      - kafka-net

  kafka:
    image: confluentinc/cp-kafka:7.3.1
    logging:
      driver: json-file
    restart: unless-stopped
    depends_on:
      - zookeeper
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    ports:
      - "9092:9092"
    networks:
      - kafka-net

networks:
  kafka-net:

在本地运行Go程序

在本地运行Go程序时,确保它连接到localhost:9092。

go

var (
    brokers      = []string{"localhost:9092"}
    consumeTopic = "events"
    publishTopic = "events-processed"

    logger = watermill.NewStdLogger(
        true,  // debug
        false, // trace
    )
    marshaler = kafka.DefaultMarshaler{}
)

// 其他代码…

通过这两种方式之一,您可以确保您的Go程序能够正确连接到Kafka服务。第一种方式更为推荐,因为它确保所有服务都在相同的网络环境中运行,从而避免网络配置问题。

Golang连接kafka报错: Errorkafka: client has run out of available brokers to talk to go连接kafka问题报错: panic: Error creating consumer group client: kafka: client has run out of available brokers to talk to: 3 errors occurred: 阅读详情

相关推荐

记录docker笔记(六):Docker网络-bridge网络(1)

通过上述容器间连接案例,相信已经对bridge网络有了更深刻的理解。

dopapapa的博客 3518

【解决方案】kafka: client has run out of available brokers to talk to (Is your cluster reachable?)

  终端中报错kafka: client has run out of available brokers to talk to (Is your cluster reachable?)   同时Kafka启动时报错: Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error) 解决方法:    检查自己的zookeeper

好梦就会趁你睡醒实现 2万+

docker上手记录

docker是一个将软件虚拟化的工具,可以在任意设备上,建立虚拟机跑软件,实现快速环境搭建运行。

qq_26124425的博客 2354

Kafka常见错误及解决办法

1、报错信息: org.apache.kafka.clients.consumer.OffsetOutOfRangeException: Offsets out of range with no configured reset policy for partitions: {qukan_log_v3-198=2289560518} 报错原因:当消费者消费offset大于或小于当前kafka集...

yiweiyi329的博客 4万+

go 链接kafka报错解决

报错错误: producer close, err: kafka: client has run out of available brokers to talk to (Is your cluster reachable?) 原因端口未对外开放; Centos 开启所有端口对外 systemctl stop firewalld.service ...

tian的博客 9799

一次Docker安装vsftpd记录

由于百度查找的各种yum安装vsftpd的教程都安装配置不成功, 突然想起还有Docker这么个玩意,专制各种环境不一样,配置不一样的东东, 然后就用Docker来构建vsftpd服务; 下面记录一下安装的过程及后续遇到的各种问题

懒懒的树懒熊 3458

记录一次docker安装jenkins出现的问题

记录一次docker安装jenkins出现的问题 按照 https://www.cnblogs.com/fuzongle/p/12834080.html 的步骤去安装。 在修改 vi hudson.model.UpdateCenter.xml里的内容,换成清华加速源出现问题。 出现的报错 : WARNING hudson.model.UpdateCenter#updateDefaultSite: Upgrading Jenkins. Failed to update the default Updat

m0_46542378的博客 1597

Docker拉取超时到完美运行:一次完整的问题排查与解决记录

最近我在配置一台新的CentOS服务器时,遇到了经典的Docker镜像拉取问题。无论是还是其他镜像,都遇到了各种连接超时错误。经过一系列排查修复,最终不仅解决了问题,还学到了不少Docker网络配置的知识。本文将完整记录这次排错过程,希望能帮助遇到类似问题的朋友。IPv6连接问题:服务器尝试通过IPv6连接Docker仓库,但网络环境不支持DNS解析问题:默认DNS可能解析缓慢或返回IPv6地址镜像源问题:直接连接Docker官方仓库速度慢或不稳定配置冲突:多个地方配置了相同的参数导致冲突。

wohaiweifaju的博客 1306

Docker_Env:技术笔记与实践经验的宝库

Docker_Env:技术笔记与实践经验的宝库 项目介绍 docker_env 是一个由资深技术专家 wangzheng422 维护的开源项目,旨在记录分享其在日常系统操作中的技术笔记实践经验。这些笔记涵盖了从操作系统安装、IaaS/PaaS平台搭建、中间件系统验证到应用系统开发验证的广泛领域。项目内容丰富,不仅包括详细的步骤说明,还有作者在实际操作中遇到的问题及其解决方案,非常适合技术爱好...

gitblog_00002的博客 892

一次配置Docker环境的完整记录

一次配置Docker环境的完整记录

博学而笃志,切问而近思。 986

记录一次docker 只监听ipv6 导致无法访问

1、系统环境: ubuntu Docker version 19.03.6 2、问题说明: 由于本地网络不支持ipv6,如下图: 然后docker启动镜像后只监听ipv6,所以导致外网无法访问;用命令netstat -nlp 查看端口信息: root@VM-4-6-ubuntu:/# netstat -nlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address For.

Dengrz的Blog 5106

dockerDocker单机网络iptables策略

一、实验环境 操作系统: CentOS7.5 Minimal IP:192.168.1.100 二、安装docker # yum -y install yum-utils device-mapper-persistent-data lvm2 epel-release # yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo #yum list docker-c...

michaelwoshi的博客 2464

Docker 构建网络服务后本机不能访问

Docker 构建网络服务后本机不能访问 起因 使用tornado构建了一个服务,测试都没有问题 使用docker构建镜像,使用docker run image_name启动服务 使用浏览器访问 127.0.0.1:xxxx 失败,无法连接 排错 发现访问127的网址肯定是不行的,这简直就是秀智商,你访问本机怎么可能转发到容器中呢…… 想起来docker inspect container_...

weixin_34324081的博客 1502

Centos上第一次使用docker记录

记录自己第一次使用docker的步骤背景docker的下载安装与启动镜像的制作补充 背景 在一次系统集成的情况下,需要把程序部署在docker中,方便日后阿里云平台上直接调用docker的AIP管理多个服务。这也是第一次使用docker记录步骤可能比较杂乱,并且不会使用于所有的程序。主要是记录自己遇到的错误解决方式。本人所用的环境是centos7.x docker的下载安装与启动 在有网的情况下可以参见官方文档:https://docs.docker.com/engine/install/centos/

qq_42281655的博客 981

从零到上线:一次真实的 Docker 部署问题记录

本文记录了在Linux服务器上使用DockerCompose部署Go聊天系统时遇到的一系列问题及解决方案。主要挑战包括:服务名冲突、YAML语法错误、MySQL启动顺序问题、Redis域名解析失败、MySQL表初始化失败、环境差异导致的Go命令缺失,以及Windows客户端连接DockerMySQL的问题。通过分析错误日志,逐一解决了容器冲突、网络配置、端口映射等问题,最终实现三大服务(MySQL、Redis、GoChatServer)的稳定运行。关键经验包括:服务间通信需使用服务名而非IP、必须正确映射端

2403_88422250的博客 1146

记录一次干碎docker的经历

这次事件的起因是在使用docker bulid 建立自己的镜像文件时,出现下面的错误提示: Err:80 http://security.ubuntu.com/ubuntu bionic-updates/universe amd64 libsw Connection failed [IP: 185.125.190.36 80] 大概意思就是有一些包因为网络问题出现Connection failed failed to fetch,我最后的解决方法参考以下链接: Docker下载包的时候显示Con

weixin_44698281的博客 1557

记录一个连不上docker中的mysql的问题

使用环回地址127.0.0.1会智能的将流量给到docker0网络,而使用localhost这会萨比的把流量发给本机的网卡地址。使用了localhost根本不能连接,因为localhost下的mysql服务被我关闭了,只有docker下的mysql5.7在运行。上面这个报错不用担心,是没有输入密码的原因(-p),但是初见端倪,ip地址定位到了docker0网络,而不是本机的192。本来是毫无思绪的,以前在云服务器上可能是防火墙的问题,但是这个桌面环境我压根没有使用防火墙。

Yqha1的博客 1741

Docker容器技术(四)——docker网络

docker0:docker服务启动创建的虚拟网桥→bridge(类似于虚拟交换机)veth pair:虚拟以太网对,相当于一根网线,一端在容器上,另一端在网桥上容器网络有三个方向: 容器→外部网络 SNAT 外部网络容器 DNAT(docker run -p 3306:3306)docker自动实现 容器←→容器 容器访问外部默认可以访问(docker自动实现),首先开启了包转发net.ipv4.ip_forward =

weixin_57823173的博客 2132
上一篇: golang 安装protoc protoc-gen-go,以及grpc和protocol buffer的一些理解。
下一篇: 记录一次服务器磁盘被占满,导致服务无法运行的问题。
xiamu66
博客等级 码龄8年 67粉丝 · 13原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值