डॉकर में Nginx को होस्ट मशीन पर लोकलहोस्ट MySQL से कनेक्ट करना

डॉकर में Nginx को होस्ट मशीन पर लोकलहोस्ट MySQL से कनेक्ट करना
Shell

डॉकर कंटेनर्स से लोकलहोस्ट सेवाओं तक पहुँचना

होस्ट मशीन पर MySQL इंस्टेंस से कनेक्ट करने की आवश्यकता के दौरान डॉकर कंटेनर के अंदर Nginx चलाना चुनौतीपूर्ण हो सकता है, खासकर जब MySQL केवल लोकलहोस्ट से जुड़ा हो। यह सेटअप मानक नेटवर्किंग विधियों का उपयोग करके कंटेनर को सीधे MySQL सेवा तक पहुंचने से रोकता है।

यह लेख इस अंतर को पाटने के लिए विभिन्न समाधानों की खोज करता है, जिससे डॉकर कंटेनरों और होस्ट के लोकलहोस्ट पर चलने वाली सेवाओं के बीच निर्बाध कनेक्टिविटी की अनुमति मिलती है। हम चर्चा करेंगे कि सामान्य तरीके क्यों कम पड़ सकते हैं और वांछित कनेक्टिविटी प्राप्त करने के लिए व्यावहारिक कदम प्रदान करेंगे।

आज्ञा विवरण
docker network create --driver bridge hostnetwork ब्रिज ड्राइवर के साथ एक कस्टम डॉकर नेटवर्क बनाता है, जो कंटेनरों को एक ही नेटवर्क के भीतर संचार करने की अनुमति देता है।
host_ip=$(ip -4 addr show docker0 | grep -oP '(? होस्ट के docker0 इंटरफ़ेस का IP पता निकालता है, जिसका उपयोग कंटेनर से होस्ट सेवाओं से कनेक्ट करने के लिए किया जाता है।
docker exec -it nginx-container bash सीधे कमांड-लाइन एक्सेस के लिए चल रहे Nginx कंटेनर के अंदर एक इंटरैक्टिव बैश शेल निष्पादित करता है।
mysql -h $host_ip -u root -p निकाले गए आईपी पते का उपयोग करके होस्ट मशीन पर चल रहे MySQL सर्वर से कनेक्ट करने के लिए Nginx कंटेनर के अंदर कमांड का उपयोग किया जाता है।
networks: hostnetwork: external: true बाहरी रूप से निर्मित डॉकर नेटवर्क का उपयोग करने के लिए डॉकर कंपोज़ में कॉन्फ़िगरेशन।
echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" >echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf होस्ट मशीन पर प्रॉक्सी MySQL अनुरोधों के लिए एक नया Nginx कॉन्फ़िगरेशन लिखता है।
nginx -s reload नए कॉन्फ़िगरेशन परिवर्तन लागू करने के लिए Nginx सेवा को पुनः लोड करता है।

होस्ट सेवाओं तक पहुँचने के लिए Docker और Nginx को कॉन्फ़िगर करना

Nginx कंटेनर को होस्ट पर चल रहे MySQL इंस्टेंस से कनेक्ट करने के लिए, हमें सबसे पहले एक नेटवर्क ब्रिज स्थापित करना होगा। आदेश docker network create --driver bridge hostnetwork यह कस्टम नेटवर्क बनाता है, जो एक ही नेटवर्क पर कंटेनरों के बीच संचार को सक्षम बनाता है। फिर हम इस नेटवर्क पर MySQL और Nginx कंटेनर का उपयोग शुरू करते हैं docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest और docker run --name nginx-container --network hostnetwork -d nginx:latest, क्रमश। यह सेटअप कंटेनरों को एक-दूसरे को खोजने और संवाद करने की अनुमति देता है। Nginx से MySQL से कनेक्ट करने के लिए, हमें होस्ट के IP पते की आवश्यकता होती है, जिसे प्राप्त किया जा सकता है host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). यह कमांड होस्ट पर docker0 इंटरफ़ेस का आईपी पता कैप्चर करता है।

अगला, हम उपयोग करते हैं docker exec -it nginx-container bash Nginx कंटेनर में एक इंटरैक्टिव शेल खोलने के लिए। यहां से, हम एक MySQL कनेक्शन का उपयोग शुरू कर सकते हैं mysql -h $host_ip -u root -p, कहाँ $host_ip होस्ट का IP पता है. वैकल्पिक रूप से, डॉकर कंपोज़ का उपयोग YAML फ़ाइल में सेवाओं और नेटवर्क को परिभाषित करके प्रक्रिया को सरल बनाता है। networks: hostnetwork: external: true कॉन्फ़िगरेशन यह सुनिश्चित करता है कि सेवाएँ बाहरी रूप से निर्मित नेटवर्क का उपयोग करें। अंत में, Nginx को प्रॉक्सी MySQL अनुरोधों में कॉन्फ़िगर करने के लिए, हम इसकी कॉन्फ़िगरेशन फ़ाइल को अपडेट करते हैं echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf और Nginx का उपयोग करके पुनः लोड करें nginx -s reload. यह सेटअप Nginx को होस्ट पर चल रहे MySQL इंस्टेंस के लिए अनुरोध अग्रेषित करने की अनुमति देता है।

नेटवर्क ब्रिज के माध्यम से डॉकर कंटेनर को होस्ट के MySQL से कनेक्ट करना

डॉकर नेटवर्क सेटअप के लिए शेल स्क्रिप्ट

# Create a Docker network
docker network create --driver bridge hostnetwork

# Run MySQL container with the created network
docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest

# Run Nginx container with the created network
docker run --name nginx-container --network hostnetwork -d nginx:latest

# Get the host machine's IP address
host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')

# Connect to MySQL from within the Nginx container
docker exec -it nginx-container bash
mysql -h $host_ip -u root -p

Nginx और होस्ट के MySQL को लिंक करने के लिए डॉकर कंपोज़ का उपयोग करना

डॉकर कंपोज़ YAML कॉन्फ़िगरेशन

version: '3.8'

services:
  nginx:
    image: nginx:latest
    container_name: nginx-container
    networks:
      - hostnetwork

  mysql:
    image: mysql:latest
    container_name: mysql-container
    environment:
      MYSQL_ROOT_PASSWORD: root
    networks:
      - hostnetwork

networks:
  hostnetwork:
    external: true

डॉकर नेटवर्क का उपयोग करके होस्ट MySQL से कनेक्ट करने के लिए Nginx को कॉन्फ़िगर करना

Nginx कॉन्फ़िगरेशन और डॉकर नेटवर्क कमांड

# Create a bridge network
docker network create bridge-network

# Run Nginx container with bridge network
docker run --name nginx-container --network bridge-network -d nginx:latest

# Run MySQL container on the host network
docker run --name mysql-container --network host -e MYSQL_ROOT_PASSWORD=root -d mysql:latest

# Update Nginx configuration to point to MySQL host
docker exec -it nginx-container bash
echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf
nginx -s reload

स्थानीय सेवाओं को होस्ट करने के लिए डॉकर कंटेनरों को जोड़ना

डॉकर कंटेनरों में एप्लिकेशन चलाते समय, नेटवर्क अलगाव के कारण होस्ट के लोकलहोस्ट से जुड़ी सेवाओं तक पहुंच चुनौतीपूर्ण हो सकती है। एक प्रभावी तरीका डॉकर के होस्ट नेटवर्किंग मोड का उपयोग करना है। के साथ एक कंटेनर प्रारंभ करके --network host विकल्प, कंटेनर होस्ट के नेटवर्क स्टैक को साझा करता है, जिससे वह सीधे लोकलहोस्ट-बाउंड सेवाओं तक पहुंच प्राप्त कर सकता है। हालाँकि, यह मोड कम पोर्टेबल है और डॉकर स्वार्म या कुबेरनेट्स जैसे सभी वातावरणों में अच्छी तरह से काम नहीं कर सकता है।

दूसरा तरीका डॉकर के अंतर्निहित DNS रिज़ॉल्वर का उपयोग करना है, host.docker.internal. यह विशेष DNS नाम होस्ट के आईपी पते को हल करता है, जिससे कंटेनर होस्ट पर सेवाओं के साथ संचार करने में सक्षम होते हैं। यह विधि सीधी है और नेटवर्क प्रबंधन की जटिलताओं से बचाती है। हालाँकि, यह केवल विंडोज़ और मैक के लिए डॉकर पर उपलब्ध है, लिनक्स पर नहीं। लिनक्स उपयोगकर्ताओं के लिए, एक कस्टम ब्रिज नेटवर्क बनाना और रूटिंग नियमों को मैन्युअल रूप से कॉन्फ़िगर करना एक व्यवहार्य समाधान है। इसमें का उपयोग करना शामिल है ip और iptables कंटेनर नेटवर्क से होस्ट के लोकलहोस्ट इंटरफ़ेस तक ट्रैफ़िक को रूट करने का आदेश।

डॉकर कंटेनरों को होस्ट सेवाओं से जोड़ने के बारे में सामान्य प्रश्न

  1. मैं इसका उपयोग कैसे करूँ --network host डॉकर में विकल्प?
  2. अपने कंटेनर को इसके साथ चलाएं docker run --network host होस्ट के नेटवर्क स्टैक को साझा करने के लिए।
  3. क्या है host.docker.internal?
  4. यह एक विशेष DNS नाम है जो होस्ट के आईपी पते को हल करता है, जो विंडोज़ और मैक के लिए डॉकर पर उपलब्ध है।
  5. क्या मैं उपयोग कर सकता हूँ host.docker.internal लिनक्स पर?
  6. नहीं, यह सुविधा लिनक्स के लिए डॉकर पर उपलब्ध नहीं है।
  7. मैं एक कस्टम ब्रिज नेटवर्क कैसे बना सकता हूँ?
  8. उपयोग docker network create --driver bridge my-bridge-network एक कस्टम ब्रिज नेटवर्क बनाने के लिए।
  9. का उद्देश्य क्या है iptables आज्ञा?
  10. यह लिनक्स सिस्टम पर नेटवर्क पैकेट फ़िल्टरिंग और रूटिंग नियमों का प्रबंधन करता है।
  11. मैं डॉकर कंटेनर से होस्ट पर MySQL इंस्टेंस से कैसे जुड़ सकता हूँ?
  12. उपयोग mysql -h host.docker.internal -u root -p विंडोज़/मैक पर डॉकर के लिए या लिनक्स के लिए रूटिंग कॉन्फ़िगर करें।
  13. उपयोग की सीमाएँ क्या हैं? --network host?
  14. यह पोर्टेबिलिटी को कम कर सकता है और कुबेरनेट्स जैसे कुछ ऑर्केस्ट्रेटर्स के साथ संगत नहीं है।
  15. क्या मैं MySQL के अलावा होस्ट पर अन्य सेवाओं तक पहुँच सकता हूँ?
  16. हाँ, उन्हीं विधियों का उपयोग करके, आप होस्ट पर चल रही किसी भी सेवा से जुड़ सकते हैं।

डॉकर से होस्ट सेवाओं तक पहुँचने पर अंतिम विचार

Nginx कंटेनर से होस्ट पर MySQL इंस्टेंस से कनेक्ट करने में विभिन्न विधियाँ शामिल होती हैं, जिनमें से प्रत्येक के अपने लाभ और सीमाएँ होती हैं। होस्ट नेटवर्किंग, विशेष डीएनएस नाम या कस्टम नेटवर्क ब्रिज का उपयोग प्रभावी ढंग से अंतर को पाट सकता है, जिससे डॉकर कंटेनर और होस्ट सेवाओं के बीच सुचारू संचार सुनिश्चित हो सकता है। इन रणनीतियों को समझने और कार्यान्वित करके, आप नेटवर्क अलगाव चुनौतियों पर काबू पा सकते हैं और अपने डॉकरीकृत वातावरण में मजबूत कनेक्शन बनाए रख सकते हैं।