簡體   English   中英

如何在Docker機器中將JMX從主機連接到Docker容器?

[英]How to connect with JMX from host to Docker container in Docker machine?

當我直接在主機上運行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 在后一種情況下,您通過192.168.99.100:1099上的docker機器訪問容器,該設置需要設置為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 由於此地址只能從泊塢機內部訪問,因此無法從遠程連接。 在我的問題中,我討論了與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"

不是很好,但它應該工作......

如果有人有問題。 我已經使用以下參數在docker容器中啟動了java進程:

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=9876 
-Dcom.sun.management.jmxremote.rmi.port=9876 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-Djava.rmi.server.hostname=<name of the docker container>

重要的是設置docker容器的名稱。 EXPOSE容器9876中的端口。我還設置了一個ssh連接並將9876轉發到localhost。

以下內容適用於您的SSH配置:

LocalForward 127.0.0.1:9876 127.0.0.1:9876

我也在本地機器上設置了/ etc / hosts

127.0.0.1 <name of the docker container>

現在將控制台連接到“docker容器的名稱”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM