2015-11-30 5 views
5

डोकर best practices गाइड के लिए कहा गया है कि एक प्रक्रिया और PHP-FPM अलग कंटेनरों में चलाया जाता है? या इसका मतलब यह है कि माइक्रो सेवा आर्किटेक्चर केवल एक सेवा या "एप" एक कंटेनर में चलाते हैं?डोकर सर्वोत्तम प्रथाओं:</p> <p><em>"... आप केवल एक ही कंटेनर में एक भी प्रक्रिया चलाना चाहिए ..."</em></p> <p>चाहिए Nginx: एक कंटेनर

इन सेवाओं को एक कंटेनर में रखने के लिए तैनाती और रखरखाव करना आसान लगता है।

+1

मैंने हाल ही में डॉकर का उपयोग करना शुरू कर दिया है और उसी क्वेरी में आ गया है। मैं प्रत्येक के लिए अलग कंटेनर होने के समाप्त हो गया। मुझे यह जानने में दिलचस्पी होगी कि यह क्यों 'सर्वश्रेष्ठ अभ्यास' है। – DavidT

+0

@ डेविड टी क्योंकि यह आपको सेवा की कॉन्फ़िगरेशन को संशोधित किए बिना, डॉकर संरचना/कॉन्फ़िगरेशन स्तर पर सेवा को स्केल करने की अनुमति देता है। – Gajus

उत्तर

5

उपयोग के मामले के आधार पर, आप एक ही कंटेनर के अंदर कई प्रक्रियाएं चला सकते हैं, हालांकि मैं इसकी अनुशंसा नहीं करूंगा।

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

तो: (: 443,: 80)

  1. मैं nginx कि बाहर की दुनिया के संपर्क में है के साथ एक कंटेनर होना। इस स्तर पर यह कॉन्फ़िगरेशन, टीएलएस प्रमाणपत्र, लोड बैलेंसर विकल्प इत्यादि का प्रबंधन करने के लिए सीधा है
  2. एप्लिकेशन के साथ एक (या अधिक) कंटेनर। उस मामले में ऐप के साथ एक php-fpm कंटेनर। डॉकर छवि स्टेटलेस है, कंटेनर माउंट और स्थिर फाइलों के लिए वॉल्यूम साझा करते हैं और इसी तरह। इस बिंदु पर, आप लोड-बैलेंसर को ऊपर और चलते हुए, एप्लिकेशन कंटेनर को नष्ट और फिर से बनाने के लिए किसी भी समय कर सकते हैं। साथ ही, आपके पास एक ही प्रॉक्सी (nginx) के पीछे कई एप्लिकेशन हो सकते हैं, और उनमें से एक को प्रबंधित करना दूसरों को प्रभावित नहीं करेगा।
  3. डेटाबेस के लिए एक या अधिक कंटेनर ... समान लाभ लागू होते हैं।
  4. Redis, Memcache आदि

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

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

+0

बहुत अच्छी तरह से उत्तर दिया। मुझे एक nginx आगे प्रॉक्सी के पीछे कई ऐप उदाहरणों के विचार पसंद है। हालांकि अगर मैं चल रहा हूं तो दो अनुप्रयोग (4x उदाहरण) मैं nginx.conf फ़ाइल को कैसे कॉन्फ़िगर कर सकता हूं? क्या PHP-APP-1 और PHP-APP-2 से nginx कंटेनर में कॉन्फ़िगरेशन पास करना संभव है? – AndrewMcLagan

+0

व्यक्तिगत रूप से, मैं स्पष्ट रूप से nginx की कॉन्फ़िगरेशन को परिभाषित कर रहा हूं (यह स्पष्ट रूप से करने के लिए एक आंतरिक नीति है)। सबसे पहले, मैं प्रत्येक एप्लिकेशन के लिए nginx.conf में बदलाव नहीं कर रहा हूं, लेकिन मेरे पास प्रत्येक एप्लिकेशन के लिए/etc/nginx/साइट-सक्षम निर्देशिका में अलग कॉन्फ़िगरेशन फ़ाइलें हैं जो nginx.conf में शामिल है। आप कंटेनर से कॉन्फ़िगरेशन फ़ाइलों को सुधार और ले सकते हैं। ;) – mishunika

2

इसका मतलब है शब्द के लिनक्स/यूनिक्स अर्थ में प्रक्रिया। उस ने कहा, एक कंटेनर में एकाधिक प्रक्रियाओं को चलाने से आपको रोक नहीं रहा है, यह सिर्फ एक अनुशंसित प्रतिमान नहीं है।

1

हमने पाया है कि हम Supervisord का उपयोग करके कई सेवाएं चला सकते हैं। यह आर्किटेक्चर को बहुत आसान बनाता है, केवल इतना आवश्यक है कि आपके पास अतिरिक्त पर्यवेक्षक.conf फ़ाइल हो।

supervisord.conf

[supervisord] 
nodaemon=true 

[program:apache2] 
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND" 

[program:udpparser] 
command=bin/bash -c "exec /usr/bin/php -f /home/www-server/services/udp_parser.php" 

Dockerfile से:: उदाहरण के लिए

FROM ubuntu:14.04 

RUN apt-get update 
RUN apt-get install -y apache2 supervisor php5 php5-mysql php5-cli 

RUN mkdir -p /var/lock/apache2 /var/run/apache2 /var/log/supervisor 

RUN a2enmod rewrite 
RUN a2enmod ssl 

COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf 

ADD 000-default.conf /etc/apache2/sites-enabled/ 
ADD default-ssl.conf /etc/apache2/sites-enabled/ 
ADD apache2.conf /etc/apache2/ 
ADD www-server/ /home/www-server/ 

EXPOSE 80 443 30089 

CMD ["/usr/bin/supervisord"] 

के रूप में एक सबसे अच्छा अभ्यास हम केवल मामलों में जहां सेवाओं को एक साथ चलने से लाभ में ऐसा जबकि अन्य सभी कंटेनर स्टैंड-अलोन माइक्रो-सर्विसेज हैं।

+0

हालांकि इसका मतलब है कि आप केवल एक 'सीएमडी' का उपयोग करके कई प्रक्रियाएं चला सकते हैं, फिर भी आपके पास वास्तव में एक ही कंटेनर में चल रही कई प्रक्रियाएं हैं। तो क्या यह उस सर्वोत्तम अभ्यास के खिलाफ नहीं जाता है, या क्या मैंने गलत समझा है? यहां तक ​​कि [डॉकर] (https://docs.docker.com/engine/articles/using_supervisord/) ऐसा करने का सुझाव देते हैं। बताते हुए * "इस उदाहरण में हम अपने कंटेनर में * *** एकाधिक प्रक्रियाओं *** * को प्रबंधित करने के लिए प्रक्रिया प्रबंधन उपकरण, पर्यवेक्षक का उपयोग करने जा रहे हैं। * * - जो भ्रमित है! – DavidT

+1

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

+0

ठीक है धन्यवाद, यह समझ में आता है। – DavidT

संबंधित मुद्दे