如何在 docker 容器中为 karaf 配置 jmx 端口?

How to configure jmx port for karaf in docker container?

我想使用 visualvm 检查 docker 容器中的 karaf 中的线程 运行。

我做了什么:

  1. 为 docker
  2. 公开 44444 和 1099
  3. 在 org.apache.karaf.management.cfg 中,尝试设置 rmiRegistryHost 和 rmiServerHost 多次与 docker 的不同组合 容器 ip 和 docker 内部 ip 不起作用。
  4. 尝试更改 EXTRA_JAVA_OPTS="-Djava.rmi.server.hostname=${docker-container-ip} -Dcom.sun.management.jmxremote.local.only=false"

需要帮助。

问题出在 RMI 协议上,它不能很好地处理提供 RMI 端点的主机(Docker 主机)不是 RMI 服务器主机(您 Docker容器)。

我让它工作的方法是

export EXTRA_JAVA_OPTS=="-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.rmi.port=$JMX_RMI_PORT -Dcom.sun.management.jmxremote.port=$JMX_REMOTE_PORT -Djava.rmi.server.hostname=$HOST_HOSTNAME"

我用docker-compose 设置了环境,但是你可以用固定值替换环境变量,只要你运行 你的主机上只有一个容器和镜像。我分别为 RMI 和 REMOTE 端口使用 1097 和 1098。这里有两点很重要:

  • RMI 和 REMOTE 端口都必须映射到同一端口号上的 docker 主机。例如。如果您使用 1097 作为容器中的 RMI 端口,则必须将该端口发布到主机上的 1097。
  • java.rmi.server.hostname 是您的 docker 主机的主机名或 IP,而不是容器的 IP

假设您正在使用上述端口,然后连接到

service:jmx:rmi:///jndi/rmi://<your_docker_host>:1098/jmxrmi

现在应该可以工作了。

虽然我从来没有让 Karaf 的 JMX 访问控制工作。

为 JMX 使用 JMXMP 而不是 RMI 可能会使事情变得更容易,但 Karaf 不支持开箱即用。