在 ECS 集群上的 docker 容器 运行 中公开 JMX 端口
Expose JMX port in a docker Container running on ECS Cluster
我有一个 java 应用程序 运行 在 docker 容器中运行。我已经在 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 运行 命令 运行ning 这个 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"
}
]
}
通过各种链接后,我找到了问题的解决方案。最后,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 应用程序 运行 在 docker 容器中运行。我已经在 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 运行 命令 运行ning 这个 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"
}
]
}
通过各种链接后,我找到了问题的解决方案。最后,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。