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

时间:2017-08-14 19:57:28

标签: docker osgi apache-karaf karaf

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

我做了什么:

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

1 个答案:

答案 0 :(得分:1)

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

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

假设您使用上面的端口,然后连接到

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

现在应该有效。

我从来没有让Karaf的JMX加速控制工作。

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