डॉकटर कंटेनर के अंदर से, मैं मशीन के लोकलहोस्ट से कैसे जुड़ सकता हूं?


1447

इसलिए मेरे पास एक डॉक कंटेनर के अंदर एक नगिनक्स चल रहा है, मेरे पास एक लोकलहोस्ट चल रहा है, मैं अपने नग्नेक्स के भीतर से MySql से जुड़ना चाहता हूं। MySql लोकलहोस्ट पर चल रहा है और बाहरी दुनिया के लिए एक पोर्ट को उजागर नहीं कर रहा है, इसलिए इसकी लोकलहोस्ट पर बाध्य है, मशीन के आईपी पते पर बाध्य नहीं है।

क्या इस डॉक कंटेनर के भीतर से इस MySql या लोकलहोस्ट पर किसी अन्य प्रोग्राम से जुड़ने का कोई तरीका है?

यह प्रश्न "डॉकटर कंटेनर के अंदर से डॉकटर होस्ट का आईपी पता कैसे प्राप्त करें" से अलग है इस तथ्य के कारण कि डॉक होस्ट का आईपी पता सार्वजनिक आईपी या नेटवर्क में निजी आईपी हो सकता है जो हो सकता है या हो सकता है डॉकटर कंटेनर के भीतर से पहुंचने योग्य नहीं है (मेरा मतलब है सार्वजनिक आईपी अगर AWS या कुछ पर होस्ट किया गया है)। यहां तक ​​कि अगर आपके पास docker होस्ट का IP पता है, तो इसका मतलब यह नहीं है कि आप docker host को कन्टेनर के भीतर से कनेक्ट कर सकते हैं, यह देखते हुए कि आपके Docker नेटवर्क के रूप में IP एड्रेस ओवरले, होस्ट, ब्रिज, मैकवलन, कोई भी नहीं हो सकता है, जो रीचैबिलिटी को प्रतिबंधित करता है। वह आईपी पता।


Myqql को docker0 के रूप में अच्छी तरह से क्यों नहीं बांधें?
ivant

2
विंडोज मशीन के लिए: - $ docker run -d --name MyWebServer -P httpd
लोकेश एस।


बिना network: hostआप एक कंटेनर से होस्ट तक वापस नहीं जा सकते। केवल कंटेनर में होस्ट करें। यह कंटेनरों के पीछे मुख्य विचारधारा है। वे स्थिरता और सुरक्षा दोनों कारणों से अलग-थलग हैं।
FreeSoftwareServers

जवाबों:


1965

संपादित करें: यदि आप Docker-for-mac या Docker-for-Windows 18.03+ का उपयोग कर रहे हैं , तो बस होस्ट host.docker.internal( 127.0.0.1आपके कनेक्शन स्ट्रिंग में) के बजाय अपनी mysql सेवा से कनेक्ट करें ।

Docker 18.09.3 के अनुसार, यह Docker-for-Linux पर काम नहीं करता है। 8 मार्च, 2019 को एक समाधान प्रस्तुत किया गया है और उम्मीद है कि कोड आधार में विलय कर दिया जाएगा। तब तक, एक वर्कअराउंड कंटेनर का उपयोग करना है जैसा कि क़ूमन के उत्तर में वर्णित है ।

2020-01: कुछ प्रगति की गई है। यदि सब ठीक हो जाता है, तो इसे डॉकर 20.04 में उतरना चाहिए


TLDR

--network="host"अपने docker runकमांड में उपयोग करें , फिर 127.0.0.1अपने डॉकटर कंटेनर में आपके डॉकटर होस्ट को इंगित करेगा।

नोट: यह मोड केवल प्रलेखन के लिए लिनक्स के लिए डॉकर पर काम करता है ।


डॉकटर कंटेनर नेटवर्किंग मोड पर ध्यान दें

डॉकटर कंटेनर चलाते समय विभिन्न नेटवर्किंग मोड प्रदान करता है । आपके द्वारा चुने गए मोड के आधार पर आप अपने MySQL डेटाबेस से कनेक्ट करेंगे जो कि अलग-अलग docker होस्ट पर चल रहा है।

docker run --network = "ब्रिज" (डिफ़ॉल्ट)

डोकर docker0डिफ़ॉल्ट रूप से नाम से एक पुल बनाता है । दोनों docker होस्ट और docker कंटेनर्स का उस ब्रिज पर IP एड्रेस होता है।

डॉकर होस्ट पर, टाइप करें sudo ip addr show docker0आपको एक आउटपुट दिखना होगा:

[vagrant@docker:~] $ sudo ip addr show docker0
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
    inet 172.17.42.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::5484:7aff:fefe:9799/64 scope link
       valid_lft forever preferred_lft forever

इसलिए यहां मेरे docker होस्ट का नेटवर्क इंटरफेस 172.17.42.1पर IP एड्रेस docker0है।

अब एक नया कंटेनर शुरू करें और उस पर एक शेल प्राप्त करें: docker run --rm -it ubuntu:trusty bashऔर कंटेनर प्रकार के भीतर यह ip addr show eth0पता लगाने के लिए कि इसका मुख्य नेटवर्क इंटरफ़ेस कैसे सेट किया गया है:

root@e77f6a1b3740:/# ip addr show eth0
863: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 66:32:13:f0:f1:e3 brd ff:ff:ff:ff:ff:ff
    inet 172.17.1.192/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::6432:13ff:fef0:f1e3/64 scope link
       valid_lft forever preferred_lft forever

यहां मेरे कंटेनर में आईपी एड्रेस है 172.17.1.192। अब रूटिंग टेबल देखें:

root@e77f6a1b3740:/# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.17.42.1     0.0.0.0         UG    0      0        0 eth0
172.17.0.0      *               255.255.0.0     U     0      0        0 eth0

इसलिए docker होस्ट 172.17.42.1का IP पता डिफ़ॉल्ट रूट के रूप में सेट किया गया है और आपके कंटेनर से पहुंच योग्य है।

root@e77f6a1b3740:/# ping 172.17.42.1
PING 172.17.42.1 (172.17.42.1) 56(84) bytes of data.
64 bytes from 172.17.42.1: icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from 172.17.42.1: icmp_seq=2 ttl=64 time=0.201 ms
64 bytes from 172.17.42.1: icmp_seq=3 ttl=64 time=0.116 ms

docker run --network = "host"

वैकल्पिक रूप से आप नेटवर्क सेटिंग केhost साथ एक डॉक कंटेनर चला सकते हैं । इस तरह के एक कंटेनर नेटवर्क स्टैक को डॉक होस्ट के साथ और कंटेनर के दृष्टिकोण से साझा करेगा, और localhost(या 127.0.0.1) डॉकटर होस्ट को संदर्भित करेगा।

ध्यान रखें कि आपके docker कंटेनर में खोला गया कोई भी पोर्ट docker होस्ट पर खोला जाएगा। और यह -pया -P docker runविकल्प की आवश्यकता के बिना ।

मेरे docker होस्ट पर IP कॉन्फिग:

[vagrant@docker:~] $ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
       valid_lft forever preferred_lft forever

और मेजबान मोड में एक डॉक कंटेनर से :

[vagrant@docker:~] $ docker run --rm -it --network=host ubuntu:trusty ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
       valid_lft forever preferred_lft forever

जैसा कि आप देख सकते हैं कि डॉक होस्ट और डॉकटर कंटेनर दोनों समान नेटवर्क इंटरफेस को साझा करते हैं और जैसे कि एक ही आईपी पता है।


कंटेनर से MySQL से कनेक्ट करना

ब्रिज मोड

पुल मोड में कंटेनरों से डॉक होस्ट पर चल रहे MySQL तक पहुंचने के लिए , आपको यह सुनिश्चित करने की आवश्यकता है कि MySQL सेवा 172.17.42.1आईपी ​​पते पर कनेक्शन के लिए सुन रही है ।

ऐसा करने के लिए, सुनिश्चित करें कि आप या तो बनाने bind-address = 172.17.42.1या bind-address = 0.0.0.0अपने MySQL कॉन्फ़िग फ़ाइल (my.cnf) में।

यदि आपको गेटवे के आईपी पते के साथ एक पर्यावरण चर सेट करने की आवश्यकता है, तो आप एक कंटेनर में निम्नलिखित कोड चला सकते हैं:

export DOCKER_HOST_IP=$(route -n | awk '/UG[ \t]/{print $2}')

तब आपके अनुप्रयोग में, DOCKER_HOST_IPMySQL से कनेक्शन खोलने के लिए पर्यावरण चर का उपयोग करें ।

नोट: यदि आप bind-address = 0.0.0.0अपने MySQL सर्वर का उपयोग करते हैं तो सभी नेटवर्क इंटरफेस पर कनेक्शन के लिए सुनेंगे। इसका मतलब है कि आपका MySQL सर्वर इंटरनेट से पहुँचा जा सकता है; तदनुसार फ़ायरवॉल नियमों को स्थापित करना सुनिश्चित करें।

नोट 2: यदि आप bind-address = 172.17.42.1अपने MySQL सर्वर का उपयोग करते हैं तो किए गए कनेक्शन के लिए नहीं सुनेंगे 127.0.0.1। डॉक होस्ट पर चलने वाली प्रक्रियाएँ जो MySQL से जुड़ना चाहेंगी, उन्हें 172.17.42.1IP पते का उपयोग करना होगा ।

होस्ट मोड

होस्ट मोड में कंटेनरों से होस्ट करने वाले MySQL तक पहुंचने के लिए , आप bind-address = 127.0.0.1अपने MySQL कॉन्फ़िगरेशन में रख सकते हैं और आपको बस 127.0.0.1अपने कंटेनर से कनेक्ट करना होगा :

[vagrant@docker:~] $ docker run --rm -it --network=host mysql mysql -h 127.0.0.1 -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 5.5.41-0ubuntu0.14.04.1 (Ubuntu)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

नोट: उपयोग करें mysql -h 127.0.0.1और नहीं mysql -h localhost; अन्यथा MySQL क्लाइंट एक यूनिक्स सॉकेट का उपयोग करके कनेक्ट करने का प्रयास करेगा।


8
इतने विस्तृत उत्तर के लिए धन्यवाद! मैंने जो भी इकट्ठा किया है, उसमें से होस्टहोस्ट मोड का उपयोग करना लोकलहोस्ट के माध्यम से इस कार्यक्षमता को प्राप्त करने का एकमात्र तरीका है। मैंने कोशिश नहीं की है, लेकिन मुझे लगता है कि आप अपने स्वयं के पुल पर कंटेनरों को जोड़ने के लिए एक अलग नेटवर्क बना सकते हैं जो उन्हें एक आम 'लोकलहोस्ट' की पेशकश करेगा।
बेन

26
OSX उपयोगकर्ताओं के लिए ध्यान दें: "docker- मशीन ssh डिफ़ॉल्ट" का उपयोग करते हुए पहले अपने docker वर्चुअल मशीन (boot2docker) में लॉग इन करें, फिर "sudo ip addr show docker0" चलाएँ। थॉमस के निर्देशों को वहां से जारी रखें।
चार्ली डलासस

30
मैं मैक के लिए डॉकर चला रहा हूं, और अब कोई 172.17.42.1 नहीं है, अब कोई डॉकटर नहीं है। यह 172.17.0.1 प्रवेश द्वार के रूप था, और भी कर सकते हैं नहींtelnet 172.17.0.1 3306
zx1986

26
आप -v /var/run/mysqld/mysqld.sock:/tmp/mysql.sockइस तरह की नेटवर्किंग के बजाय कंटेनर में mysql सॉकेट माउंट कर सकते हैं ।
5

8
क्या कोई उस स्थिति को संबोधित कर सकता है जब आपका रनिंग मैक पर मैक और बूट 2docker का उपयोग नहीं कर रहा है जैसे कि docker0 इंटरफ़ेस नहीं है?
TheJKFever

350

MacOS और Windows के लिए

Docker v 18.03 और उससे अधिक (21 मार्च 2018 से)

अपने आंतरिक आईपी पते का उपयोग करें या विशेष DNS नाम से कनेक्ट करें host.docker.internalजो होस्ट द्वारा उपयोग किए गए आंतरिक आईपी पते पर हल होगा।

लिनक्स समर्थन लंबित https://github.com/docker/for-linux/issues/264

Docker के पुराने संस्करणों के साथ MacOS

मैक वी 17.12 से वी 18.02 के लिए डॉकटर

ऊपर के समान लेकिन docker.for.mac.host.internalइसके बजाय का उपयोग करें ।

मैक वी 17.06 से वी 17.11 के लिए डॉकर

ऊपर के समान लेकिन docker.for.mac.localhostइसके बजाय का उपयोग करें ।

मैक 17.05 और नीचे के लिए डोकर

डॉक कंटेनर से होस्ट मशीन तक पहुंचने के लिए आपको अपने नेटवर्क इंटरफेस में एक आईपी उर्फ ​​संलग्न करना होगा। आप जो भी आईपी चाहते हैं उसे बांध सकते हैं, बस सुनिश्चित करें कि आप इसे किसी और चीज के लिए उपयोग नहीं कर रहे हैं।

sudo ifconfig lo0 alias 123.123.123.123/24

फिर सुनिश्चित करें कि आप सर्वर ऊपर उल्लिखित आईपी सुन रहे हैं या 0.0.0.0। यदि यह लोकलहोस्ट पर सुन रहा है तो यह 127.0.0.1कनेक्शन स्वीकार नहीं करेगा।

फिर बस इस आईपी के लिए अपने डॉकटर कंटेनर को इंगित करें और आप मेजबान मशीन तक पहुंच सकते हैं!

परीक्षण करने के लिए आप curl -X GET 123.123.123.123:3000कंटेनर के अंदर कुछ चला सकते हैं ।

उपनाम प्रत्येक रिबूट पर रीसेट हो जाएगा इसलिए यदि आवश्यक हो तो एक स्टार्ट-अप स्क्रिप्ट बनाएं।

समाधान और अधिक प्रलेखन यहाँ: https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds


5
शानदार और धन्यवाद, यह मेरे लिए कंटेनर के भीतर से काम किया। mysql -uroot -hdocker.for.mac.localhost
रिचर्ड फ्रैंक

1
docker.for.mac.localhost वास्तव में मैं क्या देख रहा था। लेकिन यह एक ही समय में नरक के रूप में गंदा है। डॉकटर में, किसी को यह उम्मीद होगी कि हुक docker.for.mac.localhost एक सामान्य docker आंतरिक नाम होगा जो किसी भी ऑपरेटिंग सिस्टम के लिए मान्य होगा, न कि केवल Mac के लिए। लेकिन विकास के उद्देश्यों के लिए यह काफी अच्छा है।
99Sono 15

मैं एक पोर्ट को कैसे एक्सेस करूं जो 9093 में उजागर हो। मैं टेलनेट docker.for.mac.localhost 9093 की कोशिश कर रहा हूं। इसके अगम्य लेकिन अगर मैं docker.for.mac.localhost को पिंग करता हूं, तो यह पहुंच योग्य है। क्या मैं यहां कुछ याद कर रहा हूं?
अचिलियस

1
DNS नाम docker.for.mac.host.internal कंटेनरों से होस्ट रिज़ॉल्यूशन के लिए docker.for.mac.localhost (अभी भी मान्य) के बजाय का उपयोग किया जाना चाहिए, क्योंकि वहाँ एक RFC है जो लोकलहोस्ट के उप डोमेन का उपयोग करने पर प्रतिबंध लगा रहा है। उपकरण देखें । in.ff.org/html/draft-west-let-localhost-be-localhost-06
जया

यह मेरे लिए काम नहीं करता है। जब मैं docker run -e HOSTNAME= docker.for.mac.host.internal , कंटेनर बनाया जाता है, लेकिन nothign होता है। मैं तो crtl + C है। साथ --net=host -e HOSTNAME=localhostकम से कम कंटेनर रन और शिकायत है कि यह सेवा मैं जरूरत नहीं मिल सकता है (MySQL डाटाबेस)।
जॉर्ज ऑरपिनल

83

मैं कंटेनर में एलियास नाम (डीएनएस) के लिए स्थानीय आईपी प्राप्त करने के लिए उपरोक्त पदों के समान हैक कर रहा हूं। मुख्य समस्या डायनेमिक रूप से एक सरल स्क्रिप्ट के साथ प्राप्त करना है जो लिनक्स और ओएसएक्स दोनों में होस्ट आईपी पते पर काम करती है । मैंने इस स्क्रिप्ट को दोनों वातावरणों में काम किया (यहां तक ​​कि "$LANG" != "en_*"कॉन्फ़िगर के साथ लिनक्स वितरण में भी ):

ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1

तो, डॉकर कम्पोज़ का उपयोग करते हुए, पूर्ण कॉन्फ़िगरेशन होगा:

स्टार्टअप स्क्रिप्ट (docker-run.sh) :

export DOCKERHOST=$(ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1)
docker-compose -f docker-compose.yml up

docker-compose.yml :

myapp:
  build: .
  ports:
    - "80:80"
  extra_hosts:
    - "dockerhost:$DOCKERHOST"

फिर बदलने http://localhostके लिए http://dockerhostअपने कोड में।

DOCKERHOSTस्क्रिप्ट को कैसे अनुकूलित किया जाए , इसके बारे में अधिक अग्रिम गाइड के लिए , इस पोस्ट पर एक नज़र डालें कि यह कैसे काम करता है।


1
आपके उपयोग के मामले के आधार पर, आप यहां तक ​​कि DOCKERHOST"लोकलहोस्ट" या 0.0.0.0 के बजाय यहां उस मूल्य का उपयोग करने से दूर हो सकते हैं जो आपके डॉकटर को स्थानीय रूप से कनेक्ट करने की आवश्यकता है।
एंडरलैंड

2
मैंने कस्टम नेटवर्क के साथ संगत होने के लिए आपके समाधान को थोड़ा संशोधित किया है: export DOCKERHOST=$(docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' <NETWORK-NAME> | awk -F "/" 'NR==1{print $1}') जहां <NETWORK-NAME> को पुल या नेटवर्क का नाम दिया जा सकता है जैसा कि docker-compose (आमतौर पर पथ-नाम) द्वारा परिभाषित किया गया है - network_name ) ।
dieresys

1
आपको एक टिप्पणी जोड़ने की आवश्यकता है: dockerhostdb कनेक्शन के लिए मेजबान के रूप में उपयोग करें (सामान्य रूप से के लिए बदलेंlocalhost कॉन्फ़िगर फ़ाइल में )।
जस्टिन

अजीब समाधान है, लेकिन इसकी एकमात्र है कि phd cli के साथ docker के तहत xdebug काम करता है
एडी

हाइपरस्पी में इस घोल के बाद Acl ने काम करना बंद कर दिया। कोई विचार क्यों?
HyukHyukBoi

41

यह मेरे लिए एक NGINX / PHP-FPM स्टैक पर काम करता है, जो किसी भी कोड या नेटवर्किंग को छूने के बिना होता है, जहां ऐप को बस कनेक्ट करने में सक्षम होने की उम्मीद है localhost

mysqld.sockकंटेनर के अंदर मेजबान से माउंट करें ।

होस्ट mysql पर mysql.sock फ़ाइल का स्थान खोजें:
netstat -ln | awk '/mysql(.*)?\.sock/ { print $9 }'

उस फ़ाइल को माउंट करें जहाँ यह docker में अपेक्षित है:
docker run -v /hostpath/to/mysqld.sock:/containerpath/to/mysqld.sock

Mysqld.sock के संभावित स्थान:

/tmp/mysqld.sock
/var/run/mysqld/mysqld.sock 
/var/lib/mysql/mysql.sock
/Applications/MAMP/tmp/mysql/mysql.sock # if running via MAMP

2
यह एक बहुत क्लीनर समाधान है, बाहर (यदि एक फ़ायरवॉल का उपयोग नहीं कर रहा है) के लिए मैसकल को उजागर नहीं कर रहा है।
user1226868

5
सॉकेट्स टीसीपी के साथ-साथ स्केल नहीं करते हैं क्योंकि वे अधिक बार ब्लॉक होते हैं और अजीब व्यवहार का कारण बन सकते हैं। जब भी संभव हो तो टीसीपी का उपयोग करें।
जोएल ई सलास

3
@JoelESalas क्या आपके पास उस दावे का स्रोत है?
प्राइवेट

मुझे यह सबसे आसान उपाय लगता है। उपयोगकर्ता 833482 को अंगूठे! आपको StackOverflow में अधिक बार योगदान देना चाहिए।
प्राइवेट

2
@JoelESalas मुझे लगता है कि आप गलत हैं। Mysql क्लाइंट लाइब्रेरी स्थानीय रूप सेहोस्ट करने के लिए कनेक्शन बनाने के बजाय डिफ़ॉल्ट रूप से यूनिक्स सॉकेट का उपयोग करती है। एक यूनिक्स सॉकेट टीसीपी स्टैक और रूटिंग के ओवरहेड से बचा जाता है, और तेजी से चलना चाहिए।
एम कॉनराड

25

जब तक host.docker.internalहर प्लेटफ़ॉर्म के लिए काम नहीं किया जाता, तब तक आप मेरे कंटेनर को नैट गेटवे के रूप में बिना किसी मैनुअल सेटअप के इस्तेमाल कर सकते हैं:

https://github.com/qoomon/docker-host


5
मैं पुष्टि कर सकता हूँ कि यह विंडोज कंटेनर के साथ विंडोज 19.03.2 के लिए डॉकर में काम नहीं करता है।
केएमसी

किसी भी विचार कैसे तय करने के लिए? (मैं एक विंडोज़ उपयोगकर्ता नहीं हूँ)
qoomon

यदि आप पर्यावरण पोर्ट mysql का उपयोग नहीं करते हैं, तो आप सर्वर को उस कंप्यूटर नाम से संदर्भित कर सकते हैं जिसे यह होस्ट किया गया है। तो आप कनेक्शन स्ट्रिंग में, अपने कंप्यूटर का नाम सर्वर नाम के रूप में उपयोग करें।
केएमसी

24

लिनक्स के लिए समाधान (कर्नेल> = 3.6)।

ठीक है, आपके लोकलहोस्ट सर्वर के पास आईपी ​​एड्रेस 172.17.0.1 के साथ डिफ़ॉल्ट डॉक इंटरफेस है । आपका कंटेनर डिफ़ॉल्ट नेटवर्क सेटिंग्स --net = "ब्रिज" से शुरू हुआ

  1. Docker0 इंटरफ़ेस के लिए path_localnet सक्षम करें:
    $ sysctl -w net.ipv4.conf.docker0.route_localnet=1
  2. इस नियम को iptables में जोड़ें:
    $ iptables -t nat -I PREROUTING -i docker0 -d 172.17.0.1 -p tcp --dport 3306 -j DNAT --to 127.0.0.1:3306
    $ iptables -t filter -I INPUT -i docker0 -d 127.0.0.1 -p tcp --dport 3306 -j ACCEPT
  3. Mysql उपयोगकर्ता को '%' से अभिगमन के साथ बनाएँ जिसका अर्थ है - किसी से भी, लोकलहोस्ट को छोड़कर:
    CREATE USER 'user'@'%' IDENTIFIED BY 'password';
  4. अपनी स्क्रिप्ट में mysql-server एड्रेस को 172.17.0.1 पर बदलें


से गिरी प्रलेखन :

path_localnet - BOOLEAN: रूट करते समय लूपबैक पतों को मार्शल स्रोत या गंतव्य के रूप में न समझें । यह स्थानीय रूटिंग प्रयोजनों ( डिफ़ॉल्ट FALSE ) के लिए 127/8 का उपयोग करने में सक्षम बनाता है ।


1
द्वितीय आईबेट कमांड का उद्देश्य क्या है? मैं समझ सकता हूं कि पहला tcp डेस्टिनेशन फिर से लिखना है जो 172.17.0.1:3306 से 127.0.0.1.13306 से मेल खाता है, लेकिन दूसरा iptable कमांड क्यों जरूरी है?
पैट्रिक

17

विंडोज 10 के लिए समाधान

डॉकर सामुदायिक संस्करण 17.06.0-ce-win18 2017-06-28 (स्थिर)

docker.for.win.localhostआंतरिक IP को हल करने के लिए, आप होस्ट के DNS नाम का उपयोग कर सकते हैं । (उल्लिखित कुछ स्रोतों को चेतावनी दें windowsलेकिन यह होना चाहिए win)

ओवरव्यू
मुझे कुछ ऐसा ही करने की आवश्यकता थी, जो मेरे डॉकटर कंटेनर से मेरे लोकलहोस्ट से कनेक्ट है, जो कि Azure Storage Emulatorऔर चल रहा था CosmosDB Emulator

Azure Storage Emulatorपर द्वारा चूक सुनता 127.0.0.1 , जब तुम आईपी इसकी भी बाध्य मैं एक समाधान है कि डिफ़ॉल्ट सेटिंग के साथ काम करेगा लिए देख रहा था बदल सकते हैं।

यह मेरे डॉकर कंटेनर से कनेक्ट करने के लिए भी काम करता है SQL Serverऔर IIS, डिफ़ॉल्ट पोर्ट सेटिंग्स के साथ मेरे होस्ट पर स्थानीय रूप से चल रहा है।


13

बहुत सरल और त्वरित, ifconfig (linux) या ipconfig (विंडोज़) के साथ अपने होस्ट IP की जाँच करें और फिर एक बनाएं

डोकर-compose.yml

version: '3' # specify docker-compose version

services:
  nginx:
    build: ./ # specify the directory of the Dockerfile
    ports:
      - "8080:80" # specify port mapping
    extra_hosts:
      - "dockerhost:<yourIP>"

इस तरह, आपका कंटेनर आपके होस्ट तक पहुंचने में सक्षम होगा। अपने DB तक पहुँचते समय, पहले निर्दिष्ट नाम का उपयोग करना याद रखें, इस मामले में "dockerhost" और आपके होस्ट का पोर्ट जिसमें DB चल रहा है


HaProxy में, इस समाधान ने acl के किसी कारण से काम करना बंद कर दिया है, केवल डिफ़ॉल्ट सेटिंग काम कर रही है।
HyukHyukBoi

1
एकमात्र समाधान जो एक लिनक्स सिस्टम पर काम करता है। +1
रफीक फरहाद

11

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


2
यह काम करता हैं। यहां तक ​​कि निर्दिष्ट करने की कोई आवश्यकता नहीं है - नेटवर्क = होस्ट। ऐसा प्रतीत होता है कि 10.0.2.2 होस्ट के लिए डिफ़ॉल्ट IP के रूप में सेट है। धन्यवाद।
TheManish

लेकिन, क्या मैं विंडोज और मैक के सभी संस्करणों के लिए इस स्थिर आईपी का उपयोग कर सकता हूं?, मैं इसे स्क्रिप्ट के माध्यम से कई प्लेटफार्मों के लिए कैसे संभाल सकता हूं?
151291

इसने मेरे लिए काम किया। बस अपने होस्ट (विंडोज़) पर ipconfig चलाएं और Ethernet adapter vEthernet (DockerNAT)
केहाट्स के

10

विंडोज पर उन लोगों के लिए, मान लें कि आप ब्रिज नेटवर्क ड्राइवर का उपयोग कर रहे हैं, आप विशेष रूप से MySQL को हाइपर-वी नेटवर्क इंटरफेस के आईपी पते से बांधना चाहेंगे।

यह सामान्य रूप से छिपे हुए C: \ ProgramData \ MySQL फ़ोल्डर के तहत कॉन्फ़िगरेशन फ़ाइल के माध्यम से किया जाता है।

0.0.0.0 से बांधने से काम नहीं चलेगा। आवश्यक पता docker कॉन्फ़िगरेशन में भी दिखाया गया है, और मेरे मामले में 10.0.75.1 था।


3
आप एक पदक के लायक हैं! मैं इस पर पूरे दो दिन काम कर रहा हूं। मदद करने के लिए धन्यवाद!
माइकल

1
मैं भी पूरे दो दिन इस पर काम कर रहा था। यह वेब पर एकमात्र जगह है जिसका मैंने उल्लेख किया है। Microsoft इस पर पूरी तरह से चुप है जब यह डॉकटर कंटेनर के भीतर से MSSQL को जोड़ने की बात करता है। यह आपको आश्चर्यचकित करता है कि क्या उन्हें कभी यह खुद काम कर रहा है!
कंटैंगो

8

संपादित करें: मैंने GitHub पर अवधारणा का प्रोटोटाइप तैयार किया। देखें: https://github.com/sivabudh/system-in-a-box


सबसे पहले, मेरा जवाब 2 लोगों के समूह की ओर है: जो लोग मैक का उपयोग करते हैं, और जो लिनक्स का उपयोग करते हैं।

मेजबान नेटवर्क मोड पर एक मैक काम नहीं करता। आपको एक आईपी उपनाम का उपयोग करना होगा, देखें: https://stackoverflow.com/a/43541681/2713729

होस्ट नेटवर्क मोड क्या है? देखें: https://docs.docker.com/engine/reference/run/#/network-settings

दूसरे, आप उन लोगों के लिए जो लिनक्स का उपयोग कर रहे हैं (मेरा सीधा अनुभव उबंटू 14.04 एलटीएस के साथ था और मैं जल्द ही प्रोडक्शन में 16.04 एलटीएस में अपग्रेड कर रहा हूं), हां , आप डॉकटर कंटेनर के अंदर चलने वाली सेवा को कनेक्ट कर सकते हैं।localhost सेवाओं से डॉकर होस्ट (जैसे। आपका लैपटॉप)।

कैसे?

कुंजी तब है जब आप डॉकर कंटेनर चलाते हैं, आपको इसे होस्ट मोड के साथ चलाना होगा । आदेश इस तरह दिखता है:

docker run --network="host" -id <Docker image ID>

जब आप अपने कंटेनर के अंदर एक ifconfig(आपको कॉल करने योग्य होने के apt-get install net-toolsलिए अपने कंटेनर की आवश्यकता होगी ifconfig) करते हैं, तो आप देखेंगे कि नेटवर्क इंटरफेस डॉक होस्ट (जैसे आपका लैपटॉप) पर एक ही है।

यह नोट करना महत्वपूर्ण है कि मैं एक मैक उपयोगकर्ता हूं, लेकिन मैं समानताएं के तहत उबंटू चलाता हूं, इसलिए मैक का उपयोग करना एक नुकसान नहीं है। ;-)

और यह है कि आप कैसे एनजीआईएनएक्स कंटेनर को MySQL पर चला रहे हैं localhost


1
यह नोट करना महत्वपूर्ण है कि होस्ट मोड बेहतर प्रदर्शन प्रदान करता है क्योंकि यह ओएस नेटवर्क स्टैक का उपयोग करता है।
शिवबाबू

2
बहुत अच्छी बात है। यद्यपि अप्रयुक्त IP संलग्न docs.docker.com/docker-for-mac/networking के साथ कंटेनर से होस्ट सेवा से कनेक्ट करना संभव है । सुखद समाधान नहीं ... लेकिन काम करता है।
जेवियर हुप्पे

यहाँ अच्छा सामान। एक बार कंटेनर के साथ अंदर --network="host", उदाहरण के लिए होस्ट mysql से कैसे जुड़ता है?
माइकल

1
@ Buccleuch बस उपयोग करें localhost। मेरा GitHub स्रोत कोड देखें: github.com/sivabudh/system-in-a-box/blob/master/dj_host_docker/… । के लिए खोजें 'HOST', आप Postgresql से कनेक्ट करने के लिए 127.0.0.1 देखेंगे।
शिवाबुध

मैं @ user833482 के अनुसार वॉल्यूम बढ़ाकर होस्ट mysql डेटाबेस तक पहुंच प्राप्त करने में सक्षम था, और कोर्स के डॉकटर कंटेनर पर mysql- क्लाइंट और सर्वर स्थापित करने के बाद।
माइकल

7

मैक OSX के लिए सबसे सरल समाधान

बस अपने मैक के आईपी पते का उपयोग करें। IP पता प्राप्त करने और कंटेनर के भीतर से इसका उपयोग करने के लिए Mac पर इसे चलाएं:

$ ifconfig | grep 'inet 192'| awk '{ print $2}'

जब तक आपके मैक या किसी अन्य डॉकटर कंटेनर में स्थानीय रूप से चलने वाला सर्वर 0.0.0.0 को सुन रहा है, तब तक डॉकटर कंटेनर उस पते पर पहुंचने में सक्षम होगा।

यदि आप सिर्फ एक और डॉकटर कंटेनर का उपयोग करना चाहते हैं जो 0.0.0.0 पर सुन रहा है तो आप 172.17.0.1 का उपयोग कर सकते हैं


1
मैक के लिए डॉकर docker.for.mac.host.internalअब होस्टनाम को उजागर करता है ।
मैट

5

यह वास्तविक प्रश्न का उत्तर नहीं है। इसी तरह से मैंने इसी तरह की समस्या को हल किया। समाधान पूरी तरह से आता है: डॉकटर कंटेनर नेटवर्किंग को परिभाषित करें ताकि कंटेनर संवाद कर सकें । धन्यवाद निक राबॉय को

दूसरों के लिए यहां छोड़ना, जो एक कंटेनर और दूसरे के बीच REST कॉल करना चाहते हैं। प्रश्न का उत्तर दें: एक डॉकटर वातावरण में लोकलहोस्ट के स्थान पर क्या उपयोग करें?

आपका नेटवर्क कैसा दिखता है docker network ls

एक नया नेटवर्क बनाएँ docker network create -d my-net

पहला कंटेनर शुरू करें docker run -d -p 5000:5000 --network="my-net" --name "first_container" <MyImage1:v0.1>

पहले कंटेनर के लिए नेटवर्क सेटिंग्स देखें docker inspect first_container। "नेटवर्क": 'मेरा नेट' होना चाहिए

दूसरा कंटेनर शुरू करें docker run -d -p 6000:6000 --network="my-net" --name "second_container" <MyImage2:v0.1>

दूसरे कंटेनर के लिए नेटवर्क सेटिंग्स देखें docker inspect second_container। "नेटवर्क": 'मेरा नेट' होना चाहिए

अपने दूसरे कंटेनर में ssh docker exec -it second_container shया docker exec -it second_container bash

दूसरे कंटेनर के अंदर, आप पहले कंटेनर को पिंग कर सकते हैं ping first_container। इसके अलावा, आपके कोड कॉल जैसे कि http://localhost:5000द्वारा प्रतिस्थापित किया जा सकता हैhttp://first_container:5000


ठीक वही जो मेरे द्वारा खोजा जा रहा था।
साभार

5

विंडोज के लिए,

मैंने डेटाबेस url को स्प्रिंग कॉन्फ़िगरेशन में बदल दिया है: spring.datasource.url=jdbc:postgresql://host.docker.internal:5432/apidb

फिर छवि बनाएं और चलाएं। इसने मेरे लिए काम किया।


दिलचस्प ....
फिल

मेरे लिए काम नहीं करता। मेरे पास मैक है और लोकलहोस्ट mysql से कनेक्ट करने के लिए php कंटेनर से कोशिश कर रहा हूं। कोई उपाय ?
ए। ज़ालोनिस

4

मैं थॉमसलेविल के जवाब से असहमत हूं।

172.17.42.1 को mysql बाइंड बनाना मेजबान तक डेटाबेस का उपयोग करने वाले अन्य कार्यक्रमों को उस तक पहुंचने से रोकेगा। यह केवल तभी काम करेगा जब आपके सभी डेटाबेस उपयोगकर्ता डॉकटराइज हो जाएं।

Mysql को 0.0.0.0 से बाँधने से db बाहरी दुनिया के लिए खुल जाएगा, जो न केवल बहुत बुरी बात है, बल्कि यह भी है कि मूल प्रश्न लेखक क्या करना चाहता है। वह स्पष्ट रूप से कहते हैं, "MySql लोकलहोस्ट पर चल रहा है और बाहरी दुनिया के लिए पोर्ट को उजागर नहीं कर रहा है, इसलिए इसकी लोकल लोकल"

Ivant की टिप्पणी का उत्तर देने के लिए

"क्यों नहीं mysql को docker0 के रूप में अच्छी तरह से बाँधें?"

यह नहीं हो सकता। Mysql / mariadb प्रलेखन स्पष्ट रूप से कहता है कि कई इंटरफेस को बांधना संभव नहीं है। आप केवल 0, 1, या सभी इंटरफ़ेस से बाइंड कर सकते हैं।

निष्कर्ष के रूप में, मुझे डॉकटर कंटेनर से होस्ट पर (केवल लोकलहोस्ट) डेटाबेस तक पहुंचने का कोई रास्ता नहीं मिला है। यह निश्चित रूप से एक बहुत ही सामान्य पैटर्न की तरह लगता है, लेकिन मुझे नहीं पता कि यह कैसे करना है।


4
डॉक होस्ट से आप 172.17.42.1पते का उपयोग करके अभी भी MySQL सर्वर से जुड़ सकते हैं । लेकिन आपका नोट सही है अन्यथा। एसो, मैंने अपने जवाब को hostनेटवर्किंग मोड के साथ संपादित किया जो कि MySQL सर्वर 127.0.0.1को इसे कनेक्ट करने की अनुमति देते समय बाध्य रखने की अनुमति देता है
थॉमसलेविल

नहीं, जैसा कि मैंने कहा, अगर आप mysql localhost के लिए बाध्य हैं, तो आप 172.17.42.1 से कनेक्ट नहीं हो सकते।
orzel

4
"172.17.42.1 को mysql बाइंड बनाना मेजबान तक डेटाबेस का उपयोग करने वाले अन्य कार्यक्रमों को उस तक पहुंचने से रोकेगा।" - वह सत्य नहीं है। अन्य प्रोग्राम mysql का उपयोग कर सकते हैं, उन्हें बस लोकलहोस्ट / 127.0.0.1 के बजाय 172.17.42.1 से कनेक्ट करना होगा।
0x89

इस उत्तर में समस्या का समाधान आमतौर पर MySQL सर्वर को बाइंड करने के लिए मिलता है 0.0.0.0और फिर एक फ़ायरवॉल सेट किया जाता है ताकि db इंटरनेट से सुलभ न हो।
halfer

4

यहाँ मेरा समाधान है: यह मेरे मामले के लिए काम करता है

  • #bind-address = 127.0.0.1 /etc/mysql/mysql.conf.d में टिप्पणी द्वारा सार्वजनिक उपयोग के लिए स्थानीय mysql सर्वर सेट करें

  • mysql सर्वर को पुनरारंभ करें sudo /etc/init.d/mysql restart

  • किसी भी होस्ट को उपयोगकर्ता रूट एक्सेस खोलने के लिए निम्न कमांड चलाएँ mysql -uroot -proot GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; FLUSH PRIVILEGES;

  • sh स्क्रिप्ट बनाएं: run_docker.sh

    #! Bin / bash

    HOSTIP = `ip -4 Addr स्कोप ग्लोबल देव eth0 | grep inet | awk '{प्रिंट \ $ 2}' | cut -d / -f 1`


      docker run -it -d --name वेब-ऐप \
                  --add- होस्ट = स्थानीय: $ {HOSTIP} \
                  -पी 8080: 8080 \
                  -ए DATABASE_HOST = $ {HOSTIP} \
                  -ए DATABASE_PORT = 3306 \ _
                  -E DATABASE_NAME = डेमो \
                  -ए DATABASE_USER = रूट \
                  -ए DATABASE_PASSWORD = रूट \
                  sopheamak / springboot_docker_mysql

  
  • डॉक-कंपोजर के साथ दौड़ें

    संस्करण: '2.1'

    सेवाएं:
    tomcatwar: extra_hosts: - "स्थानीय: 10.1.2.232" छवि: सोफ़ेमाक / स्प्रिंगबूट_डॉकर_माइस्कल
    बंदरगाहों: - 8080: 8080 वातावरण: - DATABASE_HOST = स्थानीय - DATABASE_USER = रूट - DATABASE_PASSWORD = रूट - DATABASE_NAME = डेमो - DATABASE_PORT = 3306


4

कई समाधान दिमाग में आते हैं:

  1. पहले कंटेनरों में अपनी निर्भरता को स्थानांतरित करें
  2. अपनी अन्य सेवाओं को बाहरी रूप से सुलभ बनाएं और उन्हें उस बाहरी आईपी से कनेक्ट करें
  3. नेटवर्क अलगाव के बिना अपने कंटेनरों को चलाएं
  4. नेटवर्क पर कनेक्ट करने से बचें, एक सॉकेट का उपयोग करें जो इसके बजाय वॉल्यूम के रूप में माउंट किया गया है

इसका कारण यह नहीं है कि बॉक्स डिफ़ॉल्ट रूप से अपने नेटवर्क नेमस्पेस के साथ चलते हैं। इसका मतलब है कि लोकलहोस्ट (या लूपबैक इंटरफेस की ओर इशारा करते हुए 127.0.0.1) प्रति कंटेनर अद्वितीय है। इससे जुड़ने से कंटेनर खुद से कनेक्ट हो जाएगा, न कि डॉकटर के बाहर या अलग डॉकटर कंटेनर के बाहर चलने वाली सेवाएं।

विकल्प 1 : यदि आपकी निर्भरता को एक कंटेनर में स्थानांतरित किया जा सकता है, तो मैं यह पहले करूंगा। यह आपके एप्लिकेशन को पोर्टेबल बनाता है क्योंकि अन्य आपके कंटेनर को अपने स्वयं के वातावरण पर चलाने का प्रयास करते हैं। और आप अभी भी अपने होस्ट पर पोर्ट प्रकाशित कर सकते हैं जहां अन्य सेवाएं जो माइग्रेट नहीं की गई हैं, अभी भी उस तक पहुंच सकती हैं। आप प्रकाशित पोर्ट के लिए जैसे सिंटैक्स के साथ बाहरी रूप से सुलभ होने से बचने के लिए अपने डॉक होस्ट पर लोकलहोस्ट इंटरफेस पर पोर्ट प्रकाशित कर सकते हैं -p 127.0.0.1:3306:3306

विकल्प 2 : कंटेनर के अंदर से होस्ट आईपी पते का पता लगाने के कई तरीके हैं, लेकिन प्रत्येक के पास सीमित संख्या में परिदृश्य हैं जहां वे काम करते हैं (जैसे मैक के लिए डॉकर की आवश्यकता होती है)। सबसे पोर्टेबल विकल्प आपके मेजबान आईपी को पर्यावरण चर या कॉन्फ़िगरेशन फ़ाइल जैसे कुछ के साथ कंटेनर में इंजेक्ट करना है, जैसे:

docker run --rm -e "HOST_IP=$(ip r s 0/0 | awk '{print $3}')" ...

इसके लिए यह आवश्यक है कि आपकी सेवा उस बाहरी इंटरफ़ेस पर सुन रही है, जो एक सुरक्षा चिंता का विषय हो सकता है। कंटेनर के अंदर से होस्ट आईपी पता प्राप्त करने के अन्य तरीकों के लिए, इस पोस्ट को देखें

विकल्प 3 : बिना नेटवर्क आइसोलेशन के रनिंग करना --net host, मतलब आपका एप्लिकेशन होस्ट नेटवर्क नेमस्पेस पर चल रहा है। यह कंटेनर के लिए कम अलगाव है, और इसका मतलब है कि आप DNS के साथ एक साझा डॉक नेटवर्क पर अन्य कंटेनरों तक नहीं पहुंच सकते हैं (इसके बजाय, आपको अन्य कंटेनरीकृत अनुप्रयोगों तक पहुंचने के लिए प्रकाशित बंदरगाहों का उपयोग करने की आवश्यकता है)। लेकिन उन अनुप्रयोगों के लिए जिन्हें होस्ट पर अन्य सेवाओं तक पहुंचने की आवश्यकता है जो केवल 127.0.0.1होस्ट पर सुन रहे हैं , यह सबसे आसान विकल्प हो सकता है।

विकल्प 4 : विभिन्न सेवाएं फाइलसिस्टम आधारित सॉकेट पर भी पहुँच प्रदान करती हैं। इस सॉकेट को कंटेनर में एक बंधे माउंटेड वॉल्यूम के रूप में लगाया जा सकता है, जिससे आप नेटवर्क पर जाने के बिना होस्ट सेवा तक पहुंच सकते हैं। डॉक इंजन तक पहुंचने के लिए, आप अक्सर /var/run/docker.sockकंटेनर में बढ़ते हुए उदाहरण देखते हैं (उस कंटेनर रूट को होस्ट तक पहुंच देते हैं)। Mysql के साथ, आप कुछ पसंद कर सकते हैं -v /var/run/mysqld/mysqld.sock:/var/run/mysqld/mysql.sockऔर फिर localhostmysql सॉकेट का उपयोग करने के लिए कनवर्ट करता है।


3

आप अल्पाइन छवि का उपयोग करके होस्ट आईपी प्राप्त कर सकते हैं

docker run --rm alpine ip route | awk 'NR==1 {print $3}'

यह अधिक सुसंगत होगा क्योंकि आप कमांड चलाने के लिए हमेशा अल्पाइन का उपयोग कर रहे हैं।

मारियानो के जवाब के समान आप एक पर्यावरण चर सेट करने के लिए एक ही कमांड का उपयोग कर सकते हैं

DOCKER_HOST=$(docker run --rm alpine ip route | awk 'NR==1 {print $3}') docker-compose up

3

लिनक्स के लिए, जहां आप इंटरफ़ेस को नहीं बदल सकते हैं, लोकलहोस्ट सेवा को बांधता है

दो समस्याएं हैं जिन्हें हमें हल करने की आवश्यकता है

  1. होस्ट का आईपी प्राप्त करना
  2. डॉकर को हमारी लोकलहोस्ट सेवा उपलब्ध कराना

पहली समस्या को क्यूमोन की डॉकटर -होस्ट छवि का उपयोग करके हल किया जा सकता है , जैसा कि अन्य उत्तरों द्वारा दिया गया है।

आपको इस कंटेनर को अपने अन्य कंटेनर के समान ब्रिज नेटवर्क में जोड़ना होगा ताकि आप इसे एक्सेस कर सकें। अपने कंटेनर के अंदर एक टर्मिनल खोलें और सुनिश्चित करें कि आप पिंग कर सकते हैं dockerhost

bash-5.0# ping dockerhost
PING dockerhost (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.523 ms

अब, कठिन समस्या, सेवा को सुलभ बनाने के लिए।

हम टेलनेट का उपयोग यह जांचने के लिए कर सकते हैं कि क्या हम होस्ट पर पोर्ट एक्सेस कर सकते हैं (आपको इसे स्थापित करने की आवश्यकता हो सकती है)।

समस्या यह है कि हमारा कंटेनर केवल उन सेवाओं तक पहुंच बना सकेगा जो सभी इंटरफेस से बंधे हों, जैसे कि SSH:

bash-5.0# telnet dockerhost 22
SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3

लेकिन केवल लोकलहोस्ट से जुड़ी सेवाएं ही दुर्गम होंगी:

bash-5.0# telnet dockerhost 1025
telnet: can't connect to remote host (172.20.0.2): Connection refused

यहाँ उचित समाधान सेवा को डॉकर्स ब्रिज नेटवर्क से बाँधने के लिए होगा। हालाँकि, यह उत्तर मानता है कि आपके लिए इसे बदलना संभव नहीं है। इसलिए हम इसके बजाय उपयोग करेंगे iptables

सबसे पहले, हमें उस पुल नेटवर्क का नाम खोजने की जरूरत है, जिसे docker उपयोग कर रहा है ifconfig। यदि आप एक अनाम पुल का उपयोग कर रहे हैं, तो यह बस होगा docker0। हालाँकि, यदि आप एक नामित नेटवर्क का उपयोग कर रहे हैं, तो आपके पास एक पुल शुरू br-होगा जो उस docker के बजाय उपयोग कर रहा होगा। मेरा है br-5cd80298d6f4

एक बार जब हमारे पास इस पुल का नाम आ जाता है, तो हमें इस पुल से लोकलहोस्ट की ओर जाने की अनुमति देनी होगी। यह सुरक्षा कारणों से डिफ़ॉल्ट रूप से अक्षम है:

sysctl -w net.ipv4.conf.<bridge_name>.route_localnet=1

अब हमारे iptablesशासन को स्थापित करने के लिए। चूँकि हमारा कंटेनर केवल docker ब्रिज नेटवर्क पर पोर्ट एक्सेस कर सकता है, हम यह दिखावा करने जा रहे हैं कि हमारी सेवा वास्तव में इस नेटवर्क पर पोर्ट के लिए बाध्य है।

ऐसा करने के लिए, हम सभी अनुरोधों को अग्रेषित करेंगे <docker_bridge>:portकरने के लिएlocalhost:port

iptables -t nat -A PREROUTING -p tcp -i <docker_bridge_name> --dport <service_port> -j DNAT --to-destination 127.0.0.1:<service_port>

उदाहरण के लिए, पोर्ट 1025 पर मेरी सेवा के लिए

iptables -t nat -A PREROUTING -p tcp -i br-5cd80298d6f4 --dport 1025 -j DNAT --to-destination 127.0.0.1:1025

अब आपको कंटेनर से अपनी सेवा तक पहुंचने में सक्षम होना चाहिए:

bash-5.0# telnet dockerhost 1025
220 127.0.0.1 ESMTP Service Ready

1
यह वही है जो @ रे-डी ने ऊपर उल्लेख किया है, लेकिन अच्छी तरह से समझाया गया है। धन्यवाद! इसके अतिरिक्त, जब docker-compose का उपयोग करते हैं, तो मुझे docker0 इंटरफ़ेस पर आने वाले सभी पैकेटों के लिए PREROUTING श्रृंखला में DNAT नियम भी जोड़ना पड़ता है: क्योंकि, docker-compose बिल्ड के दौरान docker0 का उपयोग करते हुए प्रतीत होते हैं (रन के दौरान नहीं, आश्चर्यजनक रूप से): sysctl -w net.ipv4.conf.docker0.route_localnet=1औरiptables -t nat -A PREROUTING -p tcp -i docker0 --dport 1025 -j DNAT --to-destination 127.0.0.1:1025
arvindd

2

कंटेनर इकोसिस्टम में सीजीग्रुप और नेमस्पेस प्रमुख भूमिका निभा रहे हैं।

नाम स्थान अलगाव की एक परत प्रदान करता है। प्रत्येक कंटेनर एक अलग नामस्थान में चलता है और इसकी पहुंच उस नाम स्थान तक सीमित है। Cgroups प्रत्येक कंटेनर के संसाधन उपयोग को नियंत्रित करता है, जबकि Namespace नियंत्रित करता है कि कोई प्रक्रिया संबंधित संसाधन को क्या देख और एक्सेस कर सकती है।

यहाँ समाधान दृष्टिकोण की मूल समझ है जिसका आप अनुसरण कर सकते हैं,

नेटवर्क नेमस्पेस का उपयोग करें

जब कंटेनर छवि से बाहर निकलता है, तो एक नेटवर्क इंटरफ़ेस परिभाषित होता है और बनाता है। यह कंटेनर को अद्वितीय IP पता और इंटरफ़ेस देता है।

$ docker run -it alpine ifconfig

नाम स्थान को होस्ट करने के लिए बदलकर, cotainers नेटवर्क इसके इंटरफ़ेस से अलग नहीं रहता है, इस प्रक्रिया में होस्ट मशीनों नेटवर्क इंटरफ़ेस तक पहुंच होगी।

$ docker run -it --net=host alpine ifconfig

यदि प्रक्रिया बंदरगाहों पर सुनती है, तो उन्हें होस्ट इंटरफ़ेस पर सुना जाएगा और कंटेनर में मैप किया जाएगा।

PID नाम स्थान का उपयोग करें Pid नाम स्थान को बदलकर एक कंटेनर को उसके सामान्य दायरे से परे अन्य प्रक्रिया के साथ सहभागिता करने की अनुमति देता है।

यह कंटेनर अपने स्वयं के नामस्थान में चलेगा।

$ docker run -it alpine ps aux

नामस्थान को होस्ट में बदलकर, कंटेनर सिस्टम पर चलने वाली अन्य सभी प्रक्रियाओं को भी देख सकता है।

$ docker run -it --pid=host alpine ps aux

नेमस्पेस साझा कर रहा है

उत्पादन में ऐसा करने के लिए यह एक बुरा अभ्यास है क्योंकि आप कंटेनर सुरक्षा मॉडल से बाहर निकल रहे हैं जो कमजोरियों के लिए खुल सकता है, और ईव्सड्रोपर तक आसानी से पहुंच सकता है। यह केवल डिबगिंग टूल और कंटेनर सुरक्षा में खामियों को समझने के लिए है।

पहला कंटेनर nginx सर्वर है। यह एक नया नेटवर्क बनाएगा और नाम स्थान की प्रक्रिया करेगा। यह कंटेनर नव निर्मित नेटवर्क इंटरफेस को पोर्ट करने के लिए 80 पर ही बांध देगा।

$ docker run -d --name http nginx:alpine

एक अन्य कंटेनर अब इस नाम स्थान का पुन: उपयोग कर सकता है,

$ docker run --net=container:http mohan08p/curl curl -s localhost

इसके अलावा, यह कंटेनर एक साझा कंटेनर में प्रक्रियाओं के साथ इंटरफ़ेस देख सकता है।

$ docker run --pid=container:http alpine ps aux

यह आपको एप्लिकेशन को बदलने या पुनरारंभ किए बिना कंटेनरों को अधिक विशेषाधिकार देने की अनुमति देगा। उसी तरह से आप होस्ट पर mysql से कनेक्ट कर सकते हैं, चला सकते हैं और अपने आवेदन को डिबग कर सकते हैं। लेकिन, इसकी इस तरह से जाने की सिफारिश नहीं है। आशा है ये मदद करेगा।


2

आपको प्रवेश द्वार को जानने की आवश्यकता है ! स्थानीय सर्वर के साथ मेरा समाधान इसे उजागर करना था 0.0.0.0:8000, फिर सबनेट के साथ डॉक को चलाएं और जैसे कंटेनर को चलाएं :

docker network create --subnet=172.35.0.0/16 --gateway 172.35.0.1 SUBNET35
docker run -d -p 4444:4444 --net SUBNET35 <container-you-want-run-place-here>

तो, अब आप अपने लूपबैक को एक्सेस कर सकते हैं http://172.35.0.1:8000


2

इसे इस्तेमाल करे:

version: '3.5'
services:
  yourservice-here:
    container_name: container_name
    ports:
      - "4000:4000"
    extra_hosts: # <---- here
      - localhost:192.168.1.202
      - or-vitualhost.local:192.168.1.202

पाने के लिए 192.168.1.202, उपयोग करता हैifconfig

इसने मेरे लिए काम किया। उममीद है कि इससे मदद मिलेगी!


1

विंडोज मशीन के लिए: -

निर्माण समय के दौरान बेतरतीब ढंग से डॉक पोर्ट को बेनकाब करने के लिए नीचे कमांड चलाएँ

$docker run -d --name MyWebServer -P mediawiki

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

उपरोक्त कंटेनर सूची में आप 32768 के रूप में निर्दिष्ट पोर्ट देख सकते हैं। एक्सेस करने का प्रयास करें

localhost:32768 

आप मीडियाविकि पेज देख सकते हैं


5
हालांकि यह उत्तर कुछ उपयोगकर्ताओं को उपयोगी जानकारी प्रदान कर सकता है, लेकिन यह गलत तरीका है ! यह मेजबान मशीन से कंटेनर में चल रही एक सेवा तक पहुंचने के बारे में है । हालांकि, यह सवाल कंटेनर से होस्ट पर चल रही एक सेवा तक पहुंचने के बारे में था ।
आइन्जोहेन

1

जब तक फिक्स को masterशाखा में विलय नहीं किया जाता है, तब तक होस्ट आईपी को कंटेनर के अंदर से चलाने के लिए मिलता है:

ip -4 route list match 0/0 | cut -d' ' -f3

(जैसा कि @ मैहनी ने यहां दिया है )।


1

मैंने कंटेनर के IP के लिए MySQL में एक उपयोगकर्ता बनाकर इसे हल किया:

$ sudo mysql<br>
mysql> create user 'username'@'172.17.0.2' identified by 'password';<br>
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges on database_name.* to 'username'@'172.17.0.2' with grant option;<br>
Query OK, 0 rows affected (0.00 sec)

$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
<br>bind-address        = 172.17.0.1

$ sudo systemctl restart mysql.service

फिर कंटेनर पर: jdbc:mysql://<b>172.17.0.1</b>:3306/database_name


यह सबसे सरल उपाय है। इसने मेरे लिए काम किया है और मैंने
सोपिया अल्फ्रेड

-1

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


क्या आप यह बता सकते हैं कि आप यह कैसे करते हैं? मैं इस दृष्टिकोण का प्रयास किया था, लेकिन ज्यादा सफलता नहीं मिली
kmjb

`docker run -i -t -e HOST = 10.145.2.123 ubuntu रूट @ Ce2a843da3ee: / tmp # ./telnet $ HOST 22 10.15.2.123 की कोशिश कर रहा है ... 10.15.2.123 से जुड़ा। पलायन चरित्र '^] है। SSH-2.0-OpenSSH_7.4`
F. Kam
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.