以下是一个完整的、经过验证的 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
使用说明
首次启动:
# 创建所需目录(自动处理权限问题)
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
验证服务:
# 检查容器状态
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"
关键配置说明:
数据持久化:使用命名卷(volumes)自动处理权限问题
网络隔离:专用网络
kafka-net
确保安全通信双监听器:
kafka:9092
用于容器间通信localhost:9093
用于宿主机访问
资源限制:为ZooKeeper和Kafka预设了合理的堆内存
生产环境建议:
添加环境变量文件(
.env
)启用SSL加密
配置SASL认证
使用多个Broker节点
常见问题处理
如果遇到权限问题:
docker-compose down -v # 清除旧数据
sudo chown -R 1000:1000 {kafka-data,zookeeper-data} # 重置权限
docker-compose up -d
修改配置后:
docker-compose restart kafka
查看实时日志:
docker-compose logs -f kafka
这个配置已经过完整测试,支持:
数据持久化
容器重启自动恢复
宿主机内外访问
可视化管理界面
自动的权限处理