如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
Dockerfile for Apache Kafka
该镜像可直接从https://hub.docker.com/r/wurstmeister/kafka/%E8%8E%B7%E5%8F%96%E3%80%82
本镜像及Dockerfile基于wurstmeister/kafka,但使用openjdk:8-jre镜像作为基础,而非alpine-openjdk镜像。Alpine使用musl库,而在musl环境下的OpenJDK在许多场景下的支持度不如glibc环境下的OpenJDK。
docker-compose.yml中的KAFKA_ADVERTISED_HOST_NAME以匹配Docker主机IP(注意:如果要运行多个broker,不要使用localhost或127.0.0.1作为主机IP)docker-compose.yml中添加环境变量,例如,要增加message.max.bytes参数,可设置环境变量KAFKA_MESSAGE_MAX_BYTES: 2000000。要关闭自动主题创建,设置KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'false'LOG4J_的环境变量来自定义,这些变量将映射到log4j.properties。例如:LOG4J_LOGGER_KAFKA_AUTHORIZER_LOGGER=DEBUG, authorizerAppender启动集群:
bashdocker-compose up -d
添加更多broker:
bashdocker-compose scale kafka=3
销毁集群:
bashdocker-compose stop
默认的docker-compose.yml应被视为起点。默认情况下,每个broker在重启时会获得新的端口号和broker id。根据使用场景,这可能不是理想的。如果需要使用特定的端口和broker id,请相应修改docker-compose配置,例如https://github.com/wurstmeister/kafka-docker/blob/master/docker-compose-single-broker.yml%EF%BC%9A
bashdocker-compose -f docker-compose-single-broker.yml up
您可以通过以下方式配置broker id:
KAFKA_BROKER_IDBROKER_ID_COMMAND,例如BROKER_ID_COMMAND: "hostname | awk -F'-' '{print $2}'"如果未在docker-compose文件中指定broker id,它将自动生成(参见[***]
如果希望kafka-docker在创建过程中自动在Kafka中创建主题,可以在docker-compose.yml中添加KAFKA_CREATE_TOPICS环境变量。
以下是docker-compose.yml中的示例片段:
yamlenvironment: KAFKA_CREATE_TOPICS: "Topic1:1:3,Topic2:1:1:compact"
Topic1将有1个分区和3个副本,Topic2将有1个分区、1个副本,且cleanup.policy设置为compact。
您可以通过以下方式配置advertised hostname:
KAFKA_ADVERTISED_HOST_NAMEHOSTNAME_COMMAND,例如HOSTNAME_COMMAND: "route -n | awk '/UG[ \t]/{print $2}'"使用命令时,请确保查看[***]
如果指定了KAFKA_ADVERTISED_HOST_NAME,它将优先于HOSTNAME_COMMAND。
对于AWS部署,可以使用元数据服务获取容器主机的IP:
HOSTNAME_COMMAND=wget -t3 -T2 -qO- http://169.254.169.254/latest/meta-data/local-ipv4
参考:[***]
您可以通过以下方式配置broker rack亲和性:
KAFKA_BROKER_RACKRACK_COMMAND,例如RACK_COMMAND: "curl http://169.254.169.254/latest/meta-data/placement/availability-zone"在上述示例中,使用AWS元数据服务将实例的可用区放入broker.rack属性。
出于监控目的,您可能希望配置JMX。除了标准JMX参数外,底层用于连接的RMI协议可能会出现问题:
例如,要连接到本地运行的kafka(假设暴露端口1099):
yamlKAFKA_JMX_OPTS: "-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.rmi.port=1099" JMX_PORT: 1099
现在Jconsole可以通过jconsole 192.168.99.100:1099连接。
较新版本的Kafka已弃用advertised.host.name和advertised.port,转而支持更灵活的监听器配置,支持使用相同或不同协议的多个监听器。本镜像支持最多三个监听器的自动配置,如下所示。
注意:如果未使用以下监听器配置,“advertised.host.name”和“advertised.port”的旧有约定仍然有效。
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP配置INSIDE、OUTSIDE,以及可选的BROKER协议。这些名称是任意的,但为了一致性和清晰度而使用。
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:SSL,BROKER:PLAINTEXT配置了三个监听器名称,但只有名为OUTSIDE的监听器使用SSL。注意此示例不涉及在broker上配置SSL的额外步骤。KAFKA_ADVERTISED_PROTOCOL_NAME设置协议映射中用于“advertised.listeners”属性的名称。在此示例中为“OUTSIDE”。KAFKA_PROTOCOL_NAME设置协议映射中用于“listeners”属性的名称。在此示例中为“INSIDE”。KAFKA_INTER_BROKER_LISTENER_NAME设置协议映射中用于“inter.broker.listener.name”的名称。如果未提供,默认为KAFKA_PROTOCOL_NAME。在此示例中为“BROKER”。KAFKA_ADVERTISED_PORT和KAFKA_ADVERTISED_HOST_NAME(或HOSTNAME_COMMAND选项)设置用于advertised.listeners列表的名称和端口。KAFKA_PORT和KAFKA_HOST_NAME(可选)设置用于listeners列表的名称(可选)和端口。如果未定义KAFKA_HOST_NAME,将使用Kafka合理的默认行为,这已足够。注意KAFKA_PORT默认为“9092”(如果未定义)。KAFKA_INTER_BROKER_LISTENER_PORT设置用于broker间监听器的advertised.listeners和listeners中的端口号。此监听器的主机名不可配置,使用Kafka合理的默认行为。给定以下环境,将向Kafka broker属性写入以下配置:
HOSTNAME_COMMAND: curl http://169.254.169.254/latest/meta-data/public-hostname KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT KAFKA_ADVERTISED_PROTOCOL_NAME: OUTSIDE KAFKA_PROTOCOL_NAME: INSIDE KAFKA_ADVERTISED_PORT: 9094
生成的配置:
advertised.listeners = OUTSIDE://ec2-xx-xx-xxx-x.us-west-2.compute.amazonaws.com:9094,INSIDE://:9092 listeners = OUTSIDE://:9094,INSIDE://:9092 inter.broker.listener.name = INSIDE
在使用覆盖网络的Docker Swarm中部署Kafka时,上述监听器配置是必要的。通过分离OUTSIDE和INSIDE监听器,主机可以与覆盖网络外部的客户端通信,同时仍能从 swarm 内部受益于覆盖网络。
除多监听器配置外,在Docker Swarm中运行Kafka的其他最佳实践包括:
yamlports: - target: 9094 published: 9094 protocol: tcp mode: host
使用短版本端口映射的旧compose文件可能会遇到Kafka客户端问题,如果无法保证其与单个broker的连接。
参见包含的示例compose文件docker-compose-swarm.yml
http://wurstmeister.github.io/kafka-docker/
以下是 openshine/kafka 相关的常用 Docker 镜像,适用于 不同场景 等不同场景:
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务