当前位置: 首页 > 面试题库 >

如何将JMX从主机连接到Docker机器中的Docker容器?

云联
2023-03-14
问题内容

当我直接在主机上运行Docker容器时,可以毫无问题地连接到它。

我的主机的网络为192.168.1.0/24,主机的IP地址为192.168.1.20。我的Docker容器的IP地址为172.17.0.2。当我从jconsole连接到172.17.0.2:1099时,它可以工作。

当我将此服务放入Docker机器时,无法连接到它。

我的Docker机器的IP地址为192.168.99.100,容器中的IP地址为172.17.0.2,但是当我使用jconsole连接到192.168.99.100:1099时,它不起作用。

要重复它:

192.168.1.20 — 172.17.0.2:1099有效

192.168.1.20 —(192.168.99.100 —
172.17.0.2:1099)并无法从我的主机连接到192.168.99.100:1099。

值得一提的是,我可以通过Docker计算机的外部IP地址访问Docker计算机中容器化的服务,例如,这可以工作:

192.168.99.100 —(192.168.99.100:8080 — 172.17.0.2:8080)

但是,当我使用JMX时,它将无法正常工作。

它是Tomcat服务。我在启动Tomcat实例的脚本中有这个:

CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.rmi.port=1099 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=IP address of Docker container

问题答案:

我认为问题可能在于java.rmi.server.hostname财产的价值。这必须是JMX客户端用于连接到JVM的主机名或IP地址。在第一种情况下,您直接使用来连接到容器172.17.0.2:1099,此设置需要设置为172.17.0.2。在后一种情况下,您通过docker机器访问容器192.168.99.100:1099,则需要将设置设置为192.168.99.100

在研究非常相似的问题(同时被删除)的过程中,我偶然发现了一个博客条目(同时也被删除了)。尽管它已经很老了,但它让我知道了JMX连接的工作原理:

  1. JMX注册表侦听<com.sun.management.jmxremote.port>容器的端口
  2. 如果使用JConsole连接到注册表,则注册表将向客户端提供JMX服务URL。
  3. 客户端使用此URL来获取JMX对象

服务URL如下所示service:jmx:rmi:///jndi/rmi://<java.rmi.server.hostname>:<com.sun.management.jmxremote.rmi.port>/jmxrmi。那是你的情况service:jmx:rmi:///jndi/rmi://172.17.0.2:1099/jmxrmi。由于只能从docker机器内部访问此地址,因此无法从远程连接。在我的问题中,我涉及RMI端口方面的相同问题…

似乎没有针对此问题的开箱即用的解决方案。但是一个可以同时提供JMX端口和容器的环境变量启动外部主机名(或IP),如建议在这里。这些可以在JMX配置中使用:

docker run -p 1099:1099 \
    -e "JMX_HOST=192.168.99.100" \
    -e "JMX_PORT=1099" \
    company/tomcat:8.0.30

CATALINA_OPTS="... \
    -Dcom.sun.management.jmxremote=true \
    -Dcom.sun.management.jmxremote.port=$JMX_PORT \
    -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT \
    -Dcom.sun.management.jmxremote.authenticate=false \
    -Dcom.sun.management.jmxremote.ssl=false \
    -Djava.rmi.server.hostname=$JMX_HOST"

不太好,但是应该可以…



 类似资料:
  • 问题内容: 所以我想连接到我在主机上运行的mongodb(DO Drop,Ubuntu 16.04)。它在localhost 的默认端口上运行。 然后,我使用mup将我的Meteor应用程序部署在我的DO Drop上,该DO Drop使用docker在容器内运行Meteor应用程序。到目前为止,一切都很好。使用标准连接URL将应用程序连接到mongodb。现在我有以下问题: 显然不能在docker

  • (由于我对Docker或mysql管理的了解有限,这可能是一个愚蠢的问题,但由于我花了整整一个晚上讨论这个问题,所以我敢问这个问题。) 概括地说 我想在docker容器中运行mysql,并从我的主机连接到它。到目前为止,我取得的最好成绩是: 更多详细信息 我正在使用以下: 在有此文件的目录中,我可以成功地构建映像并运行它: 当我连接到图像上时,它似乎工作得很好: 然而,我并没有从主持人那里获得那么

  • 问题内容: Docker容器可以通过哪个IP地址连接到Windows版Docker(在Windows 10上)上的主机?您如何找到此IP地址? 例如:您有一个服务在Windows 10计算机上的端口1234上运行。容器中的程序必须访问此服务。程序应使用哪个IP地址连接到主机? 问题答案: 简短的回答 :在大多数情况下,您需要 10.0.75.1 。 在适用于Windows的Docker中,容器通过

  • docker容器可以在哪个IP地址上连接到它在docker for Windows(在Windows 10上)上的主机?如何找到这个IP地址?

  • 问题内容: 我正在运行一个docker mysql映像,以下是docker-compose.yml文件的外观: 这很好。 我的问题是:如何从主机(我的Macbook)上的命令行mysql客户端连接到在该容器上运行的MySQL实例? 澄清: 我有一台装有Docker的Macbook 我有一个带有mysql的docker容器 我想从Macbook的终端连接到上述容器上运行的mysql实例 我不想使用命

  • 厘斯7.8 docker run -d -p 8080:80 --name nginxtest nginx docker ps CONTAINER ID Image PORTS NAMES xxxxxxxx nginx 0.0.0.0:8080- curl localhost:8080 < br > curl:(56)Recv失败:连接被对等方重置 netstat-tulpn<br>tcp6 0

  • 问题内容: 所以我有一个Nginx在docker容器中运行,我有一个mysql在本地主机上运行,​​我想从我的Nginx内部连接到MySql。MySql在localhost上运行,并且没有将端口暴露给外界,因此它绑定在localhost上,而不绑定在计算机的IP地址上。 有什么方法可以从此Docker容器中连接到此MySql或localhost上的任何其他程序吗? 此问题与“如何从Docker容器

  • 我正面临来自docker容器的MongoDB连接问题,我读了一些stackoverflow的答案,但没有帮助我解决我的问题。 我的application.yml文件有以下内容, 我的docker-compose文件有以下内容, 版本:'3.5'服务: sp-app-web-ui com.mongodb.mongosocketopenexception:异常打开socket sp-app-web-u