क्या मैं डॉकटर कंटेनर में कई प्रोग्राम चला सकता हूं?


150

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


2
मौके पर: मुझे आश्चर्य होता है कि डॉकटर इतने लोकप्रिय क्यों थे .. (एकल प्रक्रिया ..?) - लेकिन देखते हैं कि उत्तर हमें क्या बताते हैं ..
javadba

जवाबों:


120

केवल एक ENTRYPOINT हो सकता है, लेकिन यह लक्ष्य आमतौर पर एक स्क्रिप्ट है जो कई कार्यक्रमों को लॉन्च करता है जिनकी आवश्यकता होती है। आप इसके अलावा उदाहरण के लिए उपयोग कर सकते हैं Supervisord या एकल कंटेनर के अंदर कई सेवाओं को लॉन्च करने की देखभाल करने के लिए समान है। यह एक एकल कंटेनर के भीतर mysql, अपाचे और वर्डप्रेस चलाने वाले डॉक कंटेनर का एक उदाहरण है

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

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

जब वे अलग-अलग कंटेनरों में चल रहे होते हैं तो कम से कम दो संभावनाएं होती हैं कि अनुप्रयोग एक-दूसरे से कैसे संवाद कर सकते हैं:

  1. उजागर आईपी पोर्ट का उपयोग करें और उनके माध्यम से कनेक्ट करें।
  2. हाल के डॉक वर्जन लिंकिंग को सपोर्ट करते हैं

1
ऐसा लगता है कि डॉकर्स के नए संस्करण अब डॉकर कंटेनर नेटवर्क का समर्थन करते हैं ।
जिपरसन

डॉकर अब पर्यवेक्षक को चलाने का समर्थन करता है, जिससे आप प्रत्येक प्रक्रिया जैसे ऑटोरेस्टार्ट = सच, stdout_logfile, stderr_logfile आदि के लिए व्यवहार को अलग कर सकते हैं। docs.docker.engine/admin/ using_supervisord
Andreas Lundgren

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

@ निकोलस-वैन यह सरल क्यों है? क्या ऐसा इसलिए है क्योंकि अगर db की मृत्यु हो जाती है तो मैं db के कंटेनर को पुनः आरंभ कर सकता हूं बजाय इसके कि वह पूरी चीज को पुनः आरंभ कर सके?
brillout

एक ही मशीन पर एप्लिकेशन यूनिक्स डोमेन सॉकेट पर भी संचार कर सकते हैं । उच्चतम प्रदर्शन की गारंटी।
संशयपूर्ण नियम

21

मुझे LAMP स्टैक, मोंगो डीबी और अपनी सेवाओं को चलाने की समान आवश्यकता थी

डॉकर ओएस आधारित वर्चुअलाइजेशन है, यही कारण है कि यह अपने कंटेनर को एक चल रही प्रक्रिया के आसपास अलग करता है, इसलिए इसे FOREGROUND में चलने वाली कम से कम एक प्रक्रिया की आवश्यकता होती है।

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

तो मेरी डॉकर छवि फ़ाइल में बहुत अंत में दो लाइन नीचे हैं:

COPY myStartupScript.sh /usr/local/myscripts/myStartupScript.sh
CMD ["/bin/bash", "/usr/local/myscripts/myStartupScript.sh"]

अपनी स्क्रिप्ट में मैं सभी MySQL, MongoDB, Tomcat आदि चलाता हूं। अंत में मैं अपनी अपाचे को अग्रभूमि के धागे के रूप में चलाता हूं।

source /etc/apache2/envvars
/usr/sbin/apache2 -DFOREGROUND

यह मुझे अपनी सभी सेवाओं को शुरू करने और कंटेनर को जीवित रखने के लिए सक्षम बनाता है और अंतिम सेवा अग्रभूमि में होने लगी

आशा करता हूँ की ये काम करेगा

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


6

मैं कुछ पिछले समाधानों से दृढ़ता से असहमत हूं, जो एक ही कंटेनर में दोनों सेवाओं को चलाने की सिफारिश करते हैं। यह प्रलेखन में स्पष्ट रूप से कहा गया है कि यह अनुशंसित नहीं है :

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

पर्यवेक्षक या इसी तरह के कार्यक्रमों के लिए अच्छे उपयोग के मामले हैं लेकिन वेब एप्लिकेशन + डेटाबेस चलाना उनका हिस्सा नहीं है।

आपको निश्चित रूप से ऐसा करने के लिए docker-compose का उपयोग करना चाहिए और विभिन्न जिम्मेदारियों के साथ कई कंटेनरों को ऑर्केस्ट्रेट करना चाहिए ।


2
यह एक टिप्पणी है, एक जवाब नहीं है। कृपया इस स्थिति का समर्थन करने के लिए स्पष्टीकरण और / या लिंक जोड़ने पर विचार करें। अन्यथा यह सहायक नहीं है।
इवान इवानोव

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

प्रश्न एक कंटेनर में 2 प्रक्रियाएं चलाने के बारे में है, इस प्रकार सर्वोत्तम प्रथाओं की परवाह नहीं है। मैं आपको एक उदाहरण दूंगा: मुझे फोटॉनओएस आधारित छवि और एक जावा प्रक्रिया के अंदर भी खरगोश को चलाना था ... इसलिए मैंने एक प्रविष्टि स्क्रिप्ट का उपयोग किया और ENTRYPOINT :) के रूप में उपयोग किया गया
7

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

5

वे अलग-अलग कंटेनरों में हो सकते हैं, और वास्तव में, यदि आवेदन को बड़े वातावरण में चलाने का इरादा था, तो वे संभवतः होंगे।

एक मल्टी-कंटेनर सिस्टम को सभी आवश्यक निर्भरताओं को लाने में सक्षम होने के लिए कुछ और ऑर्केस्ट्रेशन की आवश्यकता होगी, हालांकि डॉकर v0.6.5 + में, डॉकर में ही निर्मित में मदद करने के लिए एक नई सुविधा है - लिंकिंग । एक बहु-मशीन समाधान के साथ, इसका अभी भी कुछ ऐसा है जिसे डॉकर पर्यावरण के बाहर से व्यवस्थित करना है।

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

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


3

मैं अन्य जवाबों से सहमत हूं कि दो कंटेनरों का उपयोग करना बेहतर है, लेकिन यदि आपके पास एक कंटेनर में कई सेवाओं को बांधने पर आपका दिल है, तो आप पर्यवेक्षक की तरह कुछ का उपयोग कर सकते हैं।

उदाहरण के लिए, हिपाचे में , शामिल डॉकफर्इल सुपरवाइजर चलाता है, और फाइल सुपरसॉर्ड.कॉन्फ़ दोनों को चलाने के लिए हाइपचे और रेडिस-सर्वर निर्दिष्ट करता है।


2

डॉकर इसे कैसे करना है, इसके कुछ उदाहरण प्रदान करता है । हल्का विकल्प है:

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

#!/bin/bash

# Start the first process
./my_first_process -D
status=$?
if [ $status -ne 0 ]; then
  echo "Failed to start my_first_process: $status"
  exit $status
fi

# Start the second process
./my_second_process -D
status=$?
if [ $status -ne 0 ]; then
  echo "Failed to start my_second_process: $status"
  exit $status
fi

# Naive check runs checks once a minute to see if either of the processes exited.
# This illustrates part of the heavy lifting you need to do if you want to run
# more than one service in a container. The container will exit with an error
# if it detects that either of the processes has exited.
# Otherwise it will loop forever, waking up every 60 seconds

while /bin/true; do
  ps aux |grep my_first_process |grep -q -v grep
  PROCESS_1_STATUS=$?
  ps aux |grep my_second_process |grep -q -v grep
  PROCESS_2_STATUS=$?
  # If the greps above find anything, they will exit with 0 status
  # If they are not both 0, then something is wrong
  if [ $PROCESS_1_STATUS -ne 0 -o $PROCESS_2_STATUS -ne 0 ]; then
    echo "One of the processes has already exited."
    exit -1
  fi
  sleep 60
done

अगला, डॉकफाइल:

FROM ubuntu:latest
COPY my_first_process my_first_process
COPY my_second_process my_second_process
COPY my_wrapper_script.sh my_wrapper_script.sh
CMD ./my_wrapper_script.sh

2

आप उपयोग करके अग्रभूमि में 2 प्रक्रियाएं चला सकते हैं wait। बस निम्नलिखित सामग्री के साथ एक बैश स्क्रिप्ट बनाएं। जैसे start.sh:

# runs 2 commands simultaneously:

mongod & # your first application
P1=$!
python script.py & # your second application
P2=$!
wait $P1 $P2

अपने डॉकरफाइल में, इसके साथ शुरू करें

CMD bash start.sh

0

यदि एक समर्पित स्क्रिप्ट बहुत अधिक ओवरहेड की तरह लगती है, तो आप अलग-अलग प्रक्रियाओं को स्पष्ट रूप से देख सकते हैं sh -c। उदाहरण के लिए:

CMD sh -c 'mini_httpd -C /my/config -D &' \
 && ./content_computing_loop
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.