卡夫卡与泊坞窗dynamicadvertised_host_name

我已经在Dev和QA中使用wurstmeister / Kafka了几个星期,但是在每种情况下,我都需要使用KAFKA_ADVERTISED_HOST_NAMEKAFKA_ADVERTISED_HOST_NAMEKAFKA_ADVERTISED_HOST_NAME硬编码到所在的IP地址。 这在testing过程中并没有出现问题,但现在我正试图将其扩展到生产环境,现在变得更加令人沮丧了。

我将继续使用docker-compose手动将三个Kafka和Zookeper实例部署到三个独立的云主机上。 我已经打开了适当的端口,并试图在我有限的Docker知识中dynamic分配KAFKA_ADVERTISED_HOST_NAME 。 非常令我沮丧的是,它总是会产生某种错误。 docker中心的自述文件提到dynamic分配这个variables威盛
HOSTNAME_COMMAND, eg HOSTNAME_COMMAND: "route -n | awk '/UG[ \t]/{print $$2}'"

这会导致我的应用程序在尝试连接时获取连接被拒绝的响应。 但是,手动分配IP到三个主机工作得很好。 我在这里错过了什么?

撰写可以在运行时将variablesreplace为configuration选项 。

编写环境variables

KAFKA_ADVERTISED_HOST_NAME容器环境variables设置为名为DOCKER_HOST_IP的本地variables。

 whatever: environment: KAFKA_ADVERTISED_HOST_NAME: ${DOCKER_HOST_IP} 

然后,只要运行DOCKER_HOST_IP docker-compose就需要设置DOCKER_HOST_IP 。 未设置时,您将收到docker-compose发出的警告。

IP在Docker主机上

运行ip route show会列出默认的接口。
然后ip address show会给你的IP地址。

把这些变成一个variables

 default_interface=$(ip ro sh | awk '/^default/{ print $5; exit }') export DOCKER_HOST_IP=$(ip ad sh $default_interface | awk '/inet /{print $2}' | cut -d/ -f1) [ -z "$DOCKER_HOST_IP" ] && (echo "No docker host ip address">&2; exit 1 ) echo "$DOCKER_HOST_IP" 

您可以将这些命令添加到您的启动脚本,或者创build一个独立的脚本,以便在您需要时调用。

IP通过Docker机器

如果您正在pipe理远程docker-machine ,则可以通过计算机环境获取ip。

 DOCKER_HOST_IP=$(docker-machine ip ${DOCKER_MACHINE_NAME})