Computer >> कंप्यूटर ट्यूटोरियल >  >> सॉफ्टवेयर >> आभासी मशीन

Supervisord के साथ Docker कंटेनरों में कुशल सेवा प्रबंधन

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

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

Supervisord संक्षेप में

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

Supervisord सेटअप

मूल रूप से, supervisord एक पायथन मॉड्यूल है। इसे easy_install का उपयोग करके इंस्टॉल किया जा सकता है, जो setuptools का एक हिस्सा है, जो स्वयं पायथन distutils पैकेज का एक विस्तार है। हां, यह इस बिंदु पर काफी जटिल हो जाता है। सौभाग्य से, अधिकांश Linux डिस्ट्रीब्यूशन easy_install के साथ आते हैं, जिसमें CentOS शामिल है, जो आज के लिए हमारा टेस्ट प्लेटफॉर्म है।

शुरू करने के लिए, हमें एक कंटेनर के अंदर supervisord इंस्टॉल करने की आवश्यकता होगी। फिर, हम इमेज को कमिट करेंगे और इसे अपने बिल्ड के लिए बेसलाइन के रूप में उपयोग करेंगे, जिसमें前述 SSH और Apache जैसी सेवाएं शामिल होंगी। यदि आप अपने होस्ट पर supervisord इंस्टॉल करने का प्रयास करते हैं, तो आपको बिना किसी समस्या के सफल होना चाहिए:

easy_install supervisor
Searching for supervisor
Reading https://pypi.python.org/simple/supervisor/
Best match: supervisor 3.1.3
Downloading https://pypi.python.org/packages/source/s/supervisor/
supervisor-3.1.3.tar.gz#md5=aad263c4fbc070de63dd354864d5e552
Processing supervisor-3.1.3.tar.gz
Writing /tmp/easy_install-vbOcMG/supervisor-3.1.3/setup.cfg
Running supervisor-3.1.3/setup.py -q bdist_egg --dist-dir /tmp/easy_install-vbOcMG/supervisor-3.1.3/egg-dist-tmp-i96mIs
warning: no previously-included files matching '*' found under directory 'docs/.build'
Adding supervisor 3.1.3 to easy-install.pth file
Installing echo_supervisord_conf script to /usr/bin
Installing pidproxy script to /usr/bin
Installing supervisorctl script to /usr/bin
Installing supervisord script to /usr/bin

Installed

/usr/lib/python2.7/site-packages/supervisor-3.1.3-py2.7.egg
Processing dependencies for supervisor
Searching for meld3>=0.6.5
Reading https://pypi.python.org/simple/meld3/
Best match: meld3 1.0.2
Downloading https://pypi.python.org/packages/source/m/meld3/
meld3-1.0.2.tar.gz#md5=3ccc78cd79cffd63a751ad7684c02c91
Processing meld3-1.0.2.tar.gz
Writing /tmp/easy_install-wnhLVS/meld3-1.0.2/setup.cfg
Running meld3-1.0.2/setup.py -q bdist_egg --dist-dir /tmp/easy_install-wnhLVS/meld3-1.0.2/egg-dist-tmp-Lp88cX
zip_safe flag not set; analyzing archive contents...
Adding meld3 1.0.2 to easy-install.pth file

Installed /usr/lib/python2.7/site-packages/meld3-1.0.2-py2.7.egg
Finished processing dependencies for supervisor

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

# easy_install supervisor
Traceback (most recent call last):
File "/usr/bin/easy_install", line 5, in <module>
from pkg_resources import load_entry_point
ImportError: No module named pkg_resources

इसका मतलब है कि हमें मैन्युअल रूप से easy_install सेटअप करना होगा:

wget https://bitbucket.org/pypa/setuptools/raw/ ->
-> bootstrap/ez_setup.py -O - | python

Supervisord कॉन्फ़िगरेशन

अगला कदम कंटेनर के लिए एक कॉन्फ़िगरेशन बनाना है। हम होस्ट पर फाइल बना सकते हैं, और फिर हम इसे बिल्ड प्रक्रिया के दौरान Dockerfile में COPY निर्देश का उपयोग करके अपनी इमेज में कॉपी करेंगे।

COPY ./supervisord.conf /etc/supervisord.conf

कॉन्फ़िगरेशन स्वयं कुछ इस तरह होगा:

[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D

[program:httpd]
command=/bin/bash -c "exec /usr/sbin/httpd -DFOREGROUND"

यहां हमारे पास क्या है? प्रत्येक वर्गाकार ब्रैकेट जोड़ी एक सेक्शन को परिभाषित करती है। supervisord के लिए, हम परिभाषित करते हैं कि यह बैकग्राउंड सर्विस बनने के बजाय फोरग्राउंड में शुरू होना चाहिए।

sshd नाम के प्रोग्राम के लिए, हम प्रासंगिक कमांड निष्पादित करते हैं, अनिवार्य रूप से SSHD को बैकग्राउंड में चला रहे हैं। httpd नाम के प्रोग्राम के लिए, हम सर्वर को फोरग्राउंड में, एक अलग शेल में शुरू करते हैं। कई अन्य विकल्प उपलब्ध हैं, लेकिन फिलहाल, यह न्यूनतम आवश्यक है जिसे हमें supervisord के साथ शुरू करने की आवश्यकता है।

एक कंटेनर चलाना और समस्या निवारण

हमारी इमेज बनाने और इसे चलाने के बाद, supervisord को किक करना चाहिए और हमारी प्रक्रियाओं को शुरू करना चाहिए। लेकिन पहले, आइए कुछ सामान्य त्रुटियों से निपटें। एक जो आप देख सकते हैं वह है:

docker run -ti -p 22 -p 80 image-3:latest
/usr/lib/python2.7/site-packages/supervisor-3.1.3-py2.7.egg/
supervisor/options.py:296: UserWarning: Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); you probably want to specify a "-c" argument specifying an absolute path to a configuration file for improved security.
'Supervisord is running as root and it is searching '
Error: No config file found at default paths (/usr/etc/supervisord.conf, /usr/supervisord.conf, supervisord.conf, etc/supervisord.conf, /etc/supervisord.conf); use the -c option to specify a config file at a different path
For help, use /usr/bin/supervisord -h

यदि आपने supervisord.conf फाइल के लिए गलत पथ निर्दिष्ट किया है, या गलत नाम का उपयोग किया है, तो सेवा चलाने में सक्षम नहीं होगी। आपको COPY निर्देश को संपादित करना होगा, अपनी इमेज को पुनर्निर्माण करना होगा और फिर से शुरू करना होगा। फिर, अगली त्रुटि जो आप सामना कर सकते हैं वह होगी:

# docker run -ti -p 22 -p 80 image-3:latest
/usr/lib/python2.7/site-packages/supervisor-3.1.3-py2.7.egg/
supervisor/options.py:296: UserWarning: Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); you probably want to specify a "-c" argument specifying an absolute path to a configuration file for improved security.
'Supervisord is running as root and it is searching '
372 CRIT Supervisor running as root (no user in config file)
375 INFO supervisord started with pid 1
378 INFO spawned: 'httpd' with pid 9
381 INFO spawned: 'sshd' with pid 10
602 INFO exited: httpd (exit status 1; not expected)
606 INFO spawned: 'httpd' with pid 11
606 INFO success: sshd entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
671 INFO exited: httpd (exit status 1; not expected)
676 INFO spawned: 'httpd' with pid 12
742 INFO exited: httpd (exit status 1; not expected)
749 INFO spawned: 'httpd' with pid 13
825 INFO exited: httpd (exit status 1; not expected)
826 INFO gave up: httpd entered FATAL state, too many start retries too quickly

gave up: httpd entered FATAL state, too many start retries too quickly

यहां हमारे पास Apache थ्रेड्स बाहर निकल रहे हैं, supervisord को उन्हें फिर से शुरू करने के लिए मजबूर कर रहे हैं, और अंततः हार मान रहे हैं, जो एक घातक स्थिति की ओर ले जाता है। इस बिंदु पर हमारा कंटेनर बहुत बेकार है।

यहां, समाधान supervisord.conf फाइल को संपादित करना और httpd प्रोग्राम सेक्शन में अतिरिक्त निर्देशों को पेश करना है, जो प्रक्रिया स्पॉनिंग को अधिक सुंदर तरीके से संभालेगा।

[program:httpd]
startsecs = 0
autorestart = false
command=/bin/bash -c "exec /usr/sbin/httpd -DFOREGROUND"

हमने startsecs = 0 और autorestart = false जोड़ा। पहला निर्देश हमें बताता है:

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

दूसरा वाला मतलब है कि supervisord Apache थ्रेड रीस्टार्ट को संभालेगा नहीं, और ये वेब सर्वर द्वारा ही संभाले जाएंगे, क्योंकि यह आने वाले HTTP अनुरोधों को संभालता है।

false, unexpected, या true में से एक हो सकता है। यदि false, तो प्रक्रिया को कभी भी ऑटो-रीस्टार्ट नहीं किया जाएगा। यदि unexpected, तो प्रक्रिया को रीस्टार्ट किया जाएगा जब प्रोग्राम एक एग्जिट कोड के साथ बाहर निकलता है जो इस प्रोसेस कॉन्फ़िगरेशन से जुड़े एग्जिट कोड में से एक नहीं है (exitcodes देखें)। यदि true, तो प्रक्रिया को बिना किसी एग्जिट कोड के संबंध में बिना शर्त रीस्टार्ट किया जाएगा जब यह बाहर निकलता है।

अब, हम कंटेनर को फिर से चलाने का प्रयास कर सकते हैं। मूल गाइड में हमने जिस /run/httpd मुद्दे का सामना किया था, उसे याद करें? /run डायरेक्टरी के बिना, आप निम्नलिखित संदेश देखेंगे:

docker run -ti -p 22 -p 80 image-3:latest
/usr/lib/python2.7/site-packages/supervisor-3.1.3-py2.7.egg/
supervisor/options.py:296: UserWarning: Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); you probably want to specify a "-c" argument specifying an absolute path to a configuration file for improved security.
'Supervisord is running as root and it is searching '
913 CRIT Supervisor running as root (no user in config file)
916 INFO supervisord started with pid 1
919 INFO spawned: 'httpd' with pid 8
921 INFO spawned: 'sshd' with pid 9
079 INFO success: httpd entered RUNNING state, process has stayed up for > than 0 seconds (startsecs)
105 INFO exited: httpd (exit status 0; expected)
120 INFO reaped unknown pid 10
122 INFO success: sshd entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

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

सफल परीक्षण

और फिर, एक बार जब हम अंततः सब कुछ सुलझा लेते हैं:

निष्कर्ष

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

Supervisord सख्ती से आवश्यक नहीं है, क्योंकि हम इसके बिना अपने sshd और httpd प्रक्रियाओं को चलाने में कामयाब रहे, लेकिन कुछ लोग इस विधि को पसंद कर सकते हैं, खासकर यदि उन्हें अपनी सेवाओं को अक्सर शुरू और पुनरारंभ करना पड़ता है। किसी भी तरह से, उपयोगिता से परिचित होने से Docker तंत्र में समझ और आत्मविश्वास बनाने में मदद मिलती है। मुझे आशा है कि आप इस गाइड को उपयोगी पाएंगे, और कृपया हमें अपने अनुरोध भेजें कि हमें आगे क्या तलाशना चाहिए।

चीयर्स।

  1. एकाधिक VMs के लिए वर्चुअलबॉक्स NAT नेटवर्किंग कॉन्फ़िगर कैसे करें एकाधिक VMs के लिए वर्चुअलबॉक्स NAT नेटवर्किंग कॉन्फ़िगर कैसे करें

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

  1. KVM स्टोरेज प्रबंधन में महारत हासिल करना: एक व्यापक ट्यूटोरियल KVM स्टोरेज प्रबंधन में महारत हासिल करना: एक व्यापक ट्यूटोरियल

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

  1. VirtualBox में मास्टरी: डिस्क छवियों को क्लोन करने के लिए चरण-दर-चरण गाइड VirtualBox में मास्टरी: डिस्क छवियों को क्लोन करने के लिए चरण-दर-चरण गाइड

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