कंटेनर में केवल एक प्रक्रिया को चलाने की सिफारिश क्यों की जाती है?


79

कई ब्लॉग पोस्ट, और सामान्य राय में, एक कहावत है कि "प्रति कंटेनर एक प्रक्रिया" जाती है।

यह नियम क्यों मौजूद है? एक ही कंटेनर में ntp, nginx, uwsgi और अधिक प्रक्रियाओं को क्यों नहीं चलाना चाहिए जो सभी प्रक्रियाओं को काम करने की आवश्यकता है?

इस नियम का उल्लेख करने वाले ब्लॉग पोस्ट:


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

@ जे। यह शायद ठीक नहीं होगा। कंटेनर VMs की तुलना में अलग हैं, एक छोटे से आवेदन के लिए भी कई छोटी समस्याएं हैं - एक उद्यम रोलआउट के लिए यह एक दो साल की परियोजना होगी यह सब पहली जगह में एक कंटेनर में चलाने के लिए मिलता है।
एवगेनी

जवाबों:


65

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

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

ध्यान दें कि मैं फ़ंक्शन कह रहा हूं, प्रक्रिया नहीं। वह भाषा पुरानी है। आधिकारिक डॉकटर प्रलेखन "एक प्रक्रिया" के बजाय "एक चिंता" प्रति कंटेनर की सिफारिश करने से दूर चला गया है


1
फिर भी, यह लगता है कि थ्रेड्स के खिलाफ निम्न-स्तरीय तर्क यहां फिट बैठता है ... web.stanford.edu/~ouster/cgi-bin/papers/threads.pdf
jeffmcneill

शानदार, व्यापक उत्तर!
रोब वेल्स

क्या यह विचार है कि प्रश्न का वास्तव में OS अर्थ में 'प्रक्रिया' का मतलब नहीं था - कि docker और संबंधित लेखन एक अलग शब्दावली का उपयोग कर रहे थे जिसे अब 'फ़ंक्शन' शब्द पर स्विच करके स्पष्ट किया गया है? क्योंकि अन्यथा, जबकि मैं स्वीकार करता हूं कि यह स्वीकृत और उच्चतम श्रेणी का उत्तर है, मुझे नहीं लगता कि यह उस प्रश्न का उत्तर देता है जो पूछा गया था।
टॉम

27

कुछ दिनों पहले एक "दो प्रक्रियाओं" कंटेनर को मारने के बाद, मेरे लिए कुछ दर्द बिंदु हैं, जिसके कारण मुझे एक अजगर स्क्रिप्ट के बजाय दो कंटेनर का उपयोग करना पड़ा, जिसने दो प्रक्रियाएं शुरू कीं:

  1. दुर्घटनाग्रस्त कंटेनरों को पहचानने में डॉकर अच्छा है। ऐसा नहीं हो सकता कि जब मुख्य प्रक्रिया ठीक लगे, लेकिन कुछ अन्य प्रक्रिया में भीषण मौत हुई। ज़रूर, आप अपनी प्रक्रिया को मैन्युअल रूप से मॉनिटर कर सकते हैं, लेकिन इसे फिर से क्यों लागू करें?
  2. जब कई प्रक्रियाएं कंसोल में अपने लॉग को उगल रही होती हैं, डॉक लॉग बहुत कम उपयोगी होता है। फिर, आप लॉग को प्रक्रिया का नाम लिख सकते हैं, लेकिन docker ऐसा भी कर सकते हैं।
  3. कंटेनर के बारे में परीक्षण और तर्क बहुत कठिन है।

यह स्वीकृत उत्तर होना चाहिए।
क्लिंटन

माना। जबकि कुछ महान बिंदुओं के साथ कुछ अन्य उत्तर हैं, मुख्य बिंदु डॉक के पीआईडी ​​1 को संभालने के बारे में है।
ब्रेट वैगनर

13

सिफारिश ऑपरेटिंग-सिस्टम-स्तरीय वर्चुअलाइजेशन के लक्ष्य और डिजाइन से आती है

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

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

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

यहाँ मैं सोच सकता हूँ कि भारी ट्विकिंग / नुकसान की गैर थकाऊ सूची है:

  • लॉग को संभालना

    या तो एक घुड़सवार मात्रा के साथ या stdout पर interleaved होने के नाते यह कुछ प्रबंधन लाता है। यदि एक माउंटेड वॉल्यूम का उपयोग करते हुए आपके कंटेनर में होस्ट पर "स्थान" होना चाहिए या दो ही कंटेनर एक ही संसाधन के लिए लड़ेंगे। जब इसका लाभ उठाने के लिए स्टडआउट पर इंटरलेइंग करना docker logsविश्लेषण के लिए एक बुरा सपना बन सकता है अगर स्रोतों को आसानी से पहचाना नहीं जा सकता है।

  • ज़ोंबी प्रक्रियाओं से सावधान रहें

    यदि कंटेनर क्रैश में आपकी कोई प्रक्रिया होती है, तो हो सकता है कि पर्यवेक्षक ज़ोंबी स्थिति में चिल्ड को साफ करने में सक्षम न हो, और मेजबान इनिट कभी भी उन्हें विरासत में नहीं मिलेगा। एक बार जब आप उपलब्ध pids की संख्या को समाप्त कर लेते हैं (2 ^ 22 तो लगभग 4 लाख) चीजों का एक गुच्छा विफल हो जाएगा।

  • चिंताओ का विभाजन

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

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


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

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

1
BTW, मेरा मानना ​​है कि मल्टी-प्रोसेस कंटेनर के खिलाफ वैध तर्क हैं, लेकिन आपने उनमें से किसी का भी उल्लेख नहीं किया है। लेकिन किसी भी मामले में, यह एक स्पष्ट कटौती मामला होने से बहुत दूर है। कुछ मामलों में यह एक से अधिक प्रक्रिया की अनुमति देने के लिए पूरी तरह से स्वीकार्य है। हेक, कुछ बहुत लोकप्रिय छवियां कई उप-प्रक्रिया को जन्म देती हैं - क्या वह बुराई भी है? मैं जो कह रहा हूं उसमें ट्रेड-ऑफ हैं, और आपके जवाब में एकतरफा तस्वीर है जिसमें कमी और विस्तार नहीं है।
असफ लवी

1
दिलचस्प ... ऐसा लगता है कि हम इस पर समान (समान) राय रखते हैं। हो सकता है कि तुम सिर्फ इस मामले में उस पर ध्यान नहीं देना चाहिए, क्योंकि यह कोई ऐसा जो कमाने के लिए करना चाहता था से था समालोचक बिल्ला ... और कहा कि बैज दिया आपका जवाब दुरुपयोग करने का फैसला किया ...
Pierre.Vriens

1
मैं निष्कर्ष निकालने के लिए "जल्दी" नहीं करता ... मैं आपको इसे अनदेखा करने की सलाह देता हूं। लेकिन "आप" मेरे दिमाग को उस चीज़ में नहीं बदल सकते, जो मैंने अपनी आँखों से देखा है, जिसके बारे में आपके उत्तर का गुमनाम उत्तरदाता है। वैसे भी, समय पर स्थानांतरित करने के लिए ...
Pierre.Vriens

6

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

ऐसे मामले हैं जहां यह एक एकल कंटेनर में कई प्रक्रियाओं को चलाने के लिए समझ में आता है, जब तक कि दोनों प्रक्रियाएं एकल, मॉड्यूलर फ़ंक्शन का समर्थन करती हैं।


2

जिस प्रक्रिया को मैंने यहाँ सेवा के रूप में कहा है, 1 कंटेनर ~ 1 सेवा , अगर मेरी कोई भी सेवा विफल हो जाती है, तो मैं केवल उस संबंधित कंटेनर को स्पिन करूंगा और सेकंड के साथ सब कुछ फिर से उठ जाएगा। इसलिए, सेवाओं के बीच कोई निर्भरता नहीं होगी। अपने कंटेनर के आकार को 200 एमबी और अधिकतम 500 एमबी से कम रखना सबसे अच्छा अभ्यास है (विंडोज़ देशी कंटेनरों का अपवाद 2 जीबी से अधिक है) अन्यथा, इसकी मशीन वर्चुअल मशीन के समान होने जा रही है, बिल्कुल नहीं, लेकिन प्रदर्शन पर्याप्त है। इसके अलावा, स्केलिंग के रूप में कुछ मापदंडों पर ध्यान दें, मैं अपनी सेवाओं को लचीलापन, ऑटो-तैनाती आदि कैसे बना सकता हूं।

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

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