在运行在ECS集群上的Docker容器中暴露JMX端口

3

我有一个运行在Docker容器中的Java应用程序。我已经将此容器部署在ECS集群中。我想公开一个JMX端口,以便我可以使用安装在该机器上的CollectD代理收集JVM统计信息。

我在我的Java应用程序中指定的JVM参数是

JAVA_OPTS="-Dspring.config.location=classpath:/base/ -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8008 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.net.preferIPv4Stack=true -Djava.rmi.server.hostname=10.0.7.118

如果我在非docker环境下运行此应用程序,则可以连接到此JMX端口。但是,在Docker中我无法这样做。

我已经在我的任务定义中给出了端口映射,因此该端口可以暴露给外部世界。我知道,如果我使用docker run命令运行此docker,则可以指定-p参数进行端口映射,但是我不能在这里执行相同的操作,因为我正在ECS集群上运行此应用,而该集群部署此镜像。因此,我必须依赖任务定义提供的端口映射。

任务定义

            "ContainerDefinitions": [
                {
                    "Name": "MyApplication",
                    "Cpu": "2048",
                    "Essential": "true",
                    "Image": "location of the image",
                    "Memory": "8192",
                    "MemoryReservation": "4096",
                    "Environment": [
                        {
                            "Name": "Test",
                            "Value": {
                                "Fn::GetAtt": [
                                    "SomeAttrib",
                                    "SomeAccessKey"
                                ]
                            }
                        }
                    ],
                    "PortMappings": [
                        {
                            "HostPort": "8080",
                            "ContainerPort": "8080"
                        },
                        {
                            "HostPort": "8008",
                            "ContainerPort": "8008"
                        }
                    ]
                }
1个回答

1

经过查看多个链接,我找到了解决方案。最终,JVM参数如下

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8008 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.net.preferIPv4Stack=true -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.rmi.port=8008 -Dcom.sun.management.jmxremote.local.only=true

对我来说,添加-Dcom.sun.management.jmxremote.local.only=true就解决了问题。根据您的要求,可以将其设置为true或false。


你是如何传递这个JAVA_OPTS的参数的? - richersoon
Docker文件执行一个shell脚本,该脚本进一步执行Spring Boot jar。在执行jar时,我已经传递了JAVA_OPTS。 - Rakshit Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接