我已经在Dev和QA中使用了wurstmeister / Kafka几周,但是在每种情况下我都需要使用{{1将KAFKA_ADVERTISED_HOST_NAME
硬编码到它所使用的盒子的IP上。 }}。这在测试过程中并不是一个问题,但现在我正在尝试将其扩展到生产阶段,它变得更加令人沮丧。
我将继续使用docker-compose
将三个Kafka和Zookeper实例手动部署到三个独立的云主机上。我已经打开了相应的端口,并尝试使用我有限的Docker知识中的所有内容来动态分配docker-compose
。令我沮丧的是,它总会产生某种错误。 docker hub上的README提到动态分配此变量VIA
KAFKA_ADVERTISED_HOST_NAME
这会导致我的应用程序在尝试连接时获得连接被拒绝的响应。但是,手动将IP分配给三台主机完全正常。我在这里想念的是什么?!
答案 0 :(得分:2)
在运行时撰写可以substitute variables into configuration options。
将KAFKA_ADVERTISED_HOST_NAME
容器环境变量设置为名为DOCKER_HOST_IP
的局部变量。
whatever:
environment:
KAFKA_ADVERTISED_HOST_NAME: ${DOCKER_HOST_IP}
每当您运行DOCKER_HOST_IP
时,都需要设置docker-compose
。当docker-compose
未设置时,您会收到警告。
正在运行ip route show
将列出默认界面
然后ip address show
将为您提供IP地址。
将这些变为变量
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"
您可以将这些命令添加到启动脚本的任何位置,或者从它们创建独立脚本以在需要时调用。
如果您正在管理远程docker-machine
,则可以通过machine environment获取IP。
DOCKER_HOST_IP=$(docker-machine ip ${DOCKER_MACHINE_NAME})