डॉकटर कंटेनर से होस्ट डेटाबेस तक पहुंचें


131

अगर मेरे पास कुछ होस्ट मशीन पर एक mysql डेटाबेस चल रहा है, और वह होस्ट docker कंटेनर भी चला रहा है: तो मैं होस्ट पर चल रहे docker कंटेनर से mysql डेटाबेस को कैसे एक्सेस करूंगा?

उदाहरण के लिए, क्या कोई होस्ट पोर्ट को कंटेनर में प्रकाशित करने का एक तरीका है (क्या docker run -p करता है) का उलटा?


1
यदि MySQL सर्वर किसी पोर्ट पर सुन रहा है, तो क्या कंटेनर किसी अन्य इंटरनेट कनेक्शन की तरह उस पोर्ट पर होस्ट से कनेक्ट नहीं हो सकता है?
jwodder

जवाबों:


87

यह एक सुसंगत, अच्छी तरह से समझा और पोर्टेबल तरीके से करने के बारे में कई लंबे समय से चर्चा कर रहे हैं। पूर्ण संकल्प नहीं, लेकिन मैं आपको नीचे चर्चाओं से जोड़ता हूं।

किसी भी घटना में आप कई लोग कंटेनर के / etc / host फ़ाइल में होस्ट के आईपी पते को जोड़ने के लिए doad चलाने के लिए --add- होस्ट विकल्प का उपयोग करने का प्रयास करना चाहते हैं। वहां से किसी भी आवश्यक पोर्ट पर होस्ट से कनेक्ट करने के लिए यह तुच्छ है:

एक कंटेनर होस्ट फ़ाइल में प्रविष्टियाँ जोड़ना

आप एक या अधिक --add- होस्ट फ़्लैग का उपयोग करके अन्य होस्ट को कंटेनर / / etc / होस्ट फ़ाइल में जोड़ सकते हैं। यह उदाहरण होस्ट करने वाले docker के लिए एक स्थिर पता जोड़ता है:

 $ docker run --add-host=docker:10.180.0.1 --rm -it debian
    $$ ping docker
    PING docker (10.180.0.1): 48 data bytes
    56 bytes from 10.180.0.1: icmp_seq=0 ttl=254 time=7.600 ms
    56 bytes from 10.180.0.1: icmp_seq=1 ttl=254 time=30.705 ms
    ^C--- docker ping statistics ---
    2 packets transmitted, 2 packets received, 0% packet loss
    round-trip min/avg/max/stddev = 7.600/19.152/30.705/11.553 ms

नोट: कभी-कभी आपको डॉकर होस्ट से कनेक्ट करने की आवश्यकता होती है, जिसका अर्थ है होस्ट का आईपी पता प्राप्त करना। आप इस प्रक्रिया को सरल बनाने के लिए निम्नलिखित शेल कमांड का उपयोग कर सकते हैं:

 $ alias hostip="ip route show 0.0.0.0/0 | grep -Eo 'via \S+' | awk '{ print $2 }'"
 $ docker run  --add-host=docker:$(hostip) --rm -it debian

प्रलेखन:

https://docs.docker.com/engine/reference/commandline/run/

कंटेनर से होस्ट तक पहुंचने पर चर्चा:

https://github.com/docker/docker/issues/1143

https://github.com/docker/docker/issues/10023


यह भी एक NGINX रिवर्स प्रॉक्सी के पीछे काम कर रहा होगा ??
काटा

89

18.03 डॉक्स से:

मैं एक कंटेनर से होस्ट पर एक सेवा से जुड़ना चाहता हूं

होस्ट के पास एक बदलती आईपी पता है (या यदि आपके पास कोई नेटवर्क नहीं है)। 18.03 बजे से हमारी सिफारिश विशेष DNS नाम से जुड़ने की हैhost.docker.internal , जो होस्ट द्वारा उपयोग किए जाने वाले आंतरिक आईपी पते पर आधारित है।

प्रवेश द्वार के रूप में भी पहुंच योग्य है gateway.docker.internal

उदाहरण: यहाँ मैं अपने MySQL कनेक्शन स्ट्रिंग के लिए अपने कंटेनर के अंदर अपने होस्ट पर MySQL उदाहरण का उपयोग करने के लिए उपयोग कर रहा हूँ:

mysql://host.docker.internal:3306/my_awesome_database

31
जैसा कि संकेत: यह केवल मैक और विन के लिए अब तक काम करता है
flp

आपने मेरा दिन बचा लिया :)
अमजद

4
वोट दें। केवल उत्तर के कारण नहीं, बल्कि इसलिए कि आपको इसे एक उदाहरण के साथ उपयोग करना चाहिए।
ग्रानैडकोडर

मैंने इसे प्राप्त करने के लिए लगभग 2 घंटे खर्च किए, बहुत बहुत धन्यवाद।
आशीष बैनाडे

फिर भी कोई उत्सुक समर्थन @flp के रूप में लिखा, उन उत्सुक लोगों के लिए। यहाँ github मुद्दा है
GAltelino

34

डॉकर 17.06 से, डॉक कंटेनरों में एक विशेष मैक-ओनली डीएनएस नाम उपलब्ध है जो होस्ट के आईपी पते को हल करता है। यह है:

docker.for.mac.localhost

प्रलेखन यहाँ है: https://docs.docker.com/docker-for-mac/networking/#httphttps-proxy-support


3
docker.for.mac.host.internalसे Docker 17.12.0 ceके बाद। docs.docker.com/docker-for-mac/release-notes/…
Zangetsu

docker.for.mac.localhost पर काम करता है18.03.1-ce-mac65
cdignam

24

Docker 18.03 के बाद से host.docker.internal का उपयोग करें ।


2
कैसे ? क्या आप इसका उपयोग करने का एक उदाहरण दे सकते हैं?
danfromisrael

आप डॉक्यूमेंटेड mysql क्यों नहीं चलाते?
इगोर डे ओलिवेरा सा

मेरे लिए काम नहीं करता हैDocker version 18.03.0-ce, build 0520e24
scythargon

@ IgorDeOliveiraSá परिदृश्य के बाद की कल्पना करें, देव परिवेश पर आपके पास कुछ डेटाबेस है जो 127.0.0.1:3306 पर सुनता है। आपके पास डेटाबेस में 127.0.0.1:3306 सुनने के लिए डेटाबेस है, स्थानीय स्तर पर यह स्थानीय डीबी है, उत्पादन यह क्लाउड के लिए प्रॉक्सी है, आपको या तो करना होगा। स्थानीय रूप से और उत्पादन के लिए dockerise mysql एक और उपाय ढूंढता है, या आप बस docker से पोर्ट से कनेक्ट कर सकते हैं, यह दोनों मामलों के लिए काम करेगा
Drachenfels

1
docker.for.mac.localhost मेरे लिए काम करता है18.03.1-ce-mac65
cdignam

21

अन्य उत्तर मेरे लिए अच्छी तरह से काम नहीं करते थे। मेरा कंटेनर host.docker.internal का उपयोग करके होस्ट आईपी को हल नहीं कर सका । इसके दो तरीके हैं

  1. होस्ट नेटवर्क साझा करना - नेट = होस्ट:

    docker run -it --net=host  myimage
    
  2. डॉकर के आईपी पते का उपयोग करना, जो आमतौर पर 172.17.0.1 है । आप ifconfig कमांड को कॉल करके और docker इंटरफ़ेस के इनसेट एडगर को पकड़कर इसे चेक कर सकते हैं

    user@ubuntu:~$ ifconfig
    docker0   Link encap:Ethernet  HWaddr 02:42:a4:a2:b2:f1  
      inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
      inet6 addr: fe80::42:a4ff:fea2:b2f1/64 Scope:Link
    

एक बार जब आपके पास यह आईपी पता होता है, तो आप इसे docker चलाने के तर्क के रूप में पास कर सकते हैं और फिर आवेदन करने के लिए या जैसा कि मैं इसे करता हूं, मेजबान मशीन पर निर्देशिका के लिए वॉल्यूम के माध्यम से jdbc.properties के स्थान को मैप करें, ताकि आप फ़ाइल को बाह्य रूप से प्रबंधित कर सकें ।

  docker run -it -v /host_dir/docker_jdbc_config:${jetty_base}/var/config myimage

नोट: आपका डेटाबेस बाहरी कनेक्शन की अनुमति नहीं दे सकता है। Postgresql के मामले में, आपको 2 फ़ाइलों को संपादित करने की आवश्यकता है, जैसा कि यहां और यहां वर्णित है :

  1. सभी पतों पर सुनने के लिए postgresql.conf संपादित करें। डिफ़ॉल्ट रूप से यह लोकलहोस्ट को इंगित करेगा।

    listen_addresses = '*'
    
  2. सभी पते से कनेक्शन की अनुमति देने के लिए pg_hba.conf को संपादित करें। अंतिम पंक्ति में जोड़ें:

    host     all             all             0.0.0.0/0               md5
    

महत्वपूर्ण: जब तक आप वास्तव में क्या कर रहे हैं यह सुनिश्चित करने के लिए उत्पादन उपयोग के लिए अंतिम चरण अद्यतन डेटाबेस एक्सेस की सिफारिश नहीं की जाती है।


--net = होस्ट ने मेरे लिए CI वातावरण पर काम किया, बहुत बहुत धन्यवाद!
सामी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.