आपकी समस्या
डॉकर कंपोज़ विभिन्न सेवाओं के लिए अलग डॉकटर कंटेनर बनाता है। प्रत्येक कंटेनर, तार्किक रूप से, अलग-अलग अलग कंप्यूटर सर्वरों की तरह है जो केवल डॉकटर नेटवर्क के माध्यम से एक दूसरे से जुड़े हुए हैं।
इस आरेख के प्रत्येक बॉक्स को एक व्यक्तिगत कंप्यूटर के रूप में देखें, तो व्यावहारिक रूप से आपके पास यही है:
+----------------------------------------------------------+
| your machine |
+----------------------------------------------------------+
|
+------ (virtual network by docker) -------+
| | |
+-----------------+ +-------------------+ +----------------+
| "php" container | | "redis" container | | "db" container |
+-----------------+ +-------------------+ +----------------+
आपका PHP कंटेनर "लोकलहोस्ट" में कोई रेडिस नहीं देखता है क्योंकि इसमें कोई रेडिस नहीं है। जैसे यह "लोकलहोस्ट" में कोई MySQL नहीं देखेगा। आपका रेडिस "रेडिस" कंटेनर में चल रहा है। आपका MySQL आपके "db" कंटेनर में चल रहा है।
जो चीजें आपको भ्रमित करती हैं, वे हैं पोर्ट बाइंडिंग निर्देश (यानी ports
इस परिभाषा में):
redis:
build:
context: .
dockerfile: Dockerfile_redis
ports:
- "6379:6379"
पोर्ट 6379
"रेडिस" कंटेनर का हिस्सा आपके कंप्यूटर से आबद्ध है, लेकिन केवल आपके कंप्यूटर से . अन्य कंटेनर के पास पोर्ट बाइंडिंग तक समान पहुंच नहीं है। तो आपका कंप्यूटर भी इसे '127.0.0.1:6379', php
. से कनेक्ट कर सकता है कंटेनर ऐसा नहीं कर सकता।
समाधान
जैसा कि डॉकर कंपोज़ में नेटवर्किंग में वर्णित है, प्रत्येक डॉकटर कंपोज़ कंटेनर होस्टनाम के रूप में सेवा नाम का उपयोग करके अन्य कंटेनर तक पहुँच सकता है। उदाहरण के लिए, आपकी प्रोग्रामिंग सेवा द्वारा चल रही है php
होस्टनाम db
. के साथ आपकी MySQL सेवा को एक्सेस कर सकते हैं ।
तो आपको रेडिस को इसके होस्टनाम redis
. से जोड़ना चाहिए
$redis = new \Redis();
try {
$redis->connect('redis', 6379);
} catch (\Exception $e) {
var_dump($e->getMessage()) ;
die;
}