我正在尝试使用docker compose扩展kafka。
我的docker-compose.yaml看起来像这样:-
version: '3'
services:
kafka:
image: wurstmeister/kafka
ports:
- "9092:9092"
environment:
- KAFKA_ADVERTISED_HOST_NAME=127.0.0.1
- KAFKA_ADVERTISED_PORT=9092
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
depends_on:
- zookeeper
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
environment:
- KAFKA_ADVERTISED_HOST_NAME=zookeeper
然后,我尝试使用
$docker-compose scale kafka=3
此问题是容器端口需要唯一,因此我将端口部分更改为:-
ports:
- "9092-9095:9092"
但是,现在我无法知道在运行时分配了哪个端口,是否有办法检索分配的端口并将其分配给环境变量KAFKA_ADVERTISED_PORT?
我已经看到了很多示例,它们为每个kafka服务定义了3个单独的服务,而我并不喜欢,因为这违反了DRY原则。
答案 0 :(得分:0)
您需要重复自己的操作,因为在缩放操作期间无法编辑环境变量。如前所述,如果您在一台计算机上,则无法多次发布127.0.0.1
和相同的端口。
如果您使用的是Docker Swarm,则无论如何,代理都将位于单独的主机上,因此端口可以相同,这就是扩展操作真正有用的地方。否则,您使一台机器完成的工作量是一名经纪人的三倍,而获得的收益却很少
如果您真的不想“重复自己”,那么Kubernetes Helm Chart可以帮助您模板化多个有状态服务
此外:Zookeeper容器不使用广告名称或任何以KAFKA开头的变量
并且您应该公布外部主机IP,而不是127.0.0.1