Skip to content

colovu/docker-kafka

Repository files navigation

Kafka

针对 Kafka 应用的 Docker 镜像,用于提供 Kafka 服务。

详细信息可参照:官方文档

logo

版本信息

  • 2.6(Scala 2.13)、latest
  • 2.5(Scala 2.12)
  • 2.4(Scala 2.12)
  • 2.3(Scala 2.12)

镜像信息

  • 镜像地址:
    • Aliyun仓库:registry.cn-shenzhen.aliyuncs.com/colovu/kafka:latest
    • DockerHub:colovu/kafka:latest
    • 依赖镜像:colovu/openjre:8

后续相关命令行默认使用[Docker Hub](https://hub.docker.com)镜像服务器做说明

TL;DR

Docker 快速启动命令:

$ docker run -d colovu/kafka:latest

Docker-Compose 快速启动命令:

# 从 Gitee 下载 Compose 文件
$ curl -sSL -o https://gitee.com/colovu/docker-kafka/raw/master/docker-compose.yml

# 从 Github 下载 Compose 文件
$ curl -sSL -o https://raw.githubusercontent.com/colovu/docker-kafka/master/docker-compose.yml

# 创建并启动容器
$ docker-compose up -d

默认对外声明

端口

  • 9092:Kafka 业务客户端访问端口

数据卷

镜像默认提供以下数据卷定义,默认数据分别存储在自动生成的应用名对应kafka子目录中:

/var/log                # 日志输出,应用日志输出,非数据日志输出
/srv/conf               # 配置文件
/srv/cert               # 证书文件目录
/srv/datalog            # 数据操作日志文件

如果需要持久化存储相应数据,需要在宿主机建立本地目录,并在使用镜像初始化容器时进行映射。宿主机相关的目录中如果不存在对应应用 Kafka 的子目录或相应数据文件,则容器会在初始化时创建相应目录及文件。

容器配置

在初始化 Kafka 容器时,如果配置文件不存在,可以在命令行中使用相应参数对默认参数进行修改。类似命令如下:

$ docker run -d -e "KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181" --name kafka1 colovu/kafka:latest

常规配置参数

常使用的环境变量主要包括:

  • KAFKA_ZOOKEEPER_CONNECT:默认值:localhost:2181。设置 Zookeeper 链接地址。可以为多个 Zookeeper 服务器地址,使用逗号分隔

  • KAFKA_ZOOKEEPER_USER:默认值:。设置 Zookeeper 链接用户名,根据实际情况设置

  • KAFKA_ZOOKEEPER_PASSWORD:默认值:。设置 Zookeeper 链接用户密码,根据实际情况设置

  • KAFKA_ZOOKEEPER_CONNECTION_TIMEOUT_MS:默认值:6000。设置 Zookeeper 链接超时时间

  • KAFKA_LISTENERS:默认值:INTERNAL://:9092。设置默认的监听器

  • KAFKA_ADVERTISED_LISTENERS:默认值:INTERNAL://:9092。设置发布 Broker 信息至 Zookeeper 的监听器

  • KAFKA_LISTENER_SECURITY_PROTOCOL_MAP:默认值:INTERNAL:PLAINTEXT,CLIENT:PLAINTEXT。设置监听器加密方式。

以 Key/Value 形式配置的:

  • Key 为 Listener 的名称
  • Value 取值范围为:PLAINTEXT、SSL、SASL_PLAINTEXT、SASL_SSL
  • KAFKA_AUTO_CREATE_TOPICS_ENABLE:默认值:true。设置是否自动创建 Topics
  • ALLOW_PLAINTEXT_LISTENER:默认值:no。设置是否允许匿名登录
  • KAFKA_CLIENT_USER:默认值:colovu。设置客户端访问用户名
  • KAFKA_CLIENT_PASSWORD:默认值:pas4colovu。设置客户端访问用户密码
  • KAFKA_INTER_BROKER_USER:默认值:colovu。设置内部 broker 访问用户名
  • KAFKA_INTER_BROKER_PASSWORD:默认值:pas4colovu。设置内部 broker 访问用户密码
  • ENV_DEBUG:默认值:false。设置是否输出容器调试信息。可设置为:1、true、yes

可选配置参数

如果没有必要,可选配置参数可以不用定义,直接使用对应的默认值,主要包括:

  • KAFKA_PORT:默认值:9092。设置服务默认的客户端访问端口
  • KAFKA_SOCKET_SEND_BUFFER_BYTES:默认值:102400。设置 Socket 发送缓存大小
  • KAFKA_SOCKET_RECEIVE_BUFFER_BYTES:默认值:102400。设置 Socket 接收缓存大小
  • KAFKA_SOCKET_REQUEST_MAX_BYTES:默认值:104857600。设置 Socket 请求的最大字节数
  • KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR:默认值:1
  • KAFKA_TRANSACTION_STATE_LOG_MIN_ISR:默认值:1
  • KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR:默认值:1
  • KAFKA_NUM_PARTITIONS:默认值:1
  • KAFKA_NUM_RECOVERY_THREADS_PER_DATA_DIR:默认值:1
  • KAFKA_NUM_NETWORK_THREADS:默认值:3
  • KAFKA_NUM_IO_THREADS:默认值:8
  • KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS:默认值:0
  • KAFKA_LOG_DIRS:默认值:/srv/datalog/kafka。设置数据日志输出目录
  • KAFKA_LOG_SEGMENT_BYTES:默认值:1073741824
  • KAFKA_LOG_FLUSH_INTERVAL_MESSAGES:默认值:10000
  • KAFKA_LOG_FLUSH_INTERVAL_MS:默认值:1000
  • KAFKA_LOG_RETENTION_HOURS:默认值:168
  • KAFKA_LOG_RETENTION_BYTES:默认值:1073741824
  • KAFKA_LOG_RETENTION_CHECK_INTERVALS_MS:默认值:300000
  • JVMFLAGS:默认值:。设置服务默认的 JVMFLAGS
  • HEAP_SIZE:默认值:1024。设置以 MB 为单位的 Java Heap 参数(Xmx 与 Xms)。如果在 JVMFLAGS 中已经设置了 Xmx 与 Xms,则当前设置会被忽略。

集群配置参数

使用 Kafka 镜像,可以很容易的建立一个 Kafka 集群。针对 集群模式,有以下参数可以配置:

  • KAFKA_BROKER_ID:默认值:1。介于1~255之间的唯一值,用于标识服务器ID
  • KAFKA_BROKER_ID_COMMAND:默认值:。用于生成ID的命令。

KAFKA_BROKER_ID_COMMAND: "hostname | awk -F'-' '{print $$2}'"

在未定义 Broker ID 时,会自动生成一个 ID 供容器使用,详细参见文档。当使用这种方式时,可以支持容器的扩容或缩容。使用时,建议同时使用 Docker Compose的 --no-recreate 参数,保证容器的 ID 及容器名不会重复创建。

TLS配置参数

使用证书加密传输时,相关配置参数如下:

  • KAFKA_KEYSTORE_FILE:默认值:kafka.keystore.jks。证书文件名,默认存放在容器中的/srv/cert/kafka目录
  • KAFKA_TRUSTSTORE_FILE:默认值:kafka.truststore.jks。证书文件名,默认存放在容器中的/srv/cert/kafka目录
  • KAFKA_CERTIFICATE_PASSWORD:默认值:。证书秘钥。

安全

用户及密码

Kafka 镜像默认禁用了无密码访问功能,在实际生产环境中建议使用用户名及密码控制访问;如果为了测试需要,可以使用以下环境变量启用无密码访问功能:

ALLOW_PLAINTEXT_LISTENER=yes

如果需要配置访问认证,需要配置相应的监听器参数,相关监听器主要有:

  • INTERNAL: 用于 broker 内通讯
  • CLIENT: 用于与在同一网络中的 消费者/生产者 通讯
  • (optional) EXTERNAL: 用于与在不同网络中的 消费者/生产者 通讯

以下为一个客户端访问使用SASL_SSL方式,Broker 访问使用SSL方式,相应的配置参数:

KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:SSL,CLIENT:SASL_SSL
KAFKA_LISTENERS=INTERNAL://:9093,CLIENT://:9092
KAFKA_ADVERTISED_LISTENERS=INTERNAL://:9093,CLIENT://kafka:9092
KAFKA_CLIENT_USER=user
KAFKA_CLIENT_PASSWORD=password

在上述配置中,必须使用相应的证书文件。相应的证书文件需要放在/srv/cert/kafka目录中(或主机映射数据卷时使用的目录中)。如果证书使用了密码保护,需要同时使用以下环境变量指定对应的密码:

KAFKA_CERTIFICATE_PASSWORD=myCertificatePassword

以下脚本可用于生成JKS证书文件:

建议:

  • 在使用密码时,建议相关证书都使用同一个密码。
  • 将 CommonName 或 FQDN 设置为容器的 host那么,如: kafka.example.com。这样,在后续针对问题 "What is your first and last name?",可以输入同样的名字。
  • 在配置集群时,如果需要每个 Broker 使用不同的证书,需要重复相应的步骤,以生成不同的证书。

针对如何使用 JKS 证书(同时使用了 certificatePassword123密码保护)配置容器,以及如何配置容器 hostname ,举例如下:

version: '3.6'

services:
  zookeeper:
    image: 'colovu/zookeeper:latest'
    ports:
     - '2181:2181'
    environment:
      - ZOO_ENABLE_AUTH=yes
      - ZOO_SERVER_USERS=kafka
      - ZOO_SERVER_PASSWORDS=kafka_password
  kafka:
    image: 'colovu/kafka:latest'
    hostname: kafka.example.com
    ports:
      - '9092'
    environment:
      - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:SSL,CLIENT:SASL_SSL
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
      - KAFKA_LISTENERS=INTERNAL://:9093,CLIENT://:9092
      - KAFKA_ADVERTISED_LISTENERS=INTERNAL://kafka.example.com:9093,CLIENT://kafka.example.com:9092
      - KAFKA_ZOOKEEPER_USER=kafka
      - KAFKA_ZOOKEEPER_PASSWORD=kafka_password
      - KAFKA_CLIENT_USER=user
      - KAFKA_CLIENT_PASSWORD=password
      - KAFKA_CERTIFICATE_PASSWORD=certificatePassword123
    volumes:
      - './kafka.keystore.jks:/srv/cert/kafka/kafka.keystore.jks:ro'
      - './kafka.truststore.jks:/srv/cert/kafka/kafka.truststore.jks:ro'

生产者与消费者在访问客户端使用数据时,需要同样提供对应的用户名及密码。

生产者使用加密方式访问时,在容器中执行如下命令:

export KAFKA_OPTS="-Djava.security.auth.login.config=/srv/conf/kafka/kafka_jaas.conf"
kafka-console-producer.sh --broker-list 127.0.0.1:9092 --topic test --producer.config /srv/conf/kafka/producer.properties

消费者使用加密方式访问时,在容器中执行如下命令:

export KAFKA_OPTS="-Djava.security.auth.login.config=/srv/conf/kafka/kafka_jaas.conf"
kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic test --consumer.config /srv/conf/kafka/consumer.properties

Kafka 的内部 Broker 访问配置

在内部 Broker 之间的通讯启用 SASLSASL_SSL认证时,可以使用以下参数配置:

  • KAFKA_INTER_BROKER_USER: 内部 Broker 访问用户名
  • KAFKA_INTER_BROKER_PASSWORD: 内部 Broker 访问用户密码

Kafka 的客户端访问配置

在与客户端的通讯启用 SASLSASL_SSL认证时,可以使用以下参数配置:

  • KAFKA_CLIENT_USER: 客户端访问用户名
  • KAFKA_CLIENT_PASSWORD: 客户端访问用户密码

Kafka 的 Zookeeper 访问配置

在 Zookeeper 服务启用用户认证时,可以使用以下参数配置:

  • KAFKA_ZOOKEEPER_USER: Kafka 用于访问 Zookeeper 的用户名
  • KAFKA_ZOOKEEPER_PASSWORD: Kafka 用于访问 Zookeeper 的用户密码

容器安全

本容器默认使用non-root运行应用,以加强容器的安全性。在使用non-root用户运行容器时,相关的资源访问会受限;应用仅能操作镜像创建时指定的路径及数据。使用non-root方式的容器,更适合在生产环境中使用。

如果需要切换为root方式运行应用,可以在启动命令中增加-u root以指定运行的用户。

注意事项

  • 容器中应用的启动参数不能配置为后台运行,如果应用使用后台方式运行,则容器的启动命令会在运行后自动退出,从而导致容器退出

更新记录

2021/7/20:

  • 增加 2.6.2、latest
  • 更改使用 2.5.1 版本

2020/12/20:

  • 2.5.0
  • 2.4.1
  • 2.3.1

本文原始来源 Endial Fang @ Github.com