मैं कई सेवाओं को चलाने के लिए कई बार डोकर सीएमडी का उपयोग क्यों नहीं कर सकता?


96

मैंने Dockerfile से सेंटोस + ssh नाम की बेस इमेज बनाई है। सेंटोस + ssh के डॉकरफाइल में, मैं ssh सेवा चलाने के लिए CMD का उपयोग करता हूं।

फिर मैं खरगोशबक्म, डॉकफाइल नामक अन्य सेवा चलाने के लिए एक छवि बनाना चाहता हूं:

FROM centos+ssh
EXPOSE 22
EXPOSE 4149
CMD /opt/mq/sbin/rabbitmq-server start

खरगोशबैंक कंटेनर शुरू करने के लिए : रन q

docker run -d -p 222:22 -p 4149:4149 rabbitmq

लेकिन ssh सेवा काम नहीं करती है, यह समझ में आता है कि rabbitmq का Dockerfile CMD सेंटोस के CMD को ओवरराइड करता है।

  1. डॉक इमेज के अंदर CMD कैसे काम करता है?
  2. अगर मैं कई सेवा चलाना चाहता हूं, तो कैसे? पर्यवेक्षक का उपयोग करना?

जवाबों:


62

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

यदि आप कई सेवाएं चलाना चाहते हैं, तो मैं वास्तव में पर्यवेक्षक का उपयोग करूंगा। आप प्रत्येक सेवा के लिए एक पर्यवेक्षक विन्यास फाइल बना सकते हैं, इनको एक निर्देशिका में जोड़ सकते हैं, और पर्यवेक्षक supervisord -c /etc/supervisorको एक पर्यवेक्षक विन्यास फाइल की ओर संकेत कर सकते हैं, जो आपकी सभी सेवाओं को लोड करती है और जैसा दिखता है

[supervisord]
nodaemon=true

[include]
files = /etc/supervisor/conf.d/*.conf

यदि आप अधिक जानकारी चाहते हैं, तो मैंने इस विषय पर यहाँ एक ब्लॉग लिखा है: http://blog.trifork.com/2014/03/11/using-supervisor-with-docker-to-manage-processes-supporting-image- विरासत /


धन्यवाद, पर्यवेक्षक एक अच्छा विचार है, लेकिन मुझे आश्चर्य है कि सीएमडी
डॉक

2
आपने दो प्रश्न पूछे, 2. कई सेवाएं चलाने पर। सीएमडी कैसे काम करता है, यह सोचकर कि आप विशेष रूप से क्या जानना चाहते हैं, कृपया विस्तार से बताएं। मैंने पहले से ही इसे रनटाइम जानकारी होने और किसी भी नए सीएमडी द्वारा अधिलेखित होने का उल्लेख किया था।
किक्राइजर

118

आप सही कह रहे हैं, दूसरा डॉकरीफाइल CMDपहले वाले की कमान को अधिलेखित कर देगा । डॉकर हमेशा एक ही कमांड चलाएगा, अधिक नहीं। तो अपने डॉकरफाइल के अंत में, आप चलाने के लिए एक कमांड निर्दिष्ट कर सकते हैं । और नहीं।

लेकिन आप दोनों आदेशों को एक पंक्ति में निष्पादित कर सकते हैं:

FROM centos+ssh
EXPOSE 22
EXPOSE 4149
CMD service sshd start && /opt/mq/sbin/rabbitmq-server start

आप अपने Dockerfile को थोड़ा साफ करने के लिए क्या कर सकते हैं, आप अपनी CMD कमांड को एक अतिरिक्त फाइल में डाल सकते हैं:

FROM centos+ssh
EXPOSE 22
EXPOSE 4149
CMD sh /home/centos/all_your_commands.sh

और इस तरह एक फ़ाइल:

service sshd start &
/opt/mq/sbin/rabbitmq-server start

1
धन्यवाद, मुझे लगता है कि पर्यवेक्षक का उपयोग बेहतर है। लेकिन क्यों docker केवल एक CMD चलाते हैं? अंदर क्या होता है?
एडवर्ड्सबीन

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

मुझे लगता है कि शायद यह lcx या किसी चीज़ की सीमा के कारण है
एडवर्ड्सबीयन

2
@ त्यागू 7 .. क्योंकि ................?
स्टार्टअपगूय

1
&&तकनीक केवल गैर-संवादात्मक सेवाओं के साथ काम करेगी (जो कि पृष्ठभूमि में शुरू हो सकती है) और केवल पहले एक ही चलेगी।
नोजाज

26

जबकि मैं qkrijger के उत्तर का सम्मान करते हुए बता रहा हूं कि आप इस मुद्दे पर कैसे काम कर सकते हैं, मुझे लगता है कि बहुत कुछ है जो हम यहां सीख सकते हैं ...

वास्तव में " क्यों " के आपके प्रश्न का उत्तर देने के लिए ... मुझे लगता है कि यह आपके लिए यह समझने में सहायक होगा कि docker stopकमांड कैसे काम करता है और समस्याओं को रोकने के लिए सभी प्रक्रियाओं को सफाई से बंद करना चाहिए जब आप उन्हें फिर से शुरू करने की कोशिश करते हैं (भ्रष्टाचार आदि)।

समस्या: क्या होगा अगर docker ने SSH को इसके कमांड से शुरू किया और आपकी Docker फाइल से RabbitMQ शुरू किया? " डॉकटर स्टॉप कंटेनर में रूट प्रोसेस (PID 1) को SIGTERM सिग्नल भेजकर सबसे पहले एक रनिंग कंटेनर को रोकने का कमांड प्रयास करता है। " PID 1 के रूप में डॉक ट्रैकिंग कौन सी प्रक्रिया है जिससे SIGTERM मिलेगा? क्या यह SSH या खरगोश होगा ?? "यूनिक्स प्रक्रिया मॉडल के अनुसार, इनिट प्रक्रिया - पीआईडी ​​1 - सभी अनाथ बच्चे की प्रक्रियाओं को विरासत में मिला है और उन्हें पुनः प्राप्त करना चाहिए। अधिकांश डॉकर कंटेनरों में एक इनिट प्रक्रिया नहीं होती है जो इसे सही ढंग से करती है, और परिणामस्वरूप उनके कंटेनर भरे हुए हैं। समय के साथ ज़ोंबी प्रक्रियाएं। ”

उत्तर: डॉकर बस उस अंतिम सीएमडी को लेता है, जो कि पीआईडी ​​1 के साथ रूट प्रक्रिया के रूप में लॉन्च किया जाएगा और इससे SIGTERM मिलेगा docker stop

सुझाया गया समाधान: आपको विशेष रूप से एक से अधिक सेवाओं को चलाने के लिए बनाई गई आधार छवि (जैसे या बनाना) का उपयोग करना चाहिए, जैसे कि फ़्यूज़न / बेसिमेज

यह ध्यान रखें कि महत्वपूर्ण होना चाहिए tini इस कारण के लिए वास्तव में मौजूद है, और डोकर 1.13 की और ऊपर के रूप में, tini आधिकारिक तौर पर डोकर, जो हमें बताता है कि डोकर में एक से अधिक चल रही प्रक्रिया को का हिस्सा है मान्य है .. ताकि यदि कोई दावा डॉकर के संबंध में और अधिक कुशल बनें, और जोर देकर कहते हैं कि ऐसा करने की सोच के लिए आप बेतुके हैं, जानते हैं कि आप नहीं हैं। ऐसा करने के लिए पूरी तरह से मान्य परिस्थितियां हैं।

जानकार अच्छा लगा:


3

आधिकारिक डॉकटर एक कंटेनर में कई सेवाओं को चलाने के लिए जवाब देता है

यह बताता है कि आप इसे init system (systemd, sysvinit, upstart), एक स्क्रिप्ट ( CMD ./my_wrapper_script.sh) या पर्यवेक्षक की तरह कैसे कर सकते हैं supervisord

&&वैकल्पिक हल केवल सेवाओं है कि पृष्ठभूमि (डेमॉन) में शुरू होता है के लिए काम कर सकते हैं या कि सहभागिता के बिना जल्दी से निष्पादित और शीघ्र जारी करेंगे। एक संवादात्मक सेवा के साथ ऐसा करना (जो कि संकेत देता है) और केवल पहली सेवा शुरू होगी।


0

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

तो चलिए स्वीकार करते हैं कि यह अच्छी प्रथाओं के लिए डोकर (और कुबेरनेट्स / ओपेंशिफ्ट) डिजाइनरों से एक 'नग' है और हमें वर्कआर्ड्र्स को फिर से नहीं करना चाहिए (एसएसएच आवश्यक नहीं है - हमने docker exec / kubectl exec / oc rshइसे बदलने के लिए डिज़ाइन किया है)।

  • और जानकारी

/devops/447/why-it-is-recommended-to-run-only-one-process-in-a-container

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