在Docker中部署Kafka时,持久化数据是生产环境中的关键需求。以下是基于Docker Compose的配置方案,通过挂载数据卷(Volume)实现Kafka和Zookeeper的数据持久化:
1. 创建持久化目录
在宿主机上创建目录用于存储数据(例如 /opt/docker/kafka):
mkdir -p /opt/docker/kafka/{zookeeper-data,zookeeper-log,kafka-data}2. 修改docker-compose.yml
version: '3'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- "2181:2181"
volumes:
# 挂载Zookeeper数据和日志目录
- /opt/docker/kafka/zookeeper-data:/var/lib/zookeeper/data
- /opt/docker/kafka/zookeeper-log:/var/lib/zookeeper/log
kafka:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://YOUR_HOST_IP:9092 # 替换为宿主机IP或域名
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_LOG_DIRS: /var/lib/kafka/data # Kafka数据存储路径
volumes:
# 挂载Kafka数据目录
- /opt/docker/kafka/kafka-data:/var/lib/kafka/data3. 关键配置说明
- Zookeeper持久化:
- 数据目录:
/var/lib/zookeeper/data(存储集群元数据) - 日志目录:
/var/lib/zookeeper/log(存储事务日志) - 挂载到宿主机的
/opt/docker/kafka/zookeeper-data和/opt/docker/kafka/zookeeper-log
- Kafka持久化:
- 数据目录:
/var/lib/kafka/data(存储消息日志和Topic数据) - 挂载到宿主机的
/opt/docker/kafka/kafka-data - 通过
KAFKA_LOG_DIRS显式指定数据路径(避免镜像默认路径变化导致问题)
4. 启动服务
docker-compose up -d5. 验证数据持久化
- 检查宿主机目录:
ls /opt/docker/kafka/kafka-data
# 应看到Kafka生成的日志文件(如 __consumer_offsets-*)- 测试数据恢复:
- 写入消息到Topic:
docker exec -it kafka-broker kafka-console-producer --bootstrap-server localhost:9092 --topic test-topic- 删除容器后重新启动:
docker-compose down && docker-compose up -d- 检查Topic是否仍然存在:
docker exec -it kafka-broker kafka-topics --list --bootstrap-server localhost:90926. 生产环境建议
- 副本因子:设置
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3(至少为3,确保高可用)。 - 独立磁盘:为Kafka数据目录挂载高性能磁盘(如SSD)。
- 网络配置:
- 如果跨主机访问,需将
KAFKA_ADVERTISED_LISTENERS中的YOUR_HOST_IP替换为宿主机的公网IP或域名。 - 启用SSL/SASL认证(参考Confluent官方镜像文档)。
- 监控:集成Prometheus + Grafana监控Kafka和Zookeeper状态。
















