डॉकर-कंपोज़ डिफ़ॉल्ट रूप से वर्चुअल नेटवर्क बनाएगा, कंपोज़ फ़ाइल में सभी कंटेनर/सेवाएं आईपी पते से एक-दूसरे तक पहुंच सकती हैं। links
. का उपयोग करके , depends_on
या नेटवर्क उपनाम वे होस्ट नाम से एक दूसरे तक पहुँच सकते हैं। आपके मामले में होस्ट नाम सेवा का नाम है, लेकिन इसे ओवरराइड किया जा सकता है। (देखें:docs
)
my_common_package
. में आपकी स्क्रिप्ट कंटेनर/सेवा को तब mysql
से कनेक्ट होना चाहिए पोर्ट पर 3306
आपके सेटअप के अनुसार। (नहीं localhost
पोर्ट पर 3306
)
यह भी ध्यान दें कि expose
. का उपयोग करके केवल तभी आवश्यक है जब सेवा के लिए Dockerfile में EXPOSE
. नहीं है बयान। मानक mysql छवि पहले से ही ऐसा करती है।
यदि आप किसी कंटेनर पोर्ट को localhost
में मैप करना चाहते हैं आपको ports
. का उपयोग करने की आवश्यकता है , लेकिन ऐसा केवल तभी करें जब यह आवश्यक हो।
services:
mysql:
image: mysql:5.6
container_name: test_mysql_container
environment:
- MYSQL_ROOT_PASSWORD=test
- MYSQL_DATABASE=My_Database
- MYSQL_USER=my_user
- MYSQL_PASSWORD=my_password
volumes:
- db_data:/var/lib/mysql
ports:
- "3306:3306"
यहां हम कह रहे हैं कि mysql कंटेनर में पोर्ट 3306 को पोर्ट 3306 पर लोकलहोस्ट में मैप किया जाना चाहिए।
अब आप localhost:3306
. का उपयोग करके mysql से जुड़ सकते हैं डॉकटर के बाहर। उदाहरण के लिए आप अपना testsql.py
run चलाने का प्रयास कर सकते हैं स्थानीय रूप से (कंटेनर में नहीं)।
कंटेनर से कंटेनर संचार हमेशा प्रत्येक कंटेनर के होस्ट नाम का उपयोग करके होगा। कंटेनरों को वर्चुअल मशीन के रूप में सोचें।
आप docker network list
. का उपयोग करके बनाए गए नेटवर्क docker-compose को भी ढूंढ सकते हैं :
1b1a54630639 myproject_default bridge local
82498fd930bb bridge bridge local
.. फिर docker network inspect <id>
. का उपयोग करें विवरण देखने के लिए।
कंटेनरों को असाइन किए गए आईपी पते बहुत यादृच्छिक हो सकते हैं, इसलिए कंटेनर से कंटेनर संचार के लिए एकमात्र व्यवहार्य तरीका होस्टनाम का उपयोग करना है।