在 Linux 上使用 Docker 部署 Kafka 集群的步驟如下
1. 準備工作
確保已安裝:
Docker
Docker Compose
2. 創建 Docker Compose 文件 (docker-compose.yml)
version: '3.8'services:zookeeper:image: wurstmeister/zookeepercontainer_name: zookeeperports:- "2181:2181"networks:- kafka-netvolumes:- ./zookeeper/data:/dataenvironment:ZOOKEEPER_CLIENT_PORT: 2181kafka1:image: wurstmeister/kafkacontainer_name: kafka1ports:- "9092:9092"environment:KAFKA_BROKER_ID: 1KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka1:9093,OUTSIDE://宿主機IP:9092KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXTKAFKA_LISTENERS: INSIDE://0.0.0.0:9093,OUTSIDE://0.0.0.0:9092KAFKA_INTER_BROKER_LISTENER_NAME: INSIDEKAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3volumes:- ./kafka1/data:/kafka- /var/run/docker.sock:/var/run/docker.socknetworks:- kafka-netdepends_on:- zookeeperkafka2:image: wurstmeister/kafkacontainer_name: kafka2ports:- "9093:9093"environment:KAFKA_BROKER_ID: 2KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka2:9094,OUTSIDE://宿主機IP:9093KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXTKAFKA_LISTENERS: INSIDE://0.0.0.0:9094,OUTSIDE://0.0.0.0:9093KAFKA_INTER_BROKER_LISTENER_NAME: INSIDEKAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3volumes:- ./kafka2/data:/kafka- /var/run/docker.sock:/var/run/docker.socknetworks:- kafka-netdepends_on:- zookeeperkafka3:image: wurstmeister/kafkacontainer_name: kafka3ports:- "9094:9094"environment:KAFKA_BROKER_ID: 3KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka3:9095,OUTSIDE://宿主機IP:9094KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXTKAFKA_LISTENERS: INSIDE://0.0.0.0:9095,OUTSIDE://0.0.0.0:9094KAFKA_INTER_BROKER_LISTENER_NAME: INSIDEKAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3volumes:- ./kafka3/data:/kafka- /var/run/docker.sock:/var/run/docker.socknetworks:- kafka-netdepends_on:- zookeepernetworks:kafka-net:driver: bridge
關鍵配置說明
- 網絡架構
networks:kafka-net:driver: bridge
所有服務使用同一個自定義網絡 kafka-net,確保容器間通過服務名稱通信
- Zookeeper 配置
volumes:- ./zookeeper/data:/data # 數據持久化路徑
environment:ZOOKEEPER_CLIENT_PORT: 2181
- Kafka 節點配置
environment:# 監聽器配置(核心)# 如果外部連接監聽消費的話 # KAFKA_ADVERTISED_LISTENERS : INSIDE://kafka1:9093,OUTSIDE://localhost:9092需要修改為# KAFKA_ADVERTISED_LISTENERS : INSIDE://kafka1:9093,OUTSIDE://宿主機IP:9092KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka1:9093,OUTSIDE://宿主機IP:9092KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXTKAFKA_LISTENERS: INSIDE://0.0.0.0:9093,OUTSIDE://0.0.0.0:9092KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE# 其他重要參數KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false" # 禁止自動創建主題KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3 # 確保高可用
- 端口映射規則
節點 | 節點 | 宿主機端口 | 宿主機端口 |
---|---|---|---|
kafka1 | 9093 | 9092 | 集群內部通信 |
kafka1 | 9092 | 9092 | 外部客戶端訪問 |
kafka2 | 9094 | 9093 | 集群內部通信 |
kafka2 | 9093 | 9093 | 外部客戶端訪問 |
kafka3 | 9095 | 9094 | 集群內部通信 |
kafka3 | 9094 | 9094 | 外部客戶端訪問 |
操作流程
- 啟動集群
mkdir -p {zookeeper,kafka1,kafka2,kafka3}/data
docker-compose up -d
- 驗證集群狀態
# 查看 Kafka 日志
docker logs kafka1# 進入容器檢查 brokers
docker exec -it kafka1 bash
/opt/kafka/bin/kafka-broker-api-versions --bootstrap-server kafka1:9093
- 創建測試主題
docker exec -it kafka1 bash
/opt/kafka/bin/kafka-topics.sh --create \--topic test-topic \--partitions 3 \--replication-factor 3 \--bootstrap-server kafka1:9093
- 生產消費測試
# 生產者(使用外部端口)
docker exec -it kafka1 bash
/opt/kafka/bin/kafka-console-producer.sh \--topic test-topic \--bootstrap-server localhost:9092# 消費者(使用另一個節點)
docker exec -it kafka2 bash
/opt/kafka/bin/kafka-console-consumer.sh \--topic test-topic \--from-beginning \--bootstrap-server localhost:9093
常見問題排查
- Kafka 節點無法啟動
檢查 KAFKA_ADVERTISED_LISTENERS 配置
驗證 Zookeeper 連接:
docker exec -it kafka1 bash
nc -zv zookeeper 2181
- 外部客戶端無法連接
檢查宿主機防火墻設置
確認使用外部監聽器:
kafka-topics.sh --list --bootstrap-server localhost:9092
- 數據持久化失敗
確保掛載目錄有寫權限:
chmod -R a+rw ./kafka1/data ./kafka2/data ./kafka3/data
高級配置建議
- 調整 JVM 參數
在環境變量中添加:
KAFKA_HEAP_OPTS: "-Xmx2G -Xms2G"
- 啟用 SSL 加密
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:SSL,OUTSIDE:SSL
KAFKA_SSL_KEYSTORE_LOCATION: /kafka/keystore/kafka.jks
KAFKA_SSL_KEYSTORE_PASSWORD: yourpassword
- 集成監控
# 新增 Prometheus 服務
kafka-exporter:image: danielqsj/kafka-exporterports:- "9308:9308"environment:KAFKA_BROKERS: "kafka1:9093,kafka2:9094,kafka3:9095"networks:- kafka-net