Docker वर्चुअल मशीन से कैसे अलग है?


3690

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

एक डॉकटर छवि के लिए सॉफ्टवेयर को क्यों तैनात किया जाता है (यदि यह सही शब्द है) बस एक सुसंगत उत्पादन वातावरण को तैनात करने की तुलना में आसान है?


10
Docker बनाम KVM प्रदर्शन विश्लेषण: bodenr.blogspot.com/2014/05/…
HDave

1
यदि आप उनकी छवियों के बीच अंतर खोज रहे हैं - stackoverflow.com/questions/29096967/…
devesh-ahuja

20
डॉकर एक आभासी मशीन नहीं है - यह एक विन्यास प्रबंधन उपकरण है।
एएए 90210

3
सरल शब्दों में: यदि आप सर्वर वर्चुअलाइजेशन ओके चाहते हैं तो वीएम -> तीन वर्चुअल लेयर को रन करना होगा, लेकिन अगर आप केवल वेब एप्लिकेशन चलाना चाहते हैं तो यह सबसे अच्छा समाधान नहीं है। DOCKER -> आपके वास्तविक सीपीयू और आप वेब एप्लिकेशन के बीच केवल एक परत। अधिक शक्तिशाली और बेहतर क्लोनिंग / मिररिंग यदि आपको केवल अपने वेब एप्लिकेशन को चलाने के लिए वर्चुअलाइजेशन करना होगा, तो मैं इसे पूरा
करूंगा

6
चलो यह मत भूलो कि मैक के लिए डॉकर और विंडोज के लिए डॉकर वर्चुअलाइजेशन परत का उपयोग करते हैं।
Shapeshifter

जवाबों:


3432

Docker ने मूल रूप से LinuX कंटेनर्स (LXC) का उपयोग किया था , लेकिन बाद में इसे runC (पूर्व में libcontainer के रूप में जाना जाता है ) पर स्विच किया , जो इसके होस्ट के समान ऑपरेटिंग सिस्टम में चलता है। यह मेजबान ऑपरेटिंग सिस्टम संसाधनों का एक बहुत साझा करने के लिए अनुमति देता है। इसके अलावा, यह एक स्तरित फाइल सिस्टम ( एयूएफएस ) का उपयोग करता है और नेटवर्किंग का प्रबंधन करता है।

एयूएफएस एक स्तरित फाइल सिस्टम है, इसलिए आपके पास केवल पढ़ने के लिए एक भाग और एक लेखन भाग हो सकता है जो एक साथ विलय हो जाते हैं। ऑपरेटिंग सिस्टम के आम हिस्से हो सकते हैं जैसे कि केवल पढ़ा जाता है (और अपने सभी कंटेनरों में साझा किया जाता है) और फिर प्रत्येक कंटेनर को लिखने के लिए अपना माउंट दें।

तो, मान लें कि आपके पास 1 जीबी कंटेनर की छवि है; यदि आप एक पूर्ण वीएम का उपयोग करना चाहते हैं, तो आपके पास 1 जीबी x नंबर का वीएम होना चाहिए। डॉकर और एयूएफएस के साथ आप सभी कंटेनरों के बीच 1 जीबी का बल्क साझा कर सकते हैं और यदि आपके पास 1000 कंटेनर हैं तो भी आपके पास कंटेनर ओएस के लिए केवल 1 जीबी से अधिक जगह हो सकती है (यह मानते हुए कि वे सभी एक ही ओएस छवि चला रहे हैं) ।

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

एक पूर्ण वर्चुअलाइज्ड सिस्टम आमतौर पर शुरू होने में मिनटों का समय लेता है, जबकि डॉकर / LXC / runC कंटेनर्स को सेकंड लगते हैं, और अक्सर एक सेकंड से भी कम।

प्रत्येक प्रकार के वर्चुअलाइज्ड सिस्टम के लिए पेशेवरों और विपक्ष हैं। यदि आप गारंटीकृत संसाधनों के साथ पूर्ण अलगाव चाहते हैं, तो एक पूर्ण वीएम जाने का रास्ता है। यदि आप प्रक्रियाओं को एक-दूसरे से अलग करना चाहते हैं और उनमें से एक टन को यथोचित आकार के होस्ट पर चलाना चाहते हैं, तो डॉकर / LXC / runC जाने का रास्ता प्रतीत होता है।

अधिक जानकारी के लिए, ब्लॉग पोस्ट के इस सेट की जांच करें जो यह समझाने का एक अच्छा काम करता है कि एलएक्ससी कैसे काम करता है।

सॉफ्टवेयर को डॉकटर छवि पर तैनात करना (यदि यह सही शब्द है) तो बस एक सुसंगत उत्पादन परिवेश में तैनात करने की तुलना में आसान है?

एक सुसंगत उत्पादन वातावरण को तैनात करना आसान काम की तुलना में कहा जाता है। यहां तक ​​कि अगर आप शेफ और पपेट जैसे टूल का उपयोग करते हैं, तो हमेशा ओएस अपडेट और अन्य चीजें होती हैं जो मेजबानों और वातावरण के बीच बदलती हैं।

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

यह परीक्षण के लिए बहुत अच्छा है; मान लीजिए कि आपके पास हज़ारों परीक्षण हैं जिन्हें डेटाबेस से कनेक्ट करने की आवश्यकता है, और प्रत्येक परीक्षण को डेटाबेस की एक प्रति की आवश्यकता है और डेटा में परिवर्तन करेगा। इसके लिए क्लासिक दृष्टिकोण है कि प्रत्येक परीक्षण के बाद डेटाबेस को कस्टम कोड के साथ या फ्लाईवे जैसे टूल के साथ रीसेट किया जाए - यह बहुत समय लेने वाला हो सकता है और इसका मतलब है कि परीक्षणों को क्रमिक रूप से चलाया जाना चाहिए। हालांकि, डॉकर के साथ आप अपने डेटाबेस की एक छवि बना सकते हैं और प्रति परीक्षण एक उदाहरण चला सकते हैं, और फिर सभी परीक्षणों को समानांतर में चला सकते हैं क्योंकि आप जानते हैं कि वे सभी डेटाबेस के एक ही स्नैपशॉट के खिलाफ चल रहे होंगे। चूंकि परीक्षण समानांतर और डॉकटर कंटेनरों में चल रहे हैं, इसलिए वे एक ही समय में एक ही बॉक्स पर सभी को चला सकते हैं और बहुत तेजी से खत्म होना चाहिए। एक पूर्ण वीएम के साथ ऐसा करने का प्रयास करें।

टिप्पणियों से ...

दिलचस्प! मुझे लगता है कि मैं अभी भी "स्नैपशॉट [ओएस] ओएस" की धारणा से भ्रमित हूं। ओएस की एक छवि बनाने के बिना, कोई भी, बिना अच्छी तरह से कैसे करता है?

अच्छा, चलो देखते हैं कि क्या मैं समझा सकता हूं। आप आधार छवि के साथ शुरू करते हैं, और फिर अपने परिवर्तन करते हैं, और docker का उपयोग करके उन परिवर्तनों को करते हैं, और यह एक छवि बनाता है। इस छवि में केवल आधार से अंतर है। जब आप अपनी छवि को चलाना चाहते हैं, तो आपको आधार की भी आवश्यकता होती है, और यह एक स्तरित फ़ाइल सिस्टम का उपयोग करके आधार के शीर्ष पर आपकी छवि को परत करता है: जैसा कि ऊपर उल्लेख किया गया है, डॉकर एयूएफएस का उपयोग करता है। एयूएफएस अलग-अलग परतों को एक साथ मिलाता है और आपको वही मिलता है जो आप चाहते हैं; आपको बस इसे चलाने की आवश्यकता है। आप अधिक से अधिक छवियां (परतें) जोड़ते रह सकते हैं और यह केवल डिफरेंशियल को सहेजना जारी रखेगा। चूंकि डॉकर आमतौर पर एक रजिस्ट्री से तैयार चित्रों के शीर्ष पर बनाता है , आपको शायद ही कभी पूरे ओएस को "स्नैपशॉट" करना होगा।


238
केन, कुछ स्थानों पर आप कर्नेल के साथ ओएस को भ्रमित करते हैं। होस्ट पर सभी कंटेनर एक ही कर्नेल के नीचे चलते हैं, लेकिन बाकी के ओएस फाइलें प्रति कंटेनर अद्वितीय हो सकती हैं।
एंडी

22
दिलचस्प! मुझे लगता है कि मैं अभी भी "स्नैपशॉट [ओएस] ओएस" की धारणा से भ्रमित हूं। ओएस की एक छवि बनाने के बिना, कोई भी, बिना अच्छी तरह से कैसे करता है?
zslayton

7
@ murtaza52 वे अलग-अलग फ़ाइल सिस्टम के लिए समर्थन जोड़ रहे हैं ताकि Aufs चले जाएं कोई समस्या नहीं होनी चाहिए। सुनिश्चित नहीं है कि 32 बिट समर्थन कब जोड़ा जाएगा, नहीं लगता कि मजबूत मांग रही है, इसलिए यह प्राथमिकता सूची में कम है, लेकिन मैं गलत हो सकता है।
केन कोचरन

21
@ माइक: ... जो निस्संदेह FreeBSD जेलों से प्रेरित थाHISTORY The jail utility appeared in FreeBSD 4.0.
स्टीफन

21
उन लोगों के लिए जो @ माइक की टिप्पणी का उत्तर दे रहे हैं क्योंकि यह प्रतीत होता है कि इसे हटा दिया गया है, यह है: <एक चीज जो गायब है वह इस तथ्य का संदर्भ है कि लिनक्स कंटेनर प्रेरणा के सही स्रोत का एक क्लोन है : सोलारिस कंटेनर। 2004 में वापस रास्ता ... यह एक क्रांतिकारी अवधारणा है और सस्ती करने के लिए एक शानदार, शानदार तरीके से तैयार की गई आभासी मशीनें हैं जो वास्तव में प्रदर्शन कर रही हैं। जॉयंट पहली बार मुझे पता था ...>
जेफरी 'जेएफ' लिम

557

अच्छा जवाब। बस कंटेनर बनाम वीएम का एक छवि प्रतिनिधित्व प्राप्त करने के लिए, नीचे एक नज़र डालें।

यहां छवि विवरण दर्ज करें

स्रोत


20
<हड़ताल> जहां तक ​​मैं समझता हूं, "डॉक इंजन" के ऊपर एक साझा लिनक्स कर्नेल होना चाहिए। फिर आम तौर पर साझा किए गए डिब्बे / परिवाद भी होते हैं। उसके बाद सबसे पहले डिब्बे / लिबास और ऐप आते हैं जो प्रत्येक कंटेनर के लिए विशिष्ट होते हैं। कृपया मुझे सही करें अगर मैं गलत हूं। </ हड़ताल> मैं गलत था। डॉकर छवियां होस्ट के साथ कर्नेल साझा करती हैं, देखें superuser.com/questions/889472/… । हालांकि, कंटेनरों के संघ फाइलसिस्टम को स्पष्ट करने के लिए, docker इंजन के ऊपर सीधे libs / डिब्बे की एक साझा परत हो सकती है।
बेटमोस

13
मुझे ऊपर की तस्वीर के साथ एक समस्या है, क्योंकि हाइपरवाइजर को नंगे धातु / बुनियादी ढांचे पर स्थापित किया जा सकता है लेकिन Docket can (अभी तक) नहीं
reza

@reza, मैं मानता हूं कि हाइपरवाइजर को नंगे धातु पर स्थापित किया जा सकता है, लेकिन बिंदु डॉकर को ऐप्स के कंटेनरीकरण और वर्चुअलाइजेशन को सीमित करने या बचने की सिफारिश की जाती है जो कुछ परिदृश्यों के लिए आवश्यक / लागू नहीं है। Ken Cochrane इसे और अधिक विस्तार से बताते हैं stackoverflow.com/a/16048358/2478933
manu97

4
यह स्पष्ट नहीं करता है कि डॉक इंजन क्या है । बहुत सार तस्वीरें।
kyb

9
कंटेनर और कर्नेल के बीच कोई "डॉकर इंजन" परत नहीं है, कंटेनर सिर्फ कर्नेल (नामस्थान, cgroups, आदि) में विशेष सेटिंग्स के साथ एक प्रक्रिया है
Paweł Prażak

503

यह समझना मददगार हो सकता है कि कैसे वर्चुअलाइजेशन और कंटेनर कम स्तर पर काम करते हैं। इससे बहुत सारी चीजें साफ हो जाएंगी।

नोट: मैं नीचे वर्णन करने में थोड़ा सरल कर रहा हूं। अधिक जानकारी के लिए संदर्भ देखें।

वर्चुअलाइजेशन निम्न स्तर पर कैसे काम करता है?

इस मामले में वीएम प्रबंधक सीपीयू रिंग 0 (या नए सीपीयू में "रूट मोड") पर कब्जा कर लेता है और अतिथि ओएस द्वारा किए गए सभी विशेषाधिकार प्राप्त कॉल को भ्रम पैदा करता है कि अतिथि ओएस का अपना हार्डवेयर है। मजेदार तथ्य: 1998 से पहले x86 आर्किटेक्चर में इसे हासिल करना असंभव माना जाता था क्योंकि इस तरह के इंटरसेप्शन को करने का कोई तरीका नहीं था। VMWare के लोग पहले थे जिन्होंने इसे प्राप्त करने के लिए अतिथि ओएस के विशेषाधिकार प्राप्त कॉल के लिए निष्पादन योग्य बाइट्स को फिर से लिखने का विचार किया था।

शुद्ध प्रभाव यह है कि वर्चुअलाइजेशन आपको एक ही हार्डवेयर पर दो पूरी तरह से अलग ओएस चलाने की अनुमति देता है। प्रत्येक अतिथि OS बूटस्ट्रैपिंग, लोडिंग कर्नेल आदि की सभी प्रक्रिया से गुजरता है। आपके पास बहुत कड़ी सुरक्षा हो सकती है, उदाहरण के लिए, अतिथि ओएस होस्ट ओएस या अन्य मेहमानों और चीजों को गड़बड़ करने के लिए पूर्ण पहुंच प्राप्त नहीं कर सकता है।

कंटेनर निम्न स्तर पर कैसे काम करता है?

2006 के आसपास , Google में कुछ कर्मचारियों सहित लोगों ने नामस्थानों पर नए कर्नेल स्तर की सुविधा लागू की (हालांकि विचार FreeDD में मौजूद होने से बहुत पहले)। ओएस का एक कार्य प्रक्रियाओं के लिए नेटवर्क और डिस्क जैसे वैश्विक संसाधनों को साझा करने की अनुमति देना है। क्या होगा यदि इन वैश्विक संसाधनों को नामस्थानों में लपेटा गया ताकि वे केवल उन्हीं प्रक्रियाओं को दिखाई दें जो समान नामस्थान में चलती हैं? कहते हैं, आप डिस्क का एक हिस्सा प्राप्त कर सकते हैं और नामस्थान X में रख सकते हैं और फिर नाम स्थान Y में चलने वाली प्रक्रियाएँ इसे देख या एक्सेस नहीं कर सकती हैं। इसी प्रकार, नामस्थान X की प्रक्रियाएँ ऐसी किसी भी चीज़ को मेमोरी में एक्सेस नहीं कर सकती हैं जो नामस्थान Y को आवंटित की गई हैं। बेशक, X में प्रक्रियाएँ नाम स्थान Y में प्रक्रियाओं को देख या उनसे बात नहीं कर सकती हैं। यह वैश्विक संसाधनों के लिए वर्चुअलाइज़ेशन और अलगाव प्रदान करता है। यह कैसे काम करता है: प्रत्येक कंटेनर अपने नामस्थान में चलता है, लेकिन बिल्कुल उसी का उपयोग करता हैअन्य सभी कंटेनरों के रूप में कर्नेल। अलगाव इसलिए होता है क्योंकि कर्नेल उस नामस्थान को जानता है जिसे प्रक्रिया को सौंपा गया था और एपीआई कॉल के दौरान यह सुनिश्चित करता है कि प्रक्रिया केवल अपने नामस्थान में संसाधनों तक पहुंच सकती है।

VM बनाम कंटेनरों की सीमाएँ अब स्पष्ट होनी चाहिए: आप VMs जैसे कंटेनरों में पूरी तरह से भिन्न OS नहीं चला सकते हैं। हालाँकि आप लिनक्स के विभिन्न डिस्ट्रोन्स को चला सकते हैं क्योंकि वे एक ही कर्नेल साझा करते हैं। अलगाव स्तर वीएम में उतना मजबूत नहीं है। वास्तव में, शुरुआती कार्यान्वयन में होस्ट को संभालने के लिए "अतिथि" कंटेनर के लिए एक रास्ता था। इसके अलावा, आप देख सकते हैं कि जब आप नए कंटेनर को लोड करते हैं, तो OS की पूरी नई प्रतिलिपि शुरू नहीं होती है जैसे कि वह VM में करता है। सभी कंटेनर समान कर्नेल साझा करते हैं। यही कारण है कि कंटेनर हल्के वजन के होते हैं। वीएम के विपरीत, आपको कंटेनरों को मेमोरी का महत्वपूर्ण हिस्सा पूर्व-आवंटित करने की आवश्यकता नहीं है क्योंकि हम ओएस की नई कॉपी नहीं चला रहे हैं। यह सैंडबॉक्सिंग करते समय एक ओएस पर हजारों कंटेनरों को चलाने में सक्षम बनाता है जो कि संभव नहीं है अगर हम अपने स्वयं के वीएम में ओएस की अलग कॉपी चला रहे थे।


26
वाह, महान निम्न-स्तरीय स्पष्टीकरण (और ऐतिहासिक तथ्यों) के लिए धन्यवाद। मैं उस की तलाश कर रहा था और ऊपर नहीं मिला है। आपका क्या मतलब है "आप लिनक्स के विभिन्न डिस्ट्रोन्स चला सकते हैं क्योंकि वे एक ही कर्नेल साझा करते हैं।" ? क्या आप कह रहे हैं कि अतिथि कंटेनर में ठीक उसी लिनक्स कर्नेल संस्करण होना चाहिए या यह कोई फर्क नहीं पड़ता? अगर यह मायने नहीं रखता कि अगर मैं अतिथि पर OS कमांड लागू करता हूं, लेकिन केवल अतिथि कर्नेल में समर्थित है। या उदाहरण के लिए अतिथि कर्नेल में तय बग लेकिन मेजबान कर्नेल में नहीं। सभी मेहमान बग को प्रकट करेंगे, सही है? भले ही मेहमानों को पैच किया गया था।
पहुंचें

7
@ पहुंच: कंटेनरों की अपनी कर्नेल नहीं है, वे होस्ट में से एक का उपयोग / साझा कर रहे हैं। इसलिए आप ऐसे कंटेनर नहीं चला सकते हैं जिन्हें एक ही मशीन / वीएम पर अलग-अलग कर्नेल की जरूरत हो।
user276648

2
प्रश्न: आप लिखते हैं कि Google के कुछ कर्मचारी 1996 के आसपास नाम स्थान कर्नेल सुविधा में शामिल थे - फिर भी 1998 तक Google की स्थापना नहीं की गई थी। क्या आपका मतलब 'लोग हैं जो बाद में Google कर्मचारी बनेंगे'?
मार्टिन गजलडबेक

3
@ स्मार्टिन - वर्ष 2006 को ध्यान देने के लिए धन्यवाद। मुझे यह भी उल्लेख करना चाहिए कि 2002 से लिनक्स में विभिन्न प्रकार के नामस्थान मौजूद थे, लेकिन 2006 के दौरान यह काम था जिसने कंटेनरीकरण के लिए जमीन तैयार की। मैंने उत्तर को संदर्भ के साथ अद्यतन किया है।
शीतल शाह

20
+1 यह चिह्नित उत्तर होना चाहिए, जबकि अन्य उत्तर कुछ स्पष्टीकरण प्रदान करते हैं, केवल एक निचले स्तर के निचले स्तर के स्पष्टीकरण से यह स्पष्ट हो सकता है कि यह तकनीक कैसे काम करती है, 'प्रक्रियाएं अपने स्वयं के नामस्थान = कंटेनर में समूहीकृत'। बहुत बहुत धन्यवाद, मैं अब इसे प्राप्त करता हूं।
टीनो म्लेकरन

328

मुझे केन कोचरन का जवाब पसंद है।

लेकिन मैं अतिरिक्त दृष्टिकोण जोड़ना चाहता हूं, यहां विस्तार से कवर नहीं किया गया है। मेरी राय में डॉकर पूरी प्रक्रिया में भी भिन्न है। VMs के विपरीत, Docker हार्डवेयर के इष्टतम संसाधन साझा करने के बारे में (केवल) नहीं है, इसके अलावा यह पैकेजिंग एप्लिकेशन के लिए एक "सिस्टम" प्रदान करता है (बेहतर है, लेकिन माइक्रोसर्विस के एक सेट के रूप में, एक चाहिए नहीं)।

मेरे लिए यह rpm, डेबियन पैकेज, मावेन , npm + Git जैसे डेवलपर-उन्मुख उपकरणों के बीच की खाई में फिट बैठता है और कठपुतली , VMware, Xen जैसे उपकरण का नाम देता है, आप इसे नाम देते हैं ...

सॉफ्टवेयर को डॉकटर छवि पर तैनात करना (यदि यह सही शब्द है) तो बस एक सुसंगत उत्पादन परिवेश में तैनात करने की तुलना में आसान है?

आपका प्रश्न कुछ सुसंगत उत्पादन वातावरण मानता है। लेकिन इसे लगातार कैसे रखा जाए? पाइप लाइन में सर्वर और अनुप्रयोगों की कुछ राशि (> 10) पर विचार करें।

इसे सिंक में रखने के लिए आप कठपुतली, बावर्ची या अपनी खुद की प्रोविजनिंग स्क्रिप्ट, अप्रकाशित नियमों और / या बहुत सारे प्रलेखन का उपयोग करना शुरू करेंगे ... सिद्धांत रूप में सर्वर अनिश्चित काल तक चल सकते हैं, और पूरी तरह से सुसंगत और अद्यतित रखे जा सकते हैं। अभ्यास सर्वर के कॉन्फ़िगरेशन को पूरी तरह से प्रबंधित करने में विफल रहता है, इसलिए कॉन्फ़िगरेशन बहाव के लिए काफी गुंजाइश है, और चल रहे सर्वर में अप्रत्याशित परिवर्तन।

तो इससे बचने के लिए एक ज्ञात पैटर्न है, तथाकथित अपरिवर्तनीय सर्वर । लेकिन अपरिवर्तनीय सर्वर पैटर्न को प्यार नहीं किया गया था। ज्यादातर VM की सीमाओं के कारण जो Docker से पहले उपयोग किए गए थे। कई गीगाबाइट बड़ी छवियों से निपटना, उन बड़ी छवियों को चारों ओर ले जाना, बस आवेदन में कुछ क्षेत्रों को बदलना, बहुत श्रमसाध्य था। समझा जा सकता ...

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

और अंत में आप अक्सर अपने लिनक्स लैपटॉप पर भी जटिल उत्पादन वातावरण को पुन: पेश करने में सक्षम होंगे (यदि आपके मामले में काम नहीं करता है तो मुझे कॉल न करें।)

और निश्चित रूप से आप VMs में डॉकर कंटेनर शुरू कर सकते हैं (यह एक अच्छा विचार है)। VM स्तर पर अपने सर्वर के प्रावधान को कम करें। उपरोक्त सभी डॉकटर द्वारा प्रबंधित किया जा सकता है।

पीएस इस बीच डॉकर LXC के बजाय अपने स्वयं के कार्यान्वयन "लिबासेंचर" का उपयोग करता है। लेकिन LXC अभी भी प्रयोग करने योग्य है।


1
आरपीएम और डीपीकेजी जैसे उपकरणों के समूह में गिट को शामिल करने के लिए अजीब लगता है। मैं इस बात का उल्लेख करता हूं क्योंकि मैं संस्करणों / नियंत्रण प्रणालियों जैसे संस्करणों का उपयोग करने के प्रयासों को बहुत अधिक भ्रम का स्रोत होने के लिए वितरण / पैकेजिंग उपकरण के रूप में देखता हूं।
ब्लिटज़ेन 9872

2
हालांकि वह गलत नहीं है, लेकिन पैकेज प्रबंधन के लिए git का उपयोग किया जा सकता है, उदाहरण के लिए bower आंतरिक रूप से मूल रूप से git टैग डाउनलोड करने के लिए एक फैंसी क्ली है।
roo2

2
कंटेनरों में पैकेजिंग अनुप्रयोग एक दिलचस्प और मान्य दृष्टिकोण है। हालाँकि यदि आप इसे docker में पैक करते हैं तो यह ओवरकिल हो जाएगा, क्योंकि निर्भरता या किसी भी साझा लाइब्रेरी के लिए सीधा समर्थन नहीं होगा। यह वही है जो रेडहैट के लिए उबंटू स्नैप और फ्लैटपैक जैसी नई पैकेजिंग तकनीक हासिल करने की कोशिश कर रहा है। मेरी राय में, इन पैकेजिंग टेक में से एक जीत जाएगा और लिनक्स में पैकेजिंग का भविष्य बन जाएगा।
yosefrow

@ blitzen9872 इस पर सहमत हैं। लेकिन वास्तव में उल्लेख किया गया था क्योंकि यह प्रैक्सिस में वितरण के लिए इतनी बार इस्तेमाल किया गया था, फिर से मुझे यह पसंद नहीं है।
अंबोलिच

@yosefrow "ओवरकिल" विस्तृत है। आइडिया की जांच करें और "अपरिवर्तनीय सर्वर" पैटर्न के फायदे, निश्चित रूप से कुछ नुकसान हैं ... यदि आप ओवरकिल देखते हैं, तो इसका उपयोग न करें ..
aholbreich

245

डॉकर एक वर्चुअलाइजेशन पद्धति नहीं है। यह अन्य उपकरणों पर निर्भर करता है जो वास्तव में कंटेनर-आधारित वर्चुअलाइजेशन या ऑपरेटिंग सिस्टम स्तर वर्चुअलाइजेशन को लागू करते हैं। उसके लिए, Docker शुरू में LXC ड्राइवर का उपयोग कर रहा था, फिर libcontainer पर चला गया जिसे अब runc के रूप में नाम दिया गया है। डॉकर मुख्य रूप से एप्लिकेशन कंटेनरों के अंदर अनुप्रयोगों की तैनाती को स्वचालित करने पर केंद्रित है। एप्लिकेशन कंटेनरों को एक एकल सेवा पैकेज और चलाने के लिए डिज़ाइन किया गया है, जबकि सिस्टम कंटेनर वर्चुअल मशीन की तरह कई प्रक्रियाओं को चलाने के लिए डिज़ाइन किए गए हैं। तो, डॉकटर को कंटेनरीकृत सिस्टम पर एक कंटेनर प्रबंधन या एप्लिकेशन परिनियोजन उपकरण माना जाता है।

यह जानने के लिए कि यह अन्य वर्चुअलाइजेशन से कैसे भिन्न है, आइए वर्चुअलाइजेशन और इसके प्रकारों से गुजरें। फिर, यह समझना आसान होगा कि वहां क्या अंतर है।

वर्चुअलाइजेशन

अपने कल्पित रूप में, यह कई अनुप्रयोगों को एक साथ चलाने की अनुमति देने के लिए तार्किक रूप से मेनफ्रेम को विभाजित करने का एक तरीका माना जाता था। हालाँकि, परिदृश्य बहुत बदल गया जब कंपनियां और खुले स्रोत समुदाय एक या दूसरे तरीके से विशेषाधिकार प्राप्त निर्देशों को संभालने की एक विधि प्रदान करने में सक्षम थे और एक ही x86 आधारित प्रणाली पर एक साथ कई ऑपरेटिंग सिस्टम चलाने की अनुमति देते थे।

सूत्र

हाइपरविजर वर्चुअल वातावरण बनाने का काम करता है, जिस पर अतिथि वर्चुअल मशीनें संचालित होती हैं। यह अतिथि प्रणालियों की देखरेख करता है और यह सुनिश्चित करता है कि मेहमानों को आवश्यक रूप से संसाधन आवंटित किए जाएं। हाइपरविजर भौतिक मशीन और आभासी मशीनों के बीच बैठता है और आभासी मशीनों को वर्चुअलाइजेशन सेवाएं प्रदान करता है। इसे महसूस करने के लिए, यह वर्चुअल मशीनों पर अतिथि ऑपरेटिंग सिस्टम के संचालन को स्वीकार करता है और होस्ट मशीन के ऑपरेटिंग सिस्टम पर ऑपरेशन का अनुकरण करता है।

वर्चुअलाइजेशन तकनीकों का तेजी से विकास, मुख्य रूप से क्लाउड में, ने वर्चुअलाइजेशन के उपयोग को आगे बढ़ाया है, जिससे एक ही भौतिक सर्वर पर कई वर्चुअल सर्वर बनाए जा सकते हैं, जैसे कि एक्सपीरिएंस, जैसे एक्सएमएन, वीएमवेयर प्लेयर, केवीएम, इत्यादि। कमोडिटी प्रोसेसर में हार्डवेयर सपोर्ट का समावेश, जैसे इंटेल वीटी और एएमडी-वी।

वर्चुअलाइजेशन के प्रकार

वर्चुअलाइजेशन विधि को इस आधार पर वर्गीकृत किया जा सकता है कि यह एक अतिथि ऑपरेटिंग सिस्टम में हार्डवेयर की नकल कैसे करता है और अतिथि ऑपरेटिंग वातावरण का अनुकरण करता है। मुख्य रूप से, तीन प्रकार के वर्चुअलाइजेशन हैं:

  • अनुकरण
  • पैरावर्चुअलाइजेशन
  • कंटेनर आधारित वर्चुअलाइजेशन

अनुकरण

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

अनुकरण

इस श्रेणी के उदाहरणों में VMware Player, VirtualBox, QEMU, Boch, Parallels, आदि शामिल हैं।

पैरावर्चुअलाइजेशन

Paravirtualization, जिसे टाइप 1 हाइपरविजर के रूप में भी जाना जाता है, सीधे हार्डवेयर या "नंगे-धातु" पर चलता है, और इस पर चलने वाली आभासी मशीनों को सीधे वर्चुअलाइजेशन सेवाएं प्रदान करता है। यह ऑपरेटिंग सिस्टम, वर्चुअलाइज्ड हार्डवेयर और वास्तविक हार्डवेयर को इष्टतम प्रदर्शन प्राप्त करने में सहयोग करने में मदद करता है। इन हाइपरविज़रों में आमतौर पर छोटे फुटप्रिंट होते हैं और खुद को व्यापक संसाधनों की आवश्यकता नहीं होती है।

इस श्रेणी के उदाहरणों में एक्सएन, केवीएम आदि शामिल हैं।

पैरावर्चुअलाइजेशन

कंटेनर आधारित वर्चुअलाइजेशन

कंटेनर आधारित वर्चुअलाइजेशन, जिसे ऑपरेटिंग सिस्टम-स्तरीय वर्चुअलाइजेशन के रूप में भी जाना जाता है, एकल ऑपरेटिंग सिस्टम कर्नेल के भीतर कई अलग-अलग निष्पादन को सक्षम करता है। इसमें सर्वोत्तम संभव प्रदर्शन और घनत्व है और गतिशील संसाधन प्रबंधन सुविधाएँ हैं। इस प्रकार के वर्चुअलाइजेशन द्वारा प्रदान किए गए पृथक आभासी निष्पादन पर्यावरण को कंटेनर कहा जाता है और इसे प्रक्रियाओं के एक ट्रेस समूह के रूप में देखा जा सकता है।

कंटेनर आधारित वर्चुअलाइजेशन

लिनक्स कर्नेल संस्करण 2.6.24 में जोड़े गए नाम स्थान सुविधा द्वारा कंटेनर की अवधारणा संभव है। कंटेनर हर प्रक्रिया में अपनी आईडी जोड़ता है और हर सिस्टम कॉल में नए एक्सेस कंट्रोल चेक जोड़ता है। इसे क्लोन () सिस्टम कॉल द्वारा एक्सेस किया जाता है जो पहले-वैश्विक नामस्थानों के अलग-अलग उदाहरण बनाने की अनुमति देता है।

नेमस्पेस का उपयोग कई अलग-अलग तरीकों से किया जा सकता है, लेकिन सबसे आम तरीका एक पृथक कंटेनर बनाना है जिसमें कंटेनर के बाहर वस्तुओं की कोई दृश्यता या पहुंच नहीं है। कंटेनर के अंदर चलने वाली प्रक्रियाएं एक सामान्य लिनक्स सिस्टम पर चल रही प्रतीत होती हैं, हालांकि वे अन्य नामस्थानों में स्थित प्रक्रियाओं के साथ अंतर्निहित कर्नेल को साझा कर रहे हैं, अन्य प्रकार की वस्तुओं के लिए भी। उदाहरण के लिए, नामस्थान का उपयोग करते समय, कंटेनर के अंदर रूट उपयोगकर्ता को कंटेनर के बाहर रूट के रूप में नहीं माना जाता है, अतिरिक्त सुरक्षा को जोड़ता है।

लिनक्स नियंत्रण समूह (cgroups) सबसिस्टम, कंटेनर-आधारित वर्चुअलाइजेशन को सक्षम करने के लिए अगला प्रमुख घटक है, समूह प्रक्रियाओं के लिए और उनके समग्र संसाधन खपत का प्रबंधन करने के लिए उपयोग किया जाता है। यह आमतौर पर कंटेनरों की मेमोरी और सीपीयू खपत को सीमित करने के लिए उपयोग किया जाता है। चूंकि कंटेनरीकृत लिनक्स सिस्टम में केवल एक कर्नेल होता है और कर्नेल की कंटेनर में पूर्ण दृश्यता होती है, इसलिए संसाधन आवंटन और शेड्यूलिंग का केवल एक स्तर होता है।

लिनक्स कंटेनर के लिए कई प्रबंधन उपकरण उपलब्ध हैं, जिनमें LXC, LXD, systemd-nspawn, lmctfy, Warden, Linux-VServer, OpenVZ, Docker, आदि शामिल हैं।

वर्चुअल मशीन बनाम कंटेनर

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

चूंकि कंटेनर-आधारित वर्चुअलाइजेशन मेजबान मशीन में बहुत कम या कोई ओवरहेड जोड़ता है, इसलिए कंटेनर-आधारित वर्चुअलाइजेशन में लगभग मूल प्रदर्शन होता है

कंटेनर-आधारित वर्चुअलाइजेशन के लिए, अन्य वर्चुअलाइजेशन के विपरीत, कोई अतिरिक्त सॉफ़्टवेयर की आवश्यकता नहीं है।

एक मेजबान मशीन पर सभी कंटेनर अतिरिक्त संसाधनों की आवश्यकता वाले होस्ट मशीन बचत के अनुसूचक को साझा करते हैं।

कंटेनर स्टेट्स (डॉकर या LXC इमेज) वर्चुअल मशीन इमेज की तुलना में आकार में छोटे होते हैं, इसलिए कंटेनर इमेज को वितरित करना आसान होता है।

कंटेनरों में संसाधन प्रबंधन cgroups के माध्यम से प्राप्त किया जाता है। Cgroups कंटेनरों को उनके लिए आवंटित से अधिक संसाधनों का उपभोग करने की अनुमति नहीं देते हैं। हालाँकि, अब तक, होस्ट मशीन के सभी संसाधन आभासी मशीनों में दिखाई देते हैं, लेकिन इसका उपयोग नहीं किया जा सकता है। यह एक ही समय में कंटेनरों और होस्ट मशीन पर चलाकर topया महसूस किया जा सकता है htop। सभी परिवेशों में आउटपुट समान दिखाई देगा।

अपडेट करें:

नॉन-लिनक्स सिस्टम में डॉकटर कंटेनर कैसे चलाता है?

यदि लिनक्स कर्नेल में उपलब्ध सुविधाओं के कारण कंटेनर संभव हैं, तो स्पष्ट सवाल है कि गैर-लिनक्स सिस्टम कंटेनर कैसे चलाते हैं। मैक और विंडोज के लिए डोकर दोनों ही कंटेनर को चलाने के लिए लिनक्स वीएम का उपयोग करते हैं। डॉकरी टूलबॉक्स वर्चुअल बॉक्स वीएम में कंटेनरों को चलाने के लिए उपयोग किया जाता है। लेकिन, नवीनतम डॉकर मैक में विंडोज और हाइपरविजर.फ्रामवर्क में हाइपर-वी का उपयोग करता है।

अब, मैं बताता हूं कि मैक के लिए डॉकर कैसे कंटेनरों को विस्तार से बताता है।

मैक के लिए डॉकर https://github.com/moby/hyperkit का उपयोग हाइपरवाइजर क्षमताओं का अनुकरण करने के लिए करता है और हाइपरकिट अपने मूल में hypervisor.framework का उपयोग करता है। Hypervisor.framework मैक का देशी हाइपरवाइज़र समाधान है। हाइपरकिट क्रमशः वीपीएनकिट और डेटाकीट से लेकर नेमस्पेस नेटवर्क और फाइल सिस्टम तक का उपयोग करता है।

मैक में चलने वाला लिनक्स वीएम केवल-पढ़ने के लिए है। हालाँकि, आप इसे चलाकर भी मिटा सकते हैं:

screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty

अब, हम इस VM के कर्नेल संस्करण को भी देख सकते हैं:

# uname -a Linux linuxkit-025000000001 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:86_64 Linux

सभी कंटेनर इस वीएम के अंदर चलते हैं।

Hypervisor.framework की कुछ सीमाएँ हैं। उस वजह से Docker docker0Mac में नेटवर्क इंटरफ़ेस को उजागर नहीं करता है । इसलिए, आप मेजबान से कंटेनरों तक नहीं पहुंच सकते। अब तक, docker0केवल वीएम के अंदर ही उपलब्ध है।

हाइपर- v विंडोज में देशी हाइपरवाइजर है। वे लिनक्स सिस्टम को मूल रूप से चलाने के लिए विंडोज 10 की क्षमताओं का लाभ उठाने की कोशिश कर रहे हैं।


1
बहुत अच्छी पोस्ट। आपको बहुत - बहुत धन्यवाद! मेरे पास एक और सवाल है कि मैं मैक x86_64 मशीन पर docker arm7v 32-बिट छवि बना सकता हूं। हालाँकि, मैं x86_64 मशीन पर स्थापित उबंटू पर समान छवि नहीं बना सकता। क्या यह मैक हाइपरवाइज़र के समाधान से संबंधित है जिसका आपने उल्लेख किया है?
jiashenC

1
आपका उत्तर केवल यह पता करने के लिए है कि "डॉकर गैर-लिनक्स सिस्टम में कंटेनर कैसे चलाता है?" यह जानकारी कहीं भी पाना बहुत कठिन है। सब कुछ जोर देता है कि "कंटेनर वीएम से पूरी तरह से अलग हैं!", तेज, हल्का-वजन, आदि, फिर भी एक गैर-लिनक्स सिस्टम पर कंटेनर को चलाने का एकमात्र तरीका एक वीएम को स्पिन करना है ...!
Bogatyr

@ बोगटीयर IINM, यह सभी कंटेनरों के लिए VM है।
dstromberg

147

इस पोस्ट के माध्यम से हम VMs और LXCs के बीच मतभेदों की कुछ पंक्तियों को आकर्षित करने जा रहे हैं। आइए पहले उन्हें परिभाषित करते हैं।

वीएम :

एक वर्चुअल मशीन एक भौतिक कंप्यूटिंग वातावरण का अनुकरण करती है, लेकिन सीपीयू, मेमोरी, हार्ड डिस्क, नेटवर्क और अन्य हार्डवेयर संसाधनों के अनुरोध को एक वर्चुअलाइजेशन परत द्वारा प्रबंधित किया जाता है जो इन अनुरोधों को अंतर्निहित भौतिक हार्डवेयर में अनुवाद करता है।

इस संदर्भ में वीएम को अतिथि के रूप में कहा जाता है जबकि पर्यावरण जिस पर चलता है उसे मेजबान कहा जाता है।

LXC s:

लिनक्स कंटेनर (LXC) ऑपरेटिंग सिस्टम-स्तर की क्षमताएँ हैं, जो एक कंट्रोल होस्ट (LXC होस्ट) पर, कई अलग-अलग लिनक्स कंटेनरों को चलाना संभव बनाती हैं। लिनक्स कंटेनर VMs के लिए एक हल्के विकल्प के रूप में काम करते हैं क्योंकि उन्हें हाइपरविजर्स अर्थात की आवश्यकता नहीं होती है। Virtualbox, KVM, Xen, आदि।

अब जब तक आप एलन (Zach Galifianakis- हैंगओवर श्रृंखला से) से नशा नहीं कर रहे थे और पिछले एक साल से वेगास में हैं, आप लिनक्स कंटेनर तकनीक के लिए जबरदस्त रुचि के बारे में बहुत जागरूक होंगे, और अगर मैं विशिष्ट एक कंटेनर होगा परियोजना जो पिछले कुछ महीनों में दुनिया भर में चर्चा का विषय बनी हुई है - डॉकटर कुछ गूंजने वाली रायों के लिए अग्रणी है जो क्लाउड कंप्यूटिंग वातावरण को आभासी मशीनों (वीएम) को छोड़ देना चाहिए और उनके निचले ओवरहेड और संभावित बेहतर प्रदर्शन के कारण कंटेनरों के साथ प्रतिस्थापित करना चाहिए।

लेकिन बड़ा सवाल यह है कि क्या यह संभव है ?, क्या यह समझदार होगा?

ए। LXCs को Linux के उदाहरण के लिए स्कोप किया जाता है। यह लिनक्स के अलग-अलग स्वाद हो सकते हैं (उदाहरण के लिए एक सेंटोस होस्ट पर एक उबंटू कंटेनर लेकिन यह अभी भी लिनक्स है।) इसी तरह, विंडोज-आधारित कंटेनर अब विंडोज के एक उदाहरण के लिए बंद कर दिए गए हैं यदि हम वीएम को देखते हैं तो उनके पास काफी व्यापक गुंजाइश है और इसका उपयोग कर रहे हैं। hypervisers आप ऑपरेटिंग सिस्टम लिनक्स या विंडोज तक सीमित नहीं हैं।

ख। LXCs में कम ओवरहेड्स हैं और VMs की तुलना में बेहतर प्रदर्शन है। उपकरण अर्थात डॉकटर जो एलएक्ससी तकनीक के कंधों पर बने होते हैं, ने डेवलपर्स को अपने एप्लिकेशन चलाने के लिए एक मंच प्रदान किया है और साथ ही साथ लोगों को एक उपकरण के साथ संचालन को सशक्त बनाया है जो उन्हें उत्पादन सर्वर या डेटा केंद्रों पर एक ही कंटेनर को तैनात करने की अनुमति देगा। यह एक एप्लिकेशन को चलाने वाले एक डेवलपर के बीच अनुभव बनाने की कोशिश करता है, एक एप्लिकेशन को बूट करना और परीक्षण करना और उस एप्लिकेशन को तैनात करने वाले किसी ऑपरेशन व्यक्ति को सीमलेस करना, क्योंकि यह वह जगह है जहां सभी घर्षण में निहित है और DevOps का उद्देश्य उन सिलोस को तोड़ना है।

इसलिए सबसे अच्छा तरीका यह है कि क्लाउड इन्फ्रास्ट्रक्चर प्रदाताओं को वीएम और एलएक्ससी के उचित उपयोग की वकालत करनी चाहिए, क्योंकि वे प्रत्येक विशिष्ट वर्कलोड और परिदृश्य को संभालने के लिए उपयुक्त हैं।

VMs को छोड़ना अब की तरह व्यावहारिक नहीं है। इसलिए VM और LXCs दोनों का अपना अलग अस्तित्व और महत्व है।


4
आपका भाग "b" ऊपर ठीक वैसा ही है जैसा डॉकर्स लोग तकनीक के बारे में कहते रहे हैं। यह विकास और परिनियोजन कार्यों को आसान बनाने के लिए है। और एक देव के रूप में अपने अनुभव के आधार पर और एक साइनस के रूप में, मुझे सहमत होना होगा।
5

3
यह बहुत सारगर्भित उत्तर है। डॉकर का उपयोग / उपयोग नहीं करने पर हमें उपयोग के मामलों की आवश्यकता होती है। यही तो प्रश्न है। हर कोई पा सकता है कि डॉकटर कैसा है लेकिन केवल कुछ ही वास्तविक परिदृश्यों पर व्याख्या कर सकते हैं।
इवान वोरोशिलिन

1
docker को अब windows की दुनिया में लाया जा रहा है, क्योंकि यह अब LXC पर निर्भर नहीं है: blogs.msdn.com/b/nzdev/archive/2015/06/02/… कृपया मुझे सही करें अगर मैं यहां दिए गए उत्तरों को गलत
समझता हूं

6
मैं यह समझने की है "(एक Centos मेजबान पर जैसे एक उबंटू कंटेनर लेकिन यह अभी भी लिनक्स है)" कंटेनर का हिस्सा है। जिस तरह से मैं इसे समझता हूं, वह यह है कि कंटेनर होस्ट कर्नेल को साझा करते हैं। यदि मेरे पास एक होस्ट VM चल रहा है लिनक्स कर्नेल 4.6, उदाहरण के लिए, कई अतिथि VM के लिनक्स कर्नेल 2.4, 2.6, 3.2, 4.1 और 4.4 चल रहे हैं। यदि मैं उस कर्नेल के लिए विशिष्ट कमांड निष्पादित करता हूं, तो मुझे अतिथि कर्नेल का व्यवहार मिलेगा (और मेजबान नहीं)। लेकिन अगर मेरे अतिथि वीएम अब कंटेनर हैं, तो क्या निष्पादित कमांड को होस्ट कर्नेल द्वारा निर्धारित किया जाएगा?
21

@bubakazouba हाँ। तुम सही हो। अब वे runC
Rumesh Eranga Hapuarachchi

140

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

डॉकर एक प्रक्रिया को चलाने के लिए सिर्फ एक फैंसी तरीका है, वर्चुअल मशीन नहीं।

अब, मुझे थोड़ा और समझाएं कि इसका क्या मतलब है। वर्चुअल मशीन उनका अपना जानवर है। मुझे लगता है कि डॉकटर यह समझाने में मदद करेगा कि आपको यह समझने में मदद मिलेगी कि वर्चुअल मशीन क्या है। खासतौर पर इसलिए क्योंकि यहाँ कई बारीक जवाब हैं जो आपको बताते हैं कि किसी को "वर्चुअल मशीन" कहने का क्या मतलब है। इसलिए...

एक डॉकर कंटेनर सिर्फ एक प्रक्रिया (और उसके बच्चे) है जिसे बाकी प्रक्रियाओं से होस्ट सिस्टम के कर्नेल के अंदर cgroups का उपयोग करके कंपार्टमेंट किया जाता है। आप वास्तव ps auxमें होस्ट पर चलाकर अपने डॉकटर कंटेनर प्रक्रियाओं को देख सकते हैं । उदाहरण के लिए, apache2"कंटेनर में" शुरू apache2करना मेजबान पर एक विशेष प्रक्रिया के रूप में शुरू हो रहा है । यह सिर्फ मशीन पर अन्य प्रक्रियाओं से कंपार्टमेंटलाइज़ किया गया है। यह ध्यान रखना महत्वपूर्ण है कि आपके कंटेनर आपके कंटेनरीकृत प्रक्रिया के जीवनकाल के बाहर मौजूद नहीं हैं। जब आपकी प्रक्रिया मर जाती है, तो आपका कंटेनर मर जाता है। ऐसा इसलिए है क्योंकि डॉकर pid 1आपके एप्लिकेशन के साथ आपके कंटेनर के अंदर बदल pid 1जाता है ( सामान्य रूप से इनिट सिस्टम है)। यह अंतिम बिंदु pid 1बहुत महत्वपूर्ण है।

जहां तक ​​उन सभी कंटेनर प्रक्रियाओं द्वारा उपयोग की जाने वाली फाइलसिस्टम का है, डॉकर UnionFS- बैक की गई छवियों का उपयोग करता है , जो कि आप तब डाउनलोड करते हैं जब आप ए docker pull ubuntu। प्रत्येक "छवि" केवल परतों और संबंधित मेटाडेटा की एक श्रृंखला है। यहां लेयरिंग की अवधारणा बहुत महत्वपूर्ण है। प्रत्येक परत उसके नीचे की परत से सिर्फ एक बदलाव है। उदाहरण के लिए, जब आप डॉकटर कंटेनर का निर्माण करते समय अपने डॉकरीफाइल में किसी फ़ाइल को हटाते हैं, तो आप वास्तव में अंतिम परत के ऊपर एक परत बना रहे होते हैं जो कहता है कि "यह फ़ाइल हटा दी गई है"। संयोग से, यही कारण है कि आप अपने फाइल सिस्टम से एक बड़ी फ़ाइल को हटा सकते हैं, लेकिन छवि अभी भी डिस्क स्थान की एक ही राशि लेती है। फ़ाइल अभी भी है, मौजूदा एक के नीचे की परतों में। परतें स्वयं फाइलों के टारबॉल हैं। आप इसके साथ परीक्षण कर सकते हैंdocker save --output /tmp/ubuntu.tar ubuntuऔर फिर cd /tmp && tar xvf ubuntu.tar। तब आप चारों ओर देख सकते हैं। वे सभी निर्देशिकाएं जो लंबी हैश की तरह दिखती हैं, वास्तव में व्यक्तिगत परतें हैं। हर एक में फाइलें ( layer.tar) और मेटाडेटा (json) उस विशेष परत के बारे में जानकारी के साथ। वे परतें फाइल सिस्टम में बदलावों का वर्णन करती हैं जिन्हें एक परत के रूप में "मूल स्थिति" के ऊपर सहेजा जाता है। "वर्तमान" डेटा को पढ़ते समय, फाइलसिस्टम डेटा पढ़ता है जैसे कि यह केवल परिवर्तनों की सबसे ऊपरी परतों को देख रहा था। यही कारण है कि फ़ाइल को हटा दिया गया प्रतीत होता है, भले ही यह अभी भी "पिछली" परतों में मौजूद है, क्योंकि फाइलसिस्टम केवल सबसे ऊपरी परतों को देख रहा है। यह पूरी तरह से अलग कंटेनरों को अपनी फाइल सिस्टम परतों को साझा करने की अनुमति देता है, भले ही प्रत्येक कंटेनर में सबसे ऊपरी परतों पर फाइल सिस्टम में कुछ महत्वपूर्ण बदलाव हुए हों। यह आपको एक टन डिस्क स्थान बचा सकता है, जब आपके कंटेनर अपनी आधार छवि परतों को साझा करते हैं। तथापि,

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

डॉकर बहुत तेजी से आगे बढ़ रहा है। इसका दस्तावेज़ीकरण मेरे द्वारा देखे गए कुछ बेहतरीन दस्तावेज़ हैं। यह आम तौर पर अच्छी तरह से लिखा, संक्षिप्त और सटीक है। मैं आपको अधिक जानकारी के लिए उपलब्ध दस्तावेज की जांच करने की सलाह देता हूं, और स्टैक ओवरफ्लो सहित आपके द्वारा ऑनलाइन पढ़ी गई किसी भी चीज़ पर प्रलेखन पर भरोसा करें। आप विशिष्ट प्रश्न हैं, मैं अत्यधिक में शामिल होने की सलाह देते हैं #dockerFreenode IRC पर और वहाँ पूछ (तुम भी Freenode का उपयोग कर सकते webchat कि के लिए!)।


12
"डॉकर एक प्रक्रिया को चलाने के लिए सिर्फ एक फैंसी तरीका है, वर्चुअल मशीन नहीं।" यह एक महान सारांश है, धन्यवाद!
मोकर्मन

धन्यवाद! इसका श्रेय #dockerFreenode IRC पर चैनल से प्रोग्रामर को जाता है ।
L0j1k

यह अन्य उत्तरों की तुलना में बहुत स्पष्ट है। मुझे लगता है कि यह प्रक्रिया सादृश्य है जो यह मेरे लिए करता है। यह अमूर्तता के स्तर को कम करता है।
मेट श्री सेप

मैं जोड़ूंगा: "डॉकर सिर्फ एक फैंसी तरीका है, एक प्रक्रिया को चलाने के लिए, एक पृथक, संरक्षित, इनकैप्सुलेटेड तरीके से, वर्चुअल मशीन नहीं।" होस्ट सिस्टम में सबसिस्टम की दृश्यता (प्रक्रियाओं और संसाधनों पर) होती है लेकिन पृथक सिस्टम में होस्ट सिस्टम में दृश्यता (प्रक्रियाओं और संसाधनों पर) नहीं होती है।
सोहेल सी

87

डॉकर अपने सभी आश्रितों के साथ एक अनुप्रयोग संलग्न करता है।

एक वर्चुअलाइज़र एक ओएस को एनकैप्सुलेट करता है जो किसी भी एप्लिकेशन को चला सकता है जो सामान्य रूप से एक नंगे धातु मशीन पर चल सकता है।


1
मैं LXC के बारे में सीख रहा हूं, अगर मैं गलत हूं तो मुझे सुधारें, लेकिन यह किसी तरह का वर्चुअन हो सकता है? लेकिन स्पष्ट रूप से व्यापक, सिर्फ कहने के लिए अजगर के लिए प्रसारित नहीं किया गया
NeoVe

2
मुझे यह उत्तर सबसे अच्छा लगता है। यह सरल है और सीधे इंगित करता है। अब जब एक WHAT LXC की एक बुनियादी समझ है और वर्चुअलाइजर्स कर सकते हैं, तो अन्य पढ़ने से विवरण समझ में आएगा।
फिल

2
@Phil के बाद मैंने पहले इसके ऊपर विस्तृत उत्तरों को पढ़ा।
जॉनी

मुझे लगता है कि वे जानना चाहते हैं कि कैसे समझाया जाए। वह बड़ा हिस्सा है जो उनके बीच अंतर दिखाएगा लेकिन आपने जवाब नहीं दिया।
लाइट.जी।

60

वे दोनों बहुत अलग हैं। डॉकर हल्का है और LXC / libcontainer (जो कर्नेल नेमस्पेसिंग और cgroups पर निर्भर करता है) का उपयोग करता है और इसमें मशीन / हार्डवेयर अनुकरण जैसे हाइपरविजर, KVM नहीं होता है। ज़ेन जो भारी हैं।

Docker और LXC सैंडबॉक्सिंग, कंटेनरीकरण और संसाधन अलगाव के लिए अधिक है। यह होस्ट ओएस (वर्तमान में केवल लिनक्स कर्नेल) क्लोन एपीआई का उपयोग करता है जो आईपीसी, एनएस (माउंट), नेटवर्क, पीआईडी, यूटीएस, आदि के लिए नाम स्थान प्रदान करता है।

मेमोरी, I / O, CPU, आदि के बारे में क्या? यह उन cgroups का उपयोग करके नियंत्रित किया जाता है जहाँ आप कुछ निश्चित संसाधन (CPU, मेमोरी, आदि) विनिर्देशन / प्रतिबंध के साथ समूह बना सकते हैं और अपनी प्रक्रियाओं को वहाँ रख सकते हैं। LXC के शीर्ष पर, डॉकर एक स्टोरेज बैकएंड ( http://www.projectatomic.io/docs/filesystems/ ) प्रदान करता है , जैसे, फाइल सिस्टम को माउंट करें जहां आप परतें जोड़ सकते हैं और विभिन्न माउंट नेमस्पेस के बीच परतें साझा कर सकते हैं।

यह एक शक्तिशाली विशेषता है जहां आधार छवियां आमतौर पर आसानी से पढ़ी जाती हैं और केवल जब कंटेनर परत में कुछ को संशोधित करता है तो यह पढ़ने-लिखने के विभाजन (लिखने पर उर्फ ​​कॉपी) के लिए कुछ लिख देगा। यह कई अन्य आवरण भी प्रदान करता है जैसे कि रजिस्ट्री और छवियों का संस्करण।

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

एक सामान्य वीएम (उदाहरण के लिए, वर्चुअलबॉक्स और वीएमवेयर) एक हाइपरविजर का उपयोग करता है, और संबंधित प्रौद्योगिकियों में या तो समर्पित फर्मवेयर होता है जो पहले ओएस (होस्ट ओएस, या अतिथि ओएस 0) के लिए पहली परत बन जाता है या एक सॉफ्टवेयर जो होस्ट ओएस पर चलता है। अतिथि OSes को CPU, USB / सामान, मेमोरी, नेटवर्क, आदि जैसे हार्डवेयर इम्यूलेशन प्रदान करते हैं। VMs अभी भी (2015 के अनुसार) उच्च सुरक्षा वाले बहु-किरायेदार वातावरण में लोकप्रिय हैं।

डॉकर / एलएक्ससी लगभग किसी भी सस्ते हार्डवेयर पर चलाया जा सकता है (1 जीबी से कम मेमोरी भी ठीक है जब तक आपके पास नया कर्नेल है) बनाम सामान्य वीएम को कम से कम 2 जीबी मेमोरी आदि की आवश्यकता होती है, इसके साथ कुछ भी सार्थक करने के लिए। । लेकिन होस्ट ओएस पर डॉकर का समर्थन ओएस में उपलब्ध नहीं है जैसे कि विंडोज (नवंबर 2014 तक) जहां विंडोज़, लिनक्स और मैक पर वीएम के प्रकार चलाए जा सकते हैं।

यहाँ docker / अधिकारों से एक तस्वीर है: यहां राइटसेले से एक तस्वीर है


34

1. हलका

बहुत से कर्ता शिक्षार्थियों के लिए यह पहली धारणा है।

सबसे पहले, docker की छवियां आमतौर पर VM छवियों से छोटी होती हैं, जिससे इसे बनाना, कॉपी करना, शेयर करना आसान हो जाता है।

दूसरा, डॉकटर कंटेनर कई मिलीसेकंड में शुरू हो सकता है, जबकि वीएम सेकंड में शुरू होता है।

2. स्तरित फाइल सिस्टम

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

यदि सभी कंटेनर उबंटू को अपने आधार चित्रों के रूप में उपयोग करते हैं, तो प्रत्येक छवि की अपनी फ़ाइल प्रणाली नहीं होती है, लेकिन समान अंडरबिन फाइल को साझा करते हैं, और केवल उनके स्वयं के अनुप्रयोग डेटा में भिन्न होते हैं।

3. ओएस कर्नेल साझा किया

कंटेनरों को प्रक्रियाओं के रूप में सोचो!

होस्ट पर चलने वाले सभी कंटेनर वास्तव में विभिन्न फाइल सिस्टम के साथ प्रक्रियाओं का एक गुच्छा है। वे एक ही ओएस कर्नेल साझा करते हैं, केवल सिस्टम लाइब्रेरी और निर्भरता को एन्क्रिप्ट करते हैं।

यह ज्यादातर मामलों के लिए अच्छा है (कोई अतिरिक्त ओएस कर्नेल नहीं रखता है) लेकिन कंटेनर के बीच सख्त अलगाव आवश्यक है, तो यह एक समस्या हो सकती है।

यह क्यों मायने रखता है?

ये सब कुछ सुधार जैसा लगता है, क्रांति नहीं। खैर, मात्रात्मक संचय गुणात्मक परिवर्तन की ओर जाता है

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

जब डॉकटर की बात आती है, तो पुराने को बदलने के लिए एक नए बनाए गए डॉकटर कंटेनर का उपयोग करना असंभव है। रखरखाव बहुत आसान है! एक नई छवि बनाना, इसे क्यूए के साथ साझा करें, इसका परीक्षण करना, इसे तैनात करने में केवल मिनट लगते हैं (यदि सब कुछ स्वचालित है), सबसे खराब स्थिति में घंटे। इसे अपरिवर्तनीय अवसंरचना कहा जाता है : सॉफ़्टवेयर को अपग्रेड (अपग्रेड) न करें, इसके बजाय एक नया बनाएं।

यह परिवर्तित करता है कि सेवाओं को कैसे वितरित किया जाता है। हम एप्लिकेशन चाहते हैं, लेकिन वीएम को बनाए रखना है (जो कि एक दर्द है और हमारे अनुप्रयोगों के साथ बहुत कम है)। डॉकर आपको अनुप्रयोगों पर ध्यान केंद्रित करता है और सब कुछ सुचारू करता है।


27

डॉकर, मूल रूप से कंटेनर, OS वर्चुअलाइजेशन का समर्थन करता है अर्थात आपके एप्लिकेशन को लगता है कि इसमें ओएस का पूरा उदाहरण है जबकि VM हार्डवेयर वर्चुअलाइजेशन का समर्थन करता है । आपको लगता है कि यह एक भौतिक मशीन है जिसमें आप किसी भी ओएस को बूट कर सकते हैं।

डॉकर में, चलने वाले कंटेनर होस्ट OS कर्नेल साझा करते हैं, जबकि VMs में उनकी अपनी OS फाइलें होती हैं। वह वातावरण (OS) जिसमें आप एक एप्लिकेशन विकसित करते हैं, जब आप इसे "परीक्षण" या "उत्पादन" जैसे विभिन्न सेवारत परिवेशों में वितरित करते हैं, तो ऐसा ही होगा।

उदाहरण के लिए, यदि आप पोर्ट 4000 पर चलने वाले वेब सर्वर को विकसित करते हैं, जब आप इसे अपने "परीक्षण" वातावरण में वितरित करते हैं, तो वह पोर्ट पहले से ही किसी अन्य प्रोग्राम द्वारा उपयोग किया जाता है, इसलिए यह काम करना बंद कर देता है। कंटेनरों में परतें होती हैं; OS में आपके द्वारा किए गए सभी परिवर्तन एक या अधिक परतों में सहेजे जाएंगे और वे परतें छवि का हिस्सा होंगी, इसलिए जहां भी छवि जाती है निर्भरताएं भी मौजूद होंगी।

नीचे दिखाए गए उदाहरण में, मेजबान मशीन में तीन वीएम हैं। VMs को पूर्ण अलगाव में अनुप्रयोग प्रदान करने के लिए, उनके पास OS की पूर्ण-इन-मेमोरी उदाहरण के साथ, OS फ़ाइलों, पुस्तकालयों और एप्लिकेशन कोड की अपनी प्रतियां हैं।कंटेनर के बिना जबकि नीचे का आंकड़ा कंटेनरों के साथ समान परिदृश्य दिखाता है। यहां, कंटेनर केवल होस्ट ऑपरेटिंग सिस्टम को कर्नेल और लाइब्रेरी सहित साझा करते हैं, इसलिए उन्हें ओएस को बूट करने, लाइब्रेरी लोड करने या उन फ़ाइलों के लिए एक निजी मेमोरी लागत का भुगतान करने की आवश्यकता नहीं है। एकमात्र वृद्धिशील स्थान जो वे लेते हैं, कंटेनर में चलाने के लिए किसी भी मेमोरी और डिस्क स्थान के लिए आवश्यक है। जबकि एप्लिकेशन का वातावरण एक समर्पित OS की तरह लगता है, एप्लिकेशन वैसे ही समर्पित हो जाता है जैसे यह एक समर्पित होस्ट पर होता है। कंटेनरीकृत एप्लिकेशन सेकंड में शुरू होता है और आवेदन के कई और उदाहरण वीएम के मामले में मशीन पर फिट हो सकते हैं। यहां छवि विवरण दर्ज करें

स्रोत: https://azure.microsoft.com/en-us/blog/containers-docker-windows-and-trter/


मुझे पहला पैराग्राफ बहुत पसंद है।
लाइट.जी।

23

तीन अलग-अलग सेटअप हैं जो एक एप्लिकेशन को चलाने के लिए एक स्टैक प्रदान करते हैं (यह हमें यह पहचानने में मदद करेगा कि कंटेनर क्या है और यह अन्य समाधानों की तुलना में कितना शक्तिशाली है):

1) Traditional Servers(bare metal)
2) Virtual machines (VMs)
3) Containers

1) पारंपरिक सर्वर स्टैक में एक भौतिक सर्वर होता है जो एक ऑपरेटिंग सिस्टम और आपके एप्लिकेशन को चलाता है।

लाभ:

  • कच्चे संसाधनों का उपयोग

  • एकांत

नुकसान:

  • बहुत धीमी तैनाती का समय
  • महंगा
  • व्यर्थ संसाधन
  • पैमाना कठिन
  • प्रवास करना कठिन
  • जटिल विन्यास

2) वीएम स्टैक में एक भौतिक सर्वर होता है जो एक ऑपरेटिंग सिस्टम और एक हाइपरवाइजर चलाता है जो आपके वर्चुअल मशीन, साझा संसाधनों और नेटवर्किंग इंटरफ़ेस का प्रबंधन करता है। प्रत्येक Vm एक अतिथि ऑपरेटिंग सिस्टम, एक अनुप्रयोग या अनुप्रयोगों का सेट चलाता है।

लाभ:

  • संसाधनों का अच्छा उपयोग
  • पैमाने पर आसान
  • बैकअप और माइग्रेट करने में आसान
  • कीमत का सामर्थ्य
  • लचीलापन

नुकसान:

  • संसाधन आवंटन समस्याग्रस्त है
  • विक्रेता बंदी
  • जटिल विन्यास

3) कंटेनर सेटअप , अन्य स्टैक के साथ महत्वपूर्ण अंतर कंटेनर-आधारित वर्चुअलाइजेशन है मेजबान ओएस के कर्नेल का उपयोग कई अलग-थलग अतिथि उदाहरणों को रम करने के लिए किया जाता है। इन अतिथि उदाहरणों को कंटेनर कहा जाता है। मेजबान या तो एक भौतिक सर्वर या वीएम हो सकता है।

लाभ:

  • एकांत
  • लाइटवेट
  • संसाधन प्रभावी
  • माइग्रेट करने में आसान
  • सुरक्षा
  • कम उपरि
  • दर्पण उत्पादन और विकास का वातावरण

नुकसान:

  • वही वास्तुकला
  • संसाधन भारी ऐप्स
  • नेटवर्किंग और सुरक्षा के मुद्दे।

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


कृपया बताएं कि VMs की तुलना में यह "सबसे सुरक्षित सेटअप" क्यों होना चाहिए।
MKesper

@MKperper: जब आप विरासत के वातावरण से कंटेनर पर्यावरण की ओर पलायन करते हैं, तो आपके पास सुरक्षा प्रतिमान बनाने के विभिन्न तरीके होते हैं, एक जो घुसपैठ को रोकने के लिए प्रतिक्रियाशील दृष्टिकोण के बजाय सक्रिय पर आधारित होता है। यह आपको अपने एप्लिकेशन और रनटाइम को अधिक बारीक और बारीक स्तर पर सुरक्षित करने की अनुमति देता है। वे आपके वर्कफ़्लो को बाधित करने से पहले संभावित सुरक्षा खतरों की पहचान करने और उन्हें हल करने का अधिकार भी देते हैं। और, रनटाइम रक्षा को स्वचालित करने और अपने परिवेश में नीतियों को लागू करने के लिए एमएल के साथ स्थैतिक विश्लेषण को जोड़ना संभव है। इसलिए, लाइन "सबसे सुरक्षित सेटअप"।
mohan08p

18

के संदर्भ में:-

"क्यों एक सुसंगत उत्पादन वातावरण में तैनात करने की तुलना में एक डॉक छवि के लिए सॉफ्टवेयर को तैनात करना आसान है?"

अधिकांश सॉफ्टवेयरों को कई वातावरणों में तैनात किया जाता है, आमतौर पर निम्नलिखित में से न्यूनतम तीन:

  1. व्यक्तिगत डेवलपर पीसी
  2. डेवलपर वातावरण साझा किया
  3. व्यक्तिगत परीक्षक पीसी
  4. साझा पर्यावरण का परीक्षण किया
  5. क्यूए वातावरण
  6. UAT पर्यावरण
  7. लोड / प्रदर्शन परीक्षण
  8. लाइव मंचन
  9. उत्पादन
  10. पुरालेख

विचार करने के लिए निम्नलिखित कारक भी हैं:

  • डेवलपर्स, और वास्तव में परीक्षक, सभी के पास या तो सूक्ष्म या बहुत अलग पीसी कॉन्फ़िगरेशन होंगे, नौकरी की प्रकृति से
  • डेवलपर्स अक्सर कॉर्पोरेट या व्यावसायिक मानकीकरण नियमों के नियंत्रण से परे पीसी पर विकसित कर सकते हैं (उदाहरण के लिए फ्रीलांसर जो अपनी मशीनों पर विकसित होते हैं (अक्सर दूर से) या स्रोत प्रोजेक्ट खोलने के लिए योगदानकर्ता जो अपने पीसी को एक निश्चित रूप से कॉन्फ़िगर करने के लिए 'अनुबंधित' या 'अनुबंधित' नहीं हैं। मार्ग)
  • कुछ वातावरणों में लोड संतुलित कॉन्फ़िगरेशन में कई मशीनों की निश्चित संख्या शामिल होगी
  • ट्रैफ़िक स्तरों के आधार पर कई उत्पादन परिवेशों में गतिशील रूप से क्लाउड आधारित सर्वर (या 'elastically') बनेंगे और नष्ट हो जाएंगे

जैसा कि आप देख सकते हैं कि एक संगठन के लिए अतिरिक्त सर्वरों की कुल संख्या एकल आंकड़ों में शायद ही कभी होती है, ट्रिपल आंकड़ों में बहुत बार होती है और आसानी से काफी अधिक हो सकती है।

इसका मतलब यह है कि पहली बार सुसंगत वातावरण बनाना केवल पर्याप्त मात्रा में (यहां तक ​​कि हरे रंग के क्षेत्र में भी) मुश्किल है, लेकिन उन्हें लगातार बनाए रखना सभी असंभव है , लेकिन नए सर्वरों के अलावा, सर्वर की उच्च संख्या को देखते हुए (गतिशील रूप से या मैन्युअल रूप से), ओ / एस विक्रेताओं, एंटी-वायरस विक्रेताओं, ब्राउज़र विक्रेताओं और जैसे, मैनुअल सॉफ़्टवेयर इंस्टॉल या कॉन्फ़िगरेशन परिवर्तन डेवलपर्स या सर्वर तकनीशियनों द्वारा किए गए, आदि से स्वचालित अपडेट करते हैं। मुझे दोहराते हैं कि - यह वस्तुतः (कोई उद्देश्य नहीं है) असंभव पर्यावरण को सुसंगत रखने के लिए (ठीक है, शुद्धतावादी के लिए, यह किया जा सकता है, लेकिन इसमें भारी मात्रा में समय, प्रयास और अनुशासन शामिल है, यही कारण है कि वीएम और कंटेनर (जैसे डोकर) पहले स्थान पर तैयार किए गए थे)।

तो इस तरह से अपने प्रश्न के बारे में अधिक सोचें "सभी वातावरणों को लगातार बनाए रखने की अत्यधिक कठिनाई को देखते हुए, क्या सीखने की अवस्था को ध्यान में रखते हुए भी सॉफ़्टवेयर को डॉकटर छवि पर तैनात करना आसान है?" । मुझे लगता है कि आपको जवाब मिल जाएगा कि वास्तव में "हाँ" होगा - लेकिन यह पता लगाने का केवल एक ही तरीका है, इस नए प्रश्न को स्टैच ओवरफ्लो पर पोस्ट करें।


इसलिए, यदि मैं 15 अलग-अलग बॉक्सों के साथ अपनी डॉकटर छवि को तैनात करता हूं, जिसमें सभी अलग-अलग ओएस / संस्करण संयोजन हैं, तो मेरे सभी डॉकटर चित्र समान चलेंगे?
तेमन शिपाही

@Teomanshipahi यदि ये सभी कंटेनर होस्ट द्वारा प्रदान किए गए एक ही कर्नेल का उपयोग कर सकते हैं, तो हाँ, वे सभी सफलतापूर्वक चलेंगे।
लाइट.जी।

अगर मैं अपने स्थानीय पर खिड़कियों के लिए डॉकटर का उपयोग करता हूं, तो क्या मैं लिनक्स / मैक में उसी तरह तैनात और चला सकता हूं?
तेमन शिपाही

जो चीजें हमेशा चमकती हुई लगती हैं, वह यह है कि अभी भी संस्करण निर्भरताएं हैं: 1) डेवलपर को उसी वातावरण पर विकसित करना होगा जिसमें छवि शामिल है; 2) देव वातावरण और परीक्षण वातावरण को लिनक्स कर्नेल और डॉकटर दोनों के समान (या संगत) संस्करण चलाने की आवश्यकता है ... हाँ?
Bogatyr

18

ऐसे कई उत्तर हैं जो मतभेदों पर अधिक विस्तृत व्याख्या करते हैं, लेकिन यहां मेरी बहुत संक्षिप्त व्याख्या है।

एक महत्वपूर्ण अंतर यह है कि VM, OS को चलाने के लिए एक अलग कर्नेल का उपयोग करता है । यही कारण है कि यह भारी है और अधिक सिस्टम संसाधनों का उपभोग करते हुए बूट होने में समय लेता है।

डॉकर में, कंटेनर होस्ट के साथ कर्नेल साझा करते हैं ; इसलिए यह हल्का है और जल्दी से शुरू और बंद हो सकता है।

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

Docker UNION फाइल सिस्टम का उपयोग करता है .. कंटेनर द्वारा खपत मेमोरी स्पेस को कम करने के लिए Docker एक कॉपी-ऑन-राइट तकनीक का उपयोग करता है। यहाँ और पढ़ें


1
"वर्चुअलाइज़ेशन में, संसाधनों को सेट अप की शुरुआत में आवंटित किया जाता है और इसलिए संसाधनों का पूरी तरह से उपयोग नहीं किया जाता है जब वर्चुअल मशीन कई बार निष्क्रिय होती है" हाइपर- V में डायनेमिक मेमोरी की एक धारणा है जहां आप न्यूनतम, अधिकतम निर्दिष्ट कर सकते हैं। और स्टार्टअप राम।
Mariusz

15

एक वर्चुअल मशीन के साथ , हमारे पास एक सर्वर है, हमारे पास उस सर्वर पर एक होस्ट ऑपरेटिंग सिस्टम है, और फिर हमारे पास एक हाइपरवाइज़र है। और फिर उस हाइपरविजर के शीर्ष पर चल रहे हैं, हमारे पास किसी भी एप्लिकेशन और उसके आश्रित बायनेरिज़ के साथ अतिथि ऑपरेटिंग सिस्टम की संख्या है, और उस सर्वर पर लाइब्रेरी है। यह अपने साथ पूरे गेस्ट ऑपरेटिंग सिस्टम को लाता है। यह काफी भारी है। इसके अलावा एक सीमा है कि आप वास्तव में प्रत्येक भौतिक मशीन पर कितना डाल सकते हैं।

यहां छवि विवरण दर्ज करें

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

यह सब वहाँ है आवेदन कोड और किसी भी बायनेरिज़ और पुस्तकालयों की आवश्यकता होती है। और उन बायनेरिज़ और लाइब्रेरीज़ को वास्तव में अलग-अलग कंटेनरों में साझा किया जा सकता है यदि आप चाहते हैं कि वे भी हों। और यह हमें क्या करने के लिए सक्षम बनाता है, कई चीजें हैं। उनके पास स्टार्टअप का समय बहुत तेज है । आप उस तरह कुछ सेकंड में एक एकल वीएम खड़े नहीं हो सकते। और समान रूप से, उन्हें जल्दी से नीचे ले जा रहा है .. इसलिए हम बहुत तेज़ी से ऊपर और नीचे पैमाने पर कर सकते हैं और बाद में हम इसे देखेंगे।

यहां छवि विवरण दर्ज करें

हर कंटेनर को लगता है कि यह ऑपरेटिंग सिस्टम की अपनी कॉपी पर चल रहा है। यह अपनी खुद की फ़ाइल प्रणाली, स्वयं की रजिस्ट्री आदि प्राप्त कर चुका है, जो एक तरह का झूठ है। यह वास्तव में आभासीकृत किया जा रहा है।



11

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

डॉकर को LXC (लिनक्स कंटेनर) के आधार पर विकसित किया गया है और यह कई लिनक्स वितरणों, विशेष रूप से उबंटू में पूरी तरह से काम करता है।

डॉकर कंटेनर पृथक वातावरण हैं। आप इसे तब देख सकते हैं जब आप topएक Docker कंटेनर में कमांड जारी करते हैं जिसे Docker छवि से बनाया गया है।

इसके अलावा, वे dockerFile कॉन्फ़िगरेशन के लिए बहुत हल्के वजन और लचीले धन्यवाद हैं।

उदाहरण के लिए, आप एक डॉकर छवि बना सकते हैं और एक DockerFile को कॉन्फ़िगर कर सकते हैं और बता सकते हैं कि उदाहरण के लिए जब यह चल रहा हो, तब 'इस' को छोड़ दें, 'a' प्राप्त करें, 'कुछ शेल स्क्रिप्ट' चलाएं, पर्यावरण चर आदि की स्थापना करें।

सूक्ष्म सेवा परियोजनाओं और वास्तुकला में डॉकर एक बहुत व्यवहार्य संपत्ति है। आप Docker, Docker झुंड, Kubernetes और Docker Compose के साथ मापनीयता, लचीलापन और लोच प्राप्त कर सकते हैं।

डोकर के बारे में एक अन्य महत्वपूर्ण मुद्दा डॉकटर हब और उसके समुदाय है। उदाहरण के लिए, मैंने प्रोमेथियस, ग्राफाना, प्रोमेथियस-जेएमएक्स-एक्सपोर्टर और डॉकर का उपयोग करके काफ्का की निगरानी के लिए एक पारिस्थितिकी तंत्र लागू किया।

ऐसा करने के लिए, मैंने zockeeper, kafka, Prometheus, Grafana और jmx-संग्राहक के लिए Docker कंटेनरों को कॉन्फ़िगर किया है, फिर उनमें से कुछ के लिए YAML फ़ाइलों का उपयोग करके अपने स्वयं के कॉन्फ़िगरेशन को माउंट किया, या दूसरों के लिए, मैंने Docker कंटेनर और I में कुछ फ़ाइलों और कॉन्फ़िगरेशन को बदल दिया। अलगाव और मापनीयता और लचीलापन के साथ एक मशीन पर मल्टी-कंटेनर डॉकर्स का उपयोग करके कफ़्का की निगरानी के लिए एक पूरी प्रणाली का निर्माण करें कि इस वास्तुकला को आसानी से कई सर्वरों में स्थानांतरित किया जा सके।

Docker Hub साइट के अलावा quay.io नाम की एक और साइट है जिसका उपयोग आप अपनी खुद की Docker छवियों को डैशबोर्ड में करने के लिए कर सकते हैं और इससे / से / को खींच सकते हैं। आप डॉकर हब से डॉकर छवियों को भी आयात कर सकते हैं, फिर उन्हें अपनी मशीन पर क्वाइ से चला सकते हैं।

नोट: पहली जगह पर डॉकिंग सीखना जटिल और कठिन लगता है, लेकिन जब आपको इसकी आदत होती है तो आप इसके बिना काम नहीं कर सकते।

मुझे याद है कि डॉकटर के साथ काम करने के पहले दिन जब मैंने गलत आदेश जारी किए या अपने कंटेनर और सभी डेटा और कॉन्फ़िगरेशन गलत तरीके से हटा दिए।


6

इस तरह से डॉकटर ने अपना परिचय दिया:

डॉकर वह कंपनी है जो हाइब्रिड क्लाउड पर हर एप्लिकेशन को संबोधित करने के लिए कंटेनर मूवमेंट और एकमात्र कंटेनर प्लेटफ़ॉर्म प्रदाता चला रही है। आज के कारोबार डिजिटल रूप से बदलने के लिए दबाव में हैं, लेकिन मौजूदा अनुप्रयोगों और बुनियादी ढांचे द्वारा विवश हैं, जबकि बादलों, डेटासेंटर्स और एप्लिकेशन आर्किटेक्चर के एक विविध विविध पोर्टफोलियो को तर्कसंगत बनाते हैं। डॉकर अनुप्रयोगों और बुनियादी ढांचे और डेवलपर्स और आईटी ऑप्स के बीच अपनी क्षमता को अनलॉक करने के लिए सच्ची स्वतंत्रता को सक्षम बनाता है और बेहतर सहयोग और नवाचार के लिए एक मॉडल बनाता है।

तो डॉकर कंटेनर आधारित है, जिसका अर्थ है कि आपके पास चित्र और कंटेनर हैं जो आपके वर्तमान मशीन पर चलाए जा सकते हैं। यह वीएम एस जैसे ऑपरेटिंग सिस्टम को शामिल नहीं करता है , लेकिन विभिन्न काम करने वाले पैक जैसे जावा, टॉमकैट, आदि।

यदि आप कंटेनरों को समझते हैं, तो आपको मिलता है कि डॉकर क्या है और यह वीएम से कैसे अलग है ...

तो, एक कंटेनर क्या है?

एक कंटेनर छवि सॉफ्टवेयर के एक हल्के, अकेले, निष्पादन योग्य पैकेज है जिसमें इसे चलाने के लिए आवश्यक सब कुछ शामिल है: कोड, रनटाइम, सिस्टम टूल्स, सिस्टम लाइब्रेरी, सेटिंग्स। लिनक्स और विंडोज आधारित दोनों ऐप के लिए उपलब्ध, कंटेनरीकृत सॉफ्टवेयर हमेशा पर्यावरण की परवाह किए बिना, समान ही चलेगा। कंटेनर अपने परिवेश से सॉफ़्टवेयर को अलग करते हैं, उदाहरण के लिए विकास और मंचन के वातावरण के बीच अंतर और एक ही बुनियादी ढांचे पर विभिन्न सॉफ़्टवेयर चलाने वाली टीमों के बीच संघर्ष को कम करने में मदद करते हैं।

डाक में काम करनेवाला मज़दूर

तो जैसा कि आप नीचे दी गई छवि में देखते हैं, प्रत्येक कंटेनर में एक अलग पैक है और मशीन के ऑपरेटिंग सिस्टम पर एक ही मशीन शेयर पर चल रहा है ... वे सुरक्षित और जहाज के लिए आसान हैं ...


4

यहाँ बहुत सारे अच्छे तकनीकी उत्तर हैं जो स्पष्ट रूप से VMs और कंटेनरों के बीच के अंतर के साथ-साथ Docker की उत्पत्ति पर चर्चा करते हैं।

मेरे लिए VMs और डॉकर के बीच मूलभूत अंतर यह है कि आप अपने आवेदन के प्रचार का प्रबंधन कैसे करते हैं।

वीएम के साथ आप अपने आवेदन और उसकी निर्भरता को एक वीएम से अगले डेव से यूएटी तक पीआरडी तक बढ़ावा देते हैं।

  1. अक्सर इन वीएम के पास अलग-अलग पैच और लाइब्रेरी होंगे।
  2. एक वीएम को साझा करने के लिए कई अनुप्रयोगों के लिए यह असामान्य नहीं है। इसके लिए सभी अनुप्रयोगों के लिए कॉन्फ़िगरेशन और निर्भरता के प्रबंधन की आवश्यकता होती है।
  3. बैकआउट को वीएम में पूर्ववत बदलाव की आवश्यकता होती है। या यदि संभव हो तो इसे बहाल करना।

डॉकर के साथ यह विचार है कि आप अपने एप्लिकेशन को अपने स्वयं के कंटेनर के साथ बंडल करें जिसमें यह आवश्यक है और फिर पूरे कंटेनर को एक इकाई के रूप में प्रचारित करें ।

  1. कर्नेल को छोड़कर पैच और लाइब्रेरी समान हैं।
  2. एक सामान्य नियम के रूप में प्रति कंटेनर केवल एक आवेदन है जो कॉन्फ़िगरेशन को सरल करता है।
  3. बैकआउट में कंटेनर को रोकना और हटाना शामिल है।

इसलिए वीएम के साथ सबसे बुनियादी स्तर पर आप असतत घटकों के रूप में आवेदन और उसकी निर्भरता को बढ़ावा देते हैं जबकि डॉकर के साथ आप एक हिट में सब कुछ को बढ़ावा देते हैं।

और हां, कंटेनरों के साथ समस्याएँ भी हैं जिनमें उनका प्रबंधन करना शामिल है, हालांकि कुबेरनेट्स या डॉकर झुंड जैसे उपकरण कार्य को सरल बनाते हैं।

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