如何在Docker容器中configurationkarf的jmx端口?

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

我做了什么:

  1. 为docker揭露44444和1099
  2. 在org.apache.karaf.management.cfg中,试图用docker container ip和docker inner ip的不同组合来设置rmiRegistryHost和rmiServerHost几次。
  3. 尝试更改EXTRA_JAVA_OPTS =“ – Djava.rmi.server.hostname = $ {docker-container-ip} -Dcom.sun.management.jmxremote.local.only = false”

需要帮忙。

问题是RMI协议,在提供RMI端点的主机(Docker主机)不是RMI服务器(Docker容器中的VM)的主机的情况下,并不能很好地处理这种情况。

我得到它的工作方式是

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来设置环境,但只要在主机上只运行一个包含图像的容器,就可以用固定值replace环境variables。 我使用1097和1098分别为RMI和REMOTE端口。 这里有两件事很重要:

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

假设你正在使用上面的端口,然后连接到

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

应该现在工作。

我从来没有得到卡拉夫的JMX accecss控制工作。

使用JMXMP而不是RMI for JMX可能会使事情变得简单,但是Karaf并不支持它。