2016-02-17 15 views
5

जब मैं सीधे अपने मेजबान पर डॉकर कंटेनर चला रहा हूं, तो बिना किसी समस्या के इसे कनेक्ट करना संभव है।डॉकर मशीन में होस्ट से डॉकर कंटेनर से जेएमएक्स से कैसे जुड़ें?

मेरे होस्ट में नेटवर्क 192.168.1.0/24 है और होस्ट का आईपी पता 192.168.1.20 है। मेरे डॉकर कंटेनर में आईपी पता 172.17.0.2 है। जब मैं jconsole से 172.17.0.2:1099 से कनेक्ट करता हूं तो यह काम करता है।

जब मैं इस सेवा को डॉकर मशीन में डालता हूं, तो उससे कनेक्ट करना संभव नहीं है।

माई डॉकर मशीन में आईपी 192.168.99.100 है और इसके कंटेनर में आईपी पता 172.17.0.2 है लेकिन जब मैं 1 9 2.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) और से कनेक्ट कर रहा मेरे मेजबान से 1 9 2.168.99.100:1099 काम नहीं करता है।

यह कहना उचित है कि मैं डॉकर मशीन के बाहरी आईपी पते के माध्यम से डॉकर मशीन में कंटेनरकृत सेवाओं तक पहुंच सकता हूं, उदा। इस काम करेगा:

192.168.99.100 --- (192.168.99.100:8080 --- 172.17.0.2:8080)

लेकिन यह सिर्फ काम नहीं करता है जब मैं JMX का उपयोग करें।

यह टोमकैट सेवा है। मैं स्क्रिप्ट जो बिलाव उदाहरण शुरू होता है में इस है:

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 
+0

यह डॉकर-जावा लाइब्रेरी द्वारा शुरू किया गया है ... यह इतना महत्वपूर्ण नहीं है, लेकिन जब मैं "डॉकर-मशीन एसएसएच" करता हूं और इसमें "डॉकर पीएस-ए" होता है तो मैं देख सकता हूं कि मेरे कंटेनर में यह पोर्ट बाइंडिंग/एक्सपोज़िंग: ad6be9184855 कंपनी/टोमकैट: 8.0.30 0.0.0.0:1099->1099/tcp, 0.0.0.0:8000->8000/tcp, 0.0.0.0:8009->8009/tcp, 0.0.0.0:8080->8080/tcp – stewenson

उत्तर

4

मुझे लगता है कि समस्या शायद java.rmi.server.hostname संपत्ति का मूल्य है। इसे होस्टनाम या आईपी पता होना चाहिए जिसका उपयोग जेएमएक्स क्लाइंट द्वारा आपके जेवीएम से कनेक्ट करने के लिए किया जाना चाहिए। यह पहले मामले में है जहां आप अपने कंटेनर से सीधे 172.17.0.2:1099 का उपयोग कर कनेक्ट करते हैं, इस सेटिंग को 172.17.0.2 पर सेट करने की आवश्यकता है। बाद के मामले में जहां आप 192.168.99.100:1099 पर डॉकर मशीन के माध्यम से कंटेनर तक पहुंचते हैं, तो सेटिंग को 192.168.99.100 पर सेट करने की आवश्यकता होती है।

मेरे शोध के दौरान एक बहुत ही समान प्रश्न (जिसे इस दौरान हटा दिया गया था) के दौरान मैंने ब्लॉग एंट्री में ठोकर खाई (जिसे इस दौरान भी हटा दिया गया था)। हालांकि यह बल्कि पुरानी यह मुझे एक विचार कैसे JMX कनेक्टिविटी काम करता दिया:

  1. JMX रजिस्ट्री कंटेनर
  2. के बंदरगाह <com.sun.management.jmxremote.port> पर सुनता है आप 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 है। चूंकि यह पता केवल डॉकर मशीन के भीतर से पहुंच योग्य है, रिमोट से कनेक्ट करना संभव नहीं है। मेरे प्रश्न में मैं आरएमआई बंदरगाह के संबंध में एक ही समस्या को कवर करता हूं ...

इस समस्या का एक आउट-द-बॉक्स समाधान प्रतीत नहीं होता है। हालांकि कोई भी here सुझाए गए अनुसार पर्यावरण चर के रूप में कंटेनर के स्टार्टअप पर जेएमएक्स पोर्ट और बाहरी होस्टनाम (या आईपी) दोनों प्रदान कर सकता है।ये तो JMX config में इस्तेमाल किया जा सकता है:

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" 

नहीं बहुत अच्छा है, लेकिन यह काम करना चाहिए ...

+0

हाँ यह दृष्टिकोण काम करता है और मैंने इसे बिल्कुल आपके जैसा समझा है, मैं अभी एक उत्तर लिखना भूल गया हूं :) धन्यवाद। – stewenson

+1

बीटीडब्ल्यू: यह मेरे लिए भी काम करता है (जावा 7, टॉमकैट 7), लेकिन मुझे इसे काम करने के लिए 'CATALINA_OPTS' में' -Dcom.sun.management.jmxremote = 'जोड़ना पड़ा। बस व्यक्तिगत गुण पर्याप्त नहीं था। – nwinkler

+1

@nwinkler निश्चित रूप से आप सही हैं। मैंने लापता सिस्टम प्रॉपर्टी 'com.sun.management.jmxremote' – dpr

1

अगर कोई इसके साथ समस्या है। मैं निम्नलिखित मानकों के साथ डोकर कंटेनर में जावा प्रक्रिया शुरू कर दिया है:

-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> 

महत्वपूर्ण हिस्सा डोकर कंटेनर का नाम शामिल किया जाए। कंटेनर 9876 में बंदरगाह का विस्तार करें। मैंने एक एसएसएच कनेक्शन भी स्थापित किया है और स्थानीय स्तर पर 9876 को अग्रेषित किया है।

निम्नलिखित आपकी SSH config को जाता है:

LocalForward 127.0.0.1:9876 127.0.0.1:9876 

इसके अलावा, मैं है सेटअप/etc/स्थानीय मशीन

127.0.0.1 <name of the docker container> 

पर मेजबान अब करने के लिए "डोकर कंटेनर का नाम है" अपने कंसोल कनेक्ट

संबंधित मुद्दे