【问题标题】:How to configure jmx port for karaf in docker container?如何在 docker 容器中为 karaf 配置 jmx 端口?
【发布时间】:2017-08-14 19:57:28
【问题描述】:
我想使用 visualvm 来检查在 docker 容器中的 karaf 中运行的线程。
我做了什么:
- 为 docker 公开 44444 和 1099
- 在 org.apache.karaf.management.cfg 中,尝试设置 rmiRegistryHost 和
rmiServerHost 多次与 docker 的不同组合
容器 ip 和 docker 内部 ip 不起作用。
- 尝试更改 EXTRA_JAVA_OPTS="-Djava.rmi.server.hostname=${docker-container-ip} -Dcom.sun.management.jmxremote.local.only=false"
需要帮助。
【问题讨论】:
标签:
docker
osgi
apache-karaf
karaf
【解决方案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 是您的 docker 主机的主机名或 IP,而不是容器的 IP
假设你正在使用上面的端口,然后连接到
service:jmx:rmi:///jndi/rmi://<your_docker_host>:1098/jmxrmi
现在应该可以工作了。
我从来没有让 Karaf 的 JMX 访问控制工作。
为 JMX 使用 JMXMP 而不是 RMI 可能会使事情变得更容易,但 Karaf 不支持开箱即用。