
如果你使用 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 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
本仓库包含构建在容器中运行Kafka的http://www.docker.io镜像的构建定义和支持文件。它作为自动化构建发布在[Docker Hub]上,镜像名为ches/kafka。
此构建旨在提供一个适合在生产Docker环境中使用的、便于运维的Kafka部署:
如果您发现构建在可操作性方面存在任何不足,欢迎通过GitHub issues提交拉取请求或反馈。
以下是运行Kafka broker服务的最小配置示例,然后使用容器作为客户端运行Kafka快速入门中的基本生产者和消费者示例:
bash# 非默认桥接网络支持便捷的名称到主机名发现 $ docker network create kafka-net $ docker run -d --name zookeeper --network kafka-net zookeeper:3.4 $ docker run -d --name kafka --network kafka-net --env ZOOKEEPER_IP=zookeeper ches/kafka $ docker run --rm --network kafka-net ches/kafka \ kafka-topics.sh --create --topic test --replication-factor 1 --partitions 1 --zookeeper zookeeper:2181 Created topic "test". # 在单独的终端中: $ docker run --rm --interactive --network kafka-net ches/kafka \ kafka-console-producer.sh --topic test --broker-list kafka:9092 <输入一些消息并按回车> $ docker run --rm --network kafka-net ches/kafka \ kafka-console-consumer.sh --topic test --from-beginning --bootstrap-server kafka:9092
容器公开两个您可能希望绑定挂载的卷,或使用--volumes-from在其他地方处理:
/data:Kafka数据存储路径(对应Kafka配置中的log.dirs)/logs:Kafka日志(INFO级别)通过log4j写入的路径容器发布两个端口:
9092:Kafka标准broker通信端口7203:JMX发布端口,用于jconsole或VisualVM连接Kafka需要Apache ZooKeeper。如上面的示例所示,您可以通过链接另一个在标准端口2181上公开ZooKeeper的容器来满足依赖,确保使用别名zookeeper进行链接。
或者,您可以配置Kafka查找ZK的特定地址。请参见下面的配置部分。
此示例显示更多配置选项,假设您希望运行一个将Kafka端口直接映射到本地主机的开发环境,例如,如果您正在编写生产者或消费者,并希望在迭代时避免为其重建容器。这要求本地主机是您的Docker主机,即工作站运行Linux。如果使用boot2docker等工具,请替换下面的boot2docker ip值。
bash$ mkdir -p kafka-ex/{data,logs} && cd kafka-ex $ docker run -d --name zookeeper --publish 2181:2181 zookeeper:3.4 $ docker run -d \ --hostname localhost \ --name kafka \ --volume ./data:/data --volume ./logs:/logs \ --publish 9092:9092 --publish 7203:7203 \ --env KAFKA_ADVERTISED_HOST_NAME=127.0.0.1 --env ZOOKEEPER_IP=127.0.0.1 \ ches/kafka
运行容器时,可通过环境变量(docker run -e VAR=value)设置Kafka配置的一些参数。以下是这些参数及其默认值(如有):
KAFKA_BROKER_ID=0
对应Kafka的broker.id设置。集群中每个broker必须是唯一的整数。
KAFKA_PORT=9092
对应Kafka的port设置。broker服务监听的端口。如果更改此端口,需要显式发布容器实例的新端口。
KAFKA_ADVERTISED_HOST_NAME=<容器在docker0子网中的IP>
对应Kafka的advertised.host.name设置。Kafka broker通过 gossip 协议传播集群中的broker列表,以减轻生产者对ZooKeeper库的依赖。此设置应反映生产者可在网络上访问broker的地址,即如果构建由多个物理Docker主机组成的集群,需要将此设置为Docker主机转发容器KAFKA_PORT的接口主机名。
KAFKA_ADVERTISED_PORT=9092
如上,用于 advertised 地址的端口部分。对应Kafka的advertised.port设置。如果在单个Docker主机上运行多个broker容器且需要外部可访问,应将此设置为Docker主机上转发的端口。
KAFKA_DEFAULT_REPLICATION_FACTOR=1
对应Kafka的default.replication.factor设置。自动创建主题的默认副本因子。
KAFKA_NUM_PARTITIONS=1
对应Kafka的num.partitions设置。每个主题的默认日志分区数。
KAFKA_AUTO_CREATE_TOPICS_ENABLE=true
对应Kafka的auto.create.topics.enable设置。
KAFKA_INTER_BROKER_PROTOCOL_VERSION
对应Kafka的inter.broker.protocol.version设置。如果集群中运行不同Kafka版本的broker,确保它们使用相同的协议版本通信。
KAFKA_LOG_MESSAGE_FORMAT_VERSION
对应Kafka的log.message.format.version设置。指定集群与消费者通信的协议版本。
KAFKA_LOG_RETENTION_HOURS=168
对应Kafka的log.retention.hours设置。日志文件保留小时数,超过后删除。
KAFKA_MESSAGE_MAX_BYTES
对应Kafka的message.max.bytes设置。服务器可接收的最大消息大小。默认值:***
KAFKA_REPLICA_FETCH_MAX_BYTES
对应Kafka的replica.fetch.max.bytes设置。尝试为每个分区获取的消息字节数。这不是绝对最大值,如果获取的第一个非空分区中的第一条消息大于此值,仍会返回该消息以确保进度。代理接受的最大消息大小通过message.max.bytes(代理配置)或max.message.bytes(主题配置)定义。默认值:***
JAVA_RMI_SERVER_HOSTNAME=$KAFKA_ADVERTISED_HOST_NAME
对应java.rmi.server.hostname JVM属性,用于绑定接受远程JMX连接的接口。与KAFKA_ADVERTISED_HOST_NAME类似,如果希望从Docker外部连接JMX客户端,可能需要将此设置为Docker主机的可访问地址。
ZOOKEEPER_IP=<如果有链接的"zookeeper"容器,则从中获取>
如果没有使用别名"zookeeper"链接并发布2181端口的容器,或未使用ZOOKEEPER_CONNECTION_STRING,则必需设置。用于构建Kafka的zookeeper.connect设置。
ZOOKEEPER_PORT=2181
用于构建Kafka的zookeeper.connect设置。
ZOOKEEPER_CONNECTION_STRING=<逗号分隔的host:port对字符串>
设置连接ZooKeeper集群的host:port对字符串。此设置覆盖ZOOKEEPER_IP和ZOOKEEPER_PORT。
ZOOKEEPER_CHROOT,例如:/v0_8_1
用于构建Kafka的zookeeper.connect设置的ZooKeeper根路径。默认为空,意味着Kafka将使用ZK的/。如果ZK实例/集群由其他服务共享,或为适应更改模式的Kafka升级,应设置此值。从Kafka 0.8.2开始,它将自动在ZK中创建路径;早期版本中,必须在启动broker前确保路径已创建。
远程JMX访问的设置可能有些麻烦。此容器的启动脚本尝试使其尽可能简单,但重要的是要理解,如果要从其他Docker容器外部(例如开发中的主机OS)连接VisualVM等客户端,则需要将RMI配置为Docker主机IP或主机名。如果已设置KAFKA_ADVERTISED_HOST_NAME,将使用该值,这可能正是您需要的。如果未设置(仅使用其他容器与Kafka broker通信)或因某些原因需要覆盖,可设置JAVA_RMI_SERVER_HOSTNAME。
例如,在实践中,如果Docker主机是Docker Machine运行的VirtualBox,如下run命令应允许从主机OS连接VisualVM到$(docker-machine ip docker-vm):7203:
bash$ docker run -d --name kafka -p 7203:7203 \ --link zookeeper:zookeeper \ --env JAVA_RMI_SERVER_HOSTNAME=$(docker-machine ip docker-vm) \ ches/kafka
注意,端口也很关键——如果容器内和主机上不使用相同的端口号,可能无法工作(欢迎提供解决方法建议)。
最后,请注意,默认情况下远程JMX关闭了认证和SSL(这些设置来自Kafka自己的默认启动脚本)。如果在生产环境中从Docker主机暴露JMX主机名/端口,应确保通过防火墙规则等适当锁定访问。Docker环境中更建议的设置是在另一个容器中运行指标收集器,并将其链接到Kafka容器。
如果需要更细粒度的配置,可以通过设置KAFKA_JMX_OPTS完全控制相关Java系统属性——参见start.sh。
此镜像/仓库最初从https://github.com/relateiq/docker-kafka分叉。我分叉的最初动机是:
在 upstream 对拉取请求无响应且我的仓库在Docker Hub上的下载量显著增加后,我进行了进一步更新和更改,并期望从此独立维护。本项目的变更日志文件详细描述了这些内容。
以下是 ches/kafka 相关的常用 Docker 镜像,适用于 不同场景 等不同场景:
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务