在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/data

3. 关键配置说明

  • 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 -d

5. 验证数据持久化

  • 检查宿主机目录
ls /opt/docker/kafka/kafka-data
# 应看到Kafka生成的日志文件(如 __consumer_offsets-*)
  • 测试数据恢复
  1. 写入消息到Topic:
docker exec -it kafka-broker kafka-console-producer --bootstrap-server localhost:9092 --topic test-topic
  1. 删除容器后重新启动:
docker-compose down && docker-compose up -d
  1. 检查Topic是否仍然存在:
docker exec -it kafka-broker kafka-topics --list --bootstrap-server localhost:9092

6. 生产环境建议

  • 副本因子:设置 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3(至少为3,确保高可用)。
  • 独立磁盘:为Kafka数据目录挂载高性能磁盘(如SSD)。
  • 网络配置
  • 如果跨主机访问,需将 KAFKA_ADVERTISED_LISTENERS 中的 YOUR_HOST_IP 替换为宿主机的公网IP或域名。
  • 启用SSL/SASL认证(参考Confluent官方镜像文档)。
  • 监控:集成Prometheus + Grafana监控Kafka和Zookeeper状态。