क्या डॉक को अंदर से चलाना ठीक है?


184

मैं एक डॉकटर कंटेनर के अंदर जेनकींस चला रहा हूं। मुझे आश्चर्य है कि अगर जेनकींस कंटेनर के लिए भी डॉक होस्ट होना ठीक है? मैं जो सोच रहा हूं वह जेनकिंस (डेटाबेस, संदेश दलालों आदि को शुरू करने के लिए) के अंदर से प्रत्येक एकीकरण परीक्षण के निर्माण के लिए एक नया डॉकटर कंटेनर शुरू करना है। एकीकरण परीक्षण पूरा होने के बाद कंटेनरों को बंद कर दिया जाना चाहिए। क्या इस तरह से एक और डॉक कंटेनर के अंदर से डॉक कंटेनर को चलाने से बचने का कारण है?


11
एक और संभावना कंटेनर में वॉल्यूम के रूप में होस्ट से डॉक सॉकेट को माउंट करने की है। यह आपको "सिबलिंग" कंटेनर बनाने देता है और कैश का पुनः उपयोग करने में सक्षम होने का लाभ देता है।
एड्रियन मौट

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

जवाबों:


224

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

Jérôme Petazzoni - फीचर के लेखक ने डॉकटर के लिए एक डॉक कंटेनर के अंदर चलाने के लिए संभव बना दिया - वास्तव में एक ब्लॉग पोस्ट लिखा था कि यह नहीं करना चाहिए । उपयोग मामला वह वर्णन करता है कि एक डॉक कंटेनर के ओपी के सटीक उपयोग मामले से मेल खाता है जिसे अन्य डॉकटर कंटेनरों के अंदर नौकरी चलाने की आवश्यकता है।

पेटाज़ोनी दो कारणों से सूचीबद्ध करती है कि क्यों परेशान है:

  1. यह लिनक्स सुरक्षा मॉड्यूल (एलएसएम) के साथ अच्छा सहयोग नहीं करता है।
  2. यह फ़ाइल सिस्टम में एक मिसमैच बनाता है जो पेरेंट कंटेनर के अंदर बनाए गए कंटेनरों के लिए समस्याएँ पैदा करता है।

उस ब्लॉग पोस्ट से, वह निम्नलिखित विकल्प का वर्णन करता है,

[] सबसे सरल तरीका यह है कि आप अपने CI कंटेनर में डॉक सॉकेट को केवल -vध्वज के साथ बांधकर उजागर करें ।

सीधे शब्दों में कहें, जब आप अपने CI कंटेनर (जेनकिन्स या अन्य) को शुरू करते हैं, तो डोकर-इन-डॉकर के साथ मिलकर कुछ हैक करने के बजाय, इसे इसके साथ शुरू करें:

docker run -v /var/run/docker.sock:/var/run/docker.sock ...

अब इस कंटेनर में डॉकटर सॉकेट तक पहुंच होगी, और इसलिए कंटेनर शुरू करने में सक्षम होगा। सिवाय इसके कि "बच्चे" कंटेनर शुरू करने के बजाय, यह "सिबलिंग" कंटेनर शुरू करेगा।


1
sudoइस तरह से करते हुए बिना डॉक कमांड को कैसे चलाना है ? धन्यवाद
c4k

3
आपको उपयोगकर्ता को dockerसमूह में जोड़ने की आवश्यकता है sudo usermod -aG docker $USER:। आपको उसके बाद फिर से लिखना होगा।
पूर्वमीत

2
कैसे एक सिक्के के भीतर से फिर से लिखना?
थियागौफ़एक्स

1
@AlexanderMills यह वही है क्योंकि /var/run/docker.sockजब आप अपने मैकोस मशीन पर मैक के लिए डॉक चलाते हैं तो आपका डॉक सॉकेट भी स्थित होता है।
ब्रूस सन

1
खिड़कियों के बारे में क्या? मैं नहीं है/var/run/docker.sock
अब्देलहाफिद

54

मैंने पहले एक ऐसे ही सवाल का जवाब दिया था कि डॉक के अंदर डॉकटर कंटेनर कैसे चलाया जाता है

डॉक के अंदर डॉक चलाने के लिए निश्चित रूप से संभव है। मुख्य बात यह है कि आप अतिरिक्त विशेषाधिकारों केrun साथ बाहरी कंटेनर (शुरुआत के साथ ) और फिर उस कंटेनर में डॉकटर स्थापित करें।--privileged=true

अधिक जानकारी के लिए इस ब्लॉग पोस्ट की जाँच करें: डॉकर-इन-डॉकर

इसके लिए एक संभावित उपयोग का मामला इस प्रविष्टि में वर्णित है । ब्लॉग का वर्णन है कि जेनकींस डॉकटर कंटेनर के भीतर डॉकटर कंटेनरों का निर्माण कैसे किया जाता है।

हालांकि, डॉकर के अंदर डॉकर इस प्रकार की समस्याओं को हल करने के लिए अनुशंसित दृष्टिकोण नहीं है। इसके बजाय, अनुशंसित दृष्टिकोण "सिबलिंग" कंटेनरों का निर्माण करना है जैसा कि इस पोस्ट में वर्णित है

इसलिए, डॉकर के अंदर डॉकर को चलाना कई लोगों द्वारा इस प्रकार की समस्याओं के लिए एक अच्छा प्रकार का समाधान माना गया। अब, ट्रेंड के बजाय "सिबलिंग" कंटेनरों का उपयोग करना है। अधिक जानकारी के लिए इस पृष्ठ पर @predmijat द्वारा उत्तर देखें ।


डॉकटर में डॉकटर से बचने के बारे में नीचे दी गई टिप्पणी देखें।
दान पोल्टास्की

6

Docker-in-Docker (DinD) चलाना ठीक है और वास्तव में Docker (कंपनी) के पास इसके लिए एक आधिकारिक DinD छवि है।

हालांकि चेतावनी यह है कि इसके लिए एक विशेषाधिकार प्राप्त कंटेनर की आवश्यकता होती है, जो आपकी सुरक्षा जरूरतों के आधार पर एक व्यवहार्य विकल्प नहीं हो सकता है।

सिबलिंग कंटेनर (उर्फ डोकर-आउट-ऑफ-डॉकर या डूडी) का उपयोग करके डॉकर को चलाने का वैकल्पिक समाधान एक विशेषाधिकार प्राप्त कंटेनर की आवश्यकता नहीं है, लेकिन इसमें कुछ कमियां हैं जो इस तथ्य से उपजी हैं कि आप कंटेनर को एक संदर्भ के भीतर से लॉन्च कर रहे हैं। उस से अलग जिसमें यह चल रहा है (यानी, आप कंटेनर को कंटेनर के भीतर से लॉन्च करते हैं, फिर भी यह मेजबान के स्तर पर चल रहा है, कंटेनर के अंदर नहीं)।

मैंने यहाँ डीडीडी बनाम डूडी के पेशेवरों / विपक्षों का वर्णन करते हुए एक ब्लॉग लिखा ।

यह कहने के बाद, Nestybox (एक स्टार्टअप जिसे मैंने अभी स्थापित किया है) एक ऐसे समाधान पर काम कर रहा है जो सच्चा डोकर-इन-डॉकर सुरक्षित रूप से (विशेषाधिकार प्राप्त कंटेनरों का उपयोग किए बिना) चलाता है। आप इसे www.nestybox.com पर देख सकते हैं


0

हाँ, हम docker में docker चला सकते हैं, हमें unix sockeet "/var/run/docker.sock" संलग्न करना होगा, जिस पर docker डेमन डिफ़ॉल्ट रूप से पैरेंट docker को वॉल्यूम के रूप में सुनता है "-v / var / run का उपयोग करके। /docker.sock:/var/run/docker.sock "। कभी-कभी, docker डेमन सॉकेट के लिए अनुमतियां जारी हो सकती हैं, जिसके लिए आप "sudo chmod 757 /var/run/docker.sock" लिख सकते हैं।

और यह भी करने के लिए विशेषाधिकार मोड में docker चलाने की आवश्यकता होगी, ताकि आदेश होगा:

सुडो चामोद /५/ / सवर / दार / डॉकर। सॉक

docker run --privileged = true -v /var/run/docker.sock:/var/run/docker.sock -it ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.