संपादित करें: यदि आप 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_IP
MySQL से कनेक्शन खोलने के लिए पर्यावरण चर का उपयोग करें ।
नोट: यदि आप bind-address = 0.0.0.0
अपने MySQL सर्वर का उपयोग करते हैं तो सभी नेटवर्क इंटरफेस पर कनेक्शन के लिए सुनेंगे। इसका मतलब है कि आपका MySQL सर्वर इंटरनेट से पहुँचा जा सकता है; तदनुसार फ़ायरवॉल नियमों को स्थापित करना सुनिश्चित करें।
नोट 2: यदि आप bind-address = 172.17.42.1
अपने MySQL सर्वर का उपयोग करते हैं तो किए गए कनेक्शन के लिए नहीं सुनेंगे 127.0.0.1
। डॉक होस्ट पर चलने वाली प्रक्रियाएँ जो MySQL से जुड़ना चाहेंगी, उन्हें 172.17.42.1
IP पते का उपयोग करना होगा ।
होस्ट मोड
होस्ट मोड में कंटेनरों से होस्ट करने वाले 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 क्लाइंट एक यूनिक्स सॉकेट का उपयोग करके कनेक्ट करने का प्रयास करेगा।