![](/img/trans.png)
[英]Connect to docker container on windows host from another machine
[英]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連接如何工作:
<com.sun.management.jmxremote.port>
服務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.