使用swarm在mac上搭建开发环境
源起 docker并不是新技术。作为 golang 社区内的旗舰级的项目,从诞生之初就吸引了很多人的瞩目,甚至可以说是获得了所有 golang 社区的人多瞩目吧。同时对推广 golang 也起了很大的作用。作为从一直关注着 golang 的人,大概2年前就开始尝试使用它了。不过由于其依赖 linux 的多项特性,导致在 mac 上使用必须要借助虚拟机,体验总是要差一点。最近经人提醒发现新的 docker for mac 可以不借助虚拟机就可以在 mac 上提供与 linux 上同样的体验,大喜!遂卸载虚拟机,打算用新软件搭个测试环境玩耍一下。 安装 超级简单,照着说明来就好。顺便装上了 kitematic。这个确实也非常好用。 目标 将一套以前用 python 实现的 kafka producer程序,移植到 golang 上。测试新程序的异常情况处理(特指连接失败的处理)。 然后就被坑掉了。 坑1 网络的问题 最初只是想通过 docker 启动一个单点的 kafka,程序通过本地网络直接访问就可以了。通过之前安装的 kitematic 从 hub.docker.com 上下载了 spotify/kafka 镜像,并直接启动容器。通过kitematic连接到容器内,各项命令执行正常。但是执行程序的时候却发现,总是第一次连接成功后,后边的所有连接都是失败的。通过日志发现程序在第一次成功连接 kafka 之后,连接地址发生了变更,变成了容器内部的地址(直观的现象就是,端口从 kitematic 随机生成的 12345 变成了 9092)。然后又尝试了手动用 –net=host 方式启动,结果彻底连不上了。 在对 github.com/shopify/sarama 简单的分析以后,发现它的连接过程是这样的: 首次连接,根据配置信息连接服务器 连接成功后,从服务器获取broker信息 根据获得到的broker信息,连接其余的broker 问题就出现在最后一步上,服务器返回的broker信息中,网络地址都是容器内部的网络,没有办法从容器网络外部直接连接的。 通过在github上查 issue, google 上查资料,有了以下不负责任的猜想: