跳到主要内容

Docker Compose

2025年01月05日
柏拉文
越努力,越幸运

一、认识


通过 Docker Compose 部署 Kafka(包括 Zookeeper

二、准备


安装 DockerDocker Compose:确保本地已安装好 Docker 环境和 Docker Compose 工具。 Kafka 依赖 Zookeeper 来管理集群,所以通常需要同时启动 ZookeeperKafka 两个服务。

三、配置


在项目目录下创建一个 docker-compose.yml 文件,内容如下:

version: "3"
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
container_name: zookeeper
restart: always
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_SYNC_LIMIT: 2
ports:
- "2181:2181"

kafka:
image: confluentinc/cp-kafka:latest
container_name: kafka
restart: always
depends_on:
- zookeeper
ports:
- "9092:9092" # Kafka 内部通信端口(集群内部使用)
- "29092:29092" # Kafka 外部访问端口(宿主机访问)
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,PLAINTEXT_HOST://0.0.0.0:29092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

Kafka 服务

  • ports: 9092:9092 让容器内部服务可以访问 Kafka; 29092:29092 让宿主机可以访问 Kafka

  • 使用 confluentinc/cp-kafka 镜像,并设置依赖关系,确保在 Zookeeper 启动后再启动 Kafka

  • KAFKA_LISTENERS: 定义了 Kafka 监听的地址, PLAINTEXT://0.0.0.0:9092 允许 Kafka 在容器内部通过 kafka:9092 访问。PLAINTEXT_HOST://0.0.0.0:29092 让宿主机通过 localhost:29092 访问。

  • KAFKA_ZOOKEEPER_CONNECT 指定 Kafka 连接 Zookeeper 的地址。

  • KAFKA_ADVERTISED_LISTENERS 配置了 Kafka 向客户端暴露的地址,这里配置了内部和外部(localhost)的访问方式。PLAINTEXT://kafka:9092Docker 内部容器访问。PLAINTEXT_HOST://localhost:29092 供宿主机访问。

  • KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR 设置为 1,适合单节点测试环境。

Zookeeper 服务

  • 使用 confluentinc/cp-zookeeper 镜像,监听本地的 2181 端口。

四、启动


docker-compose.yml 文件所在目录下,执行以下命令启动服务:

docker-compose up -d

此命令会以后台模式启动 ZookeeperKafka 容器。

五、验证


执行 docker ps 查看 KafkaZookeeper 是否正常运行。

六、内部访问 Kafka 服务


一、进入 Kafka 容器: 通过 docker exec -it kafka bash 进入 Docker 容器

docker exec -it kafka bash

二、测试 Kafka 服务

// 1. 创建主题 test-topic 主题
kafka-topics --create --topic test-topic --bootstrap-server localhost:29092 --partitions 3 --replication-factor 1

// 2. 生产者发送消息,并输入 Hello Kafka ,按 control + c 退出
kafka-console-producer --topic test-topic --bootstrap-server localhost:29092

// 3. 消费者消费消息
kafka-console-consumer --topic test-topic --from-beginning --bootstrap-server localhost:29092

七、外部访问 Kafka 服务


一、宿主机安装 Kafka: Kafka 可以通过 Homebrew 直接安装

brew update
brew install kafka

二、添加 Kafka 变量: 在 Mac 上使用 brew install kafka 安装 Kafka 后,默认情况下,Kafka 的命令行工具(如 kafka-topics, kafka-console-producer 等)不会自动添加到环境变量 PATH 中。

// 1. 查看 kafka 安装路径 
brew info kafka

// 2. 将 Kafka 的 bin 目录加入 PATH 环境变量
echo 'export PATH="/opt/homebrew/Cellar/kafka/3.9.0/bin/$PATH"' >> ~/.zshrc
source ~/.zshrc

// 3. 测试 Kafka 命令是否成功
kafka-topics --version

三、测试 Kafka 服务

// 1. 创建主题 test-topic 主题
kafka-topics --create --topic test-topic --bootstrap-server localhost:29092 --partitions 3 --replication-factor 1

// 2. 生产者发送消息,并输入 Hello Kafka ,按 control + c 退出
kafka-console-producer --topic test-topic --bootstrap-server localhost:29092

// 3. 消费者消费消息
kafka-console-consumer --topic test-topic --from-beginning --bootstrap-server localhost:29092