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 镜像,适用于 不同场景 等不同场景:
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务