使JMX与spotify / kafka Docker镜像一起使用

时间:2017-01-15 06:31:35

标签: docker apache-kafka docker-compose jmx

我正在尝试让JMX使用spotify/kafka Docker镜像。

我有一个docker-compose.yml

version: '2'
services:
  my-kafka:
    image: spotify/kafka # Using this instead of wurstmeister's because it didn't work with /var/run/docker.sock on Windows while this one has integrated ZK and works
    hostname: my-kafka
    restart: unless-stopped
    ports:
      - "9092:9092" # Kafka
      - "2181:2181" # Zookeeper
      - "7203:7203" # JMX
    environment:
      KAFKA_ADVERTISED_HOST_NAME: my-kafka
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_OPTS: "-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.rmi.port=7203 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=my-kafka"

然后我尝试使用jconsole my-kafka:7203测试它并在JRMP连接建立期间获得“连接失败:错误”;嵌套异常是:java.io.EOFException。'立即。相比之下,使用不存在的主机会导致“未知主机”和“拒绝连接”的不同端口。

docker ps显示:

692eb6659aba        spotify/kafka                 "supervisord -n"         10 minutes ago      Up 10 minutes               0.0.0.0:2181->2181/tcp, 0.0.0.0:7203->7203/tcp, 0.0.0.0:9092->9092/tcp                       docker_my-kafka_1
容器中的

ps aux显示:

root        11  1.8  3.3 5718844 274608 ?      Sl   06:16   0:12 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -Xmx1G -Xms1G -server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+DisableExplicitGC -Djava.awt.headless=true -Xloggc:/opt/kafka_2.11-0.10.1.0/bin/../logs/kafkaServer-gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false ...offtopic skipped... -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.rmi.port=7203 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=my-kafka kafka.Kafka /opt/kafka_2.11-0.10.1.0/config/server.properties

容器日志很无聊甚至没有提到JMX,以“kafka进入RUNNING状态,进程已经停留超过1秒(startsecs)”结束。

有一个相关的问题kafka monitoring using JMX when running kafka in docker in boot2docker,但我更愿意坚持spotify/kafka以便ZK&卡夫卡住在同一个容器里。

4 个答案:

答案 0 :(得分:0)

您可以尝试在属性中指定主机地址(运行docker run的位置):

-Djava.rmi.server.hostname=xx.xx.xx.xx

答案 1 :(得分:0)

jmx选项已存在于/opt/kafka_2.11-0.10.1.0/bin/kafka-run-class.sh泊坞窗图像的起始脚本spotify/kafka中。 你可以从容器内部grep它们

grep jmx /opt/kafka_2.11-0.10.1.0/bin/kafka-run-class.sh

并且您在容器内的jvm进程的java选项的开头看到它们

ps -ef java

因此,您可以在JMX_PORT中设置docker-compose.yml环境变量并删除其他(重复)KAFKA_OPTS

version: '2'
services:
  my-kafka:
    image: spotify/kafka # Using this instead of wurstmeister's because it didn't work with /var/run/docker.sock on Windows while this one has integrated ZK and works
    hostname: my-kafka
    restart: unless-stopped
    ports:
      - "9092:9092" # Kafka
      - "2181:2181" # Zookeeper
      - "7203:7203" # JMX
    environment:
      KAFKA_ADVERTISED_HOST_NAME: my-kafka
      KAFKA_ADVERTISED_PORT: 9092
      JMX_PORT: 7203

然后在启动新容器并在主机中解析my-kafka后,jconsole my-kafka:7203将连接到容器的jmx端口。

答案 2 :(得分:0)

Docker容器在您计算机内的IP集上运行。要查看这些内容,请运行:

docker inspect docker_my-kafka_1

这将输出机器正在处理的IP,如:

"IPAddress": "172.17.0.2",

您需要将上面找到的Ip添加到:

-Djava.rmi.server.hostname=$INSERT_IP_HERE

答案 3 :(得分:0)

因为您更喜欢使用ZK和ZK的解决方案。 Kafka住在同一个容器中,看看https://github.com/Landoop/fast-data-dev

这个docker专注于提供优秀的Kafka Development Environment,因此它会暴露所有JMX