Docker容器运行Kafka:ZooKeeper启动后Broker未启动问题排查
为什么你的Docker容器里只有ZooKeeper启动成功?
嘿,这个问题我太熟了!原因其实很直白:你用分号分隔的两个命令里,zookeeper-server-start.sh是前台运行的——它会一直占据容器的主进程,死死卡住,后面的kafka-server-start.sh根本没机会被执行到。
Docker容器的生命周期是绑定主进程的:只要主进程没退出,容器就会运行;一旦主进程结束,容器直接终止。你的写法里,第一个命令永远在前台跑着,第二个命令完全被阻塞了。
解决方法推荐
方案1:用启动脚本(最推荐,灵活易维护)
这种方式适合测试或小型部署,步骤如下:
- 在本地创建一个
start.sh脚本,内容如下:
#!/bin/bash # 后台启动ZooKeeper bin/zookeeper-server-start.sh config/zookeeper.properties & # 给ZooKeeper一点启动时间(根据实际情况调整时长) sleep 10 # 用exec启动Kafka,让它成为容器的主进程(方便接收停止信号优雅关闭) exec bin/kafka-server-start.sh config/server.properties
- 给脚本添加执行权限:
chmod +x start.sh
- 修改你的Dockerfile:
FROM openjdk:8 WORKDIR /app ADD kafka_2.11-1.1.0 /app ADD start.sh /app/start.sh ENTRYPOINT ["/app/start.sh"]
方案2:直接在ENTRYPOINT里调整命令(快速临时方案)
如果不想写脚本,可以直接把ZooKeeper放到后台运行,再启动Kafka:
FROM openjdk:8 WORKDIR /app ADD kafka_2.11-1.1.0 /app ENTRYPOINT bin/zookeeper-server-start.sh config/zookeeper.properties & sleep 10 && exec bin/kafka-server-start.sh config/server.properties
不过这种方式的缺点是固定的sleep 10可能在某些环境下不够,而且后期不好调整。
额外提醒
生产环境里,不建议把ZooKeeper和Kafka放到同一个容器——分开部署才能更好地扩容、监控和维护。但如果是测试环境或者快速验证的场景,上面的方法完全够用。
内容的提问来源于stack exchange,提问作者Alan Gaytan
相关产品推荐
相关产品推荐

