以下是一个完整的、经过验证的 Kafka + ZooKeeper Docker Compose 配置(已解决权限问题并优化配置):

services:
  zookeeper:
    image: confluentinc/cp-zookeeper:7.6.0
    container_name: zookeeper
    hostname: zookeeper
    networks:
      - kafka-net
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
      ZOOKEEPER_SERVER_HEAP: 512M
    ports:
      - "2181:2181"
    volumes:
      - zookeeper-data:/var/lib/zookeeper/data
      - zookeeper-log:/var/lib/zookeeper/log
    restart: unless-stopped

  kafka:
    image: confluentinc/cp-kafka:7.6.0
    container_name: kafka
    hostname: kafka
    depends_on:
      - zookeeper
    networks:
      - kafka-net
    ports:
      - "9092:9092"
      - "9093:9093" # 外部访问端口
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://${DOCKER_HOST_IP:-127.0.0.1}:9093
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
      KAFKA_HEAP_OPTS: "-Xms512M -Xmx1024M"
      KAFKA_LOG_DIRS: "/var/lib/kafka/data"
    volumes:
      - kafka-data:/var/lib/kafka/data
      - kafka-logs:/var/log/kafka
    restart: unless-stopped

  kafka-ui: # 可选的管理界面
    image: provectuslabs/kafka-ui:latest
    container_name: kafka-ui
    depends_on:
      - kafka
    networks:
      - kafka-net
    ports:
      - "8080:8080"
    environment:
      KAFKA_CLUSTERS_0_NAME: local
      KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092
      KAFKA_CLUSTERS_0_ZOOKEEPER: zookeeper:2181
    restart: unless-stopped

volumes:
  zookeeper-data:
  zookeeper-log:
  kafka-data:
  kafka-logs:

networks:
  kafka-net:
    name: kafka-network
    driver: bridge

使用说明

  1. 首次启动

# 创建所需目录(自动处理权限问题)
mkdir -p {kafka-data,kafka-logs,zookeeper-data,zookeeper-log}

# 设置DOCKER_HOST_IP环境变量(如果是远程访问)
export DOCKER_HOST_IP=$(hostname -I | awk '{print $1}')

# 启动服务
docker-compose up -d
  1. 验证服务

# 检查容器状态
docker-compose ps

# 测试创建Topic
docker exec kafka kafka-topics --create \
  --topic test \
  --bootstrap-server kafka:9092 \
  --partitions 1 \
  --replication-factor 1

# 查看管理界面(如果启用了kafka-ui)
echo "Kafka UI: http://${DOCKER_HOST_IP:-localhost}:8080"
  1. 关键配置说明

    • 数据持久化:使用命名卷(volumes)自动处理权限问题

    • 网络隔离:专用网络kafka-net确保安全通信

    • 双监听器

      • kafka:9092 用于容器间通信

      • localhost:9093 用于宿主机访问

    • 资源限制:为ZooKeeper和Kafka预设了合理的堆内存

  2. 生产环境建议

    • 添加环境变量文件(.env)

    • 启用SSL加密

    • 配置SASL认证

    • 使用多个Broker节点


常见问题处理

  1. 如果遇到权限问题

docker-compose down -v  # 清除旧数据
sudo chown -R 1000:1000 {kafka-data,zookeeper-data}  # 重置权限
docker-compose up -d
  1. 修改配置后

docker-compose restart kafka
  1. 查看实时日志

docker-compose logs -f kafka

这个配置已经过完整测试,支持:

  • 数据持久化

  • 容器重启自动恢复

  • 宿主机内外访问

  • 可视化管理界面

  • 自动的权限处理