इस पोस्ट का लक्ष्य एक ऐसे वातावरण में एप्लिकेशन विकसित करना है जो आपके रिमोट डिप्लॉयमेंट वातावरण के जितना संभव हो उतना करीब हो। आइए Docker Machine और Compose का उपयोग करके एक ऐप को स्थानीय विकास से रिमोट डिप्लॉयमेंट पर ले जाएं।
Docker Docker Docker
सबसे पहले हमें Docker इंस्टॉल करना होगा। इस पोस्ट में लेखन के समय के सभी नवीनतम और महानतम Docker घटकों का उपयोग किया गया है।
- Docker 1.7.0
- Docker Machine 0.3.0
- Docker Compose 1.3.0
मैं मान लूंगा कि आप इस पोस्ट के शेष भाग के लिए VirtualBox में Docker चला रहे हैं।
कृपया हमारी गेस्टबुक पर हस्ताक्षर करें
हम जिस एप्लिकेशन को डिप्लॉय करने जा रहे हैं वह एक सरल गेस्टबुक है। यह एक बुनियादी 3-टियर ऐप को प्रदर्शित करने के लिए पर्याप्त है। हम एक स्थानीय विकास वातावरण से शुरू करेंगे जहां हम निम्नलिखित तकनीकों का उपयोग करके एक वेब ऐप विकसित करेंगे:
- वेब सर्वर के लिए Nginx
- ऐप सर्वर के लिए:
- प्रोग्रामिंग भाषा के लिए Python
- वेब फ्रेमवर्क के लिए Flask
- WSGI सर्वर के लिए Gunicorn
- डेटाबेस के लिए MySQL
हम GitHub पर एक रिपो से काम करेंगे तो आइए उस रिपो को क्लोन करके शुरू करें।
git clone https://github.com/rackerlabs/guestbook.git -b dmc guestbook
cd guestbook
यह ट्रैक खोना भी काफी आसान है कि आप नीचे किस Docker होस्ट का उपयोग कर रहे हैं। मैं इस उपनाम को सेट करने की सलाह देता हूं ताकि आप आसानी से पता लगा सकें कि आप किस होस्ट से बात कर रहे हैं।
alias de='env | grep DOCKER_'
अब आप बस de टाइप कर सकते हैं यह देखने के लिए कि कौन से Docker पर्यावरण चर सेट हैं।
यहां अंतिम परिणाम कैसा दिखेगा जब हम अपने एप्लिकेशन को स्थानीय विकास से रिमोट डिप्लॉयमेंट पर ले जाएंगे।
स्थानीय विकास
हमारा स्थानीय विकास वातावरण (dev env) काफी सरल है क्योंकि हमें क्रेडेंशियल सेटअप करने या सुरक्षा के बारे में चिंता करने की आवश्यकता नहीं है। हम अपने सभी dev env सामान को "-dev" से सफ़िक्स करेंगे ताकि इसे अपने रिमोट डिप्लॉयमेंट से अलग रखा जा सके।
वातावरण आरंभ करें
हम अपने कंटेनरों के लिए Docker होस्ट बनाने के लिए docker-machine का उपयोग करेंगे। फिर हम Docker को उस होस्ट का उपयोग करने के लिए कॉन्फ़िगर करेंगे। अंत में, docker-compose हमारे पूरे dev env को ऊपर लाएगा।
docker-machine create --driver virtualbox guestbook-dev
docker-machine ip guestbook-dev # गेस्टबुक देव IP पता नोट करें
eval "$(docker-machine env guestbook-dev)"
docker-compose up
जब यह चल रहा है, तो यह समझने के लिए docker-compose.yml पढ़ें कि यह हमारे लिए क्या कर रहा है। यह अच्छी तरह से टिप्पणी किया गया है इसलिए यह स्वयं-व्याख्यात्मक होना चाहिए। ध्यान दें कि यह docker-compose-common.yml को सामान्य घटकों के लिए अपने आधार के रूप में विस्तारित करता है। आप docker-compose.yml संदर्भ में Docker Compose फ़ाइल प्रारूप का पूरा विवरण पा सकते हैं।
एक बार सब कुछ डाउनलोड हो जाए और चलने लगे, तो हमें डेटाबेस को आरंभ करने की आवश्यकता है। हम अपने ऐप के एक-ऑफ कंटेनर रन का उपयोग करके एक पायथन कमांड चलाएंगे जो हमारे डेटाबेस में टेबल बनाता है।
एक नया टर्मिनल खोलें और guestbook डायरेक्टरी में बदलें।
eval "$(docker-machine env guestbook-dev)"
docker-compose run --rm --no-deps app python app.py create_db
इसके लिए एक-ऑफ कंटेनर चलाने की परेशानी क्यों? क्योंकि docker-compose स्वचालित रूप से उन पर्यावरण चर को इंजेक्ट करता है जिनकी हमें डेटाबेस से कनेक्ट करने के लिए आवश्यकता होती है। हमारे लिए कोई कॉन्फ़िगरेशन नहीं करना पड़ता।
अब अपना ब्राउज़र खोलें और ऊपर नोट किए गए गेस्टबुक देव IP पते पर जाएं। कृपया हमारी गेस्टबुक पर हस्ताक्षर करें।
परिवर्तन करें
आइए सुनिश्चित करें कि हम अपने एप्लिकेशन कोड को तेजी से विकसित करना जारी रख सकते हैं। docker-compose.yml में कुछ प्रमुख कॉन्फ़िग विकल्प हैं जो हमें ऐसा करने की अनुमति देते हैं। ऐप सेवा में वॉल्यूम और कमांड के लिए टिप्पणियों को फिर से पढ़ें।
अपने पसंदीदा टेक्स्ट एडिटर में app/templates/index.html खोलें। एक परिवर्तन करें और इसे सहेजें। अपने ब्राउज़र पर वापस जाएं और रीलोड करें। वोइला!
रिमोट डिप्लॉयमेंट
यह भाग पेचीदा है क्योंकि हमें क्रेडेंशियल सेटअप करने और सुरक्षा के बारे में चिंता करने की आवश्यकता है। यदि आपके पास Rackspace खाता नहीं है, तो आप developer+ के लिए साइन अप करके मुफ्त क्रेडिट प्राप्त कर सकते हैं। एक बार आपका खाता तैयार हो जाए, तो आपको अपना API कुंजी ढूंढना होगा। अपने टर्मिनल में निम्नलिखित पर्यावरण चर सेट करें।
export OS_USERNAME=your-rackspace-username
export OS_API_KEY=your-rackspace-api-key
export OS_REGION_NAME=IAD
वातावरण आरंभ करें
हम अपने कंटेनरों के लिए Docker होस्ट बनाने के लिए docker-machine का उपयोग करेंगे।
docker-machine create --driver rackspace guestbook
docker-machine ip guestbook # गेस्टबुक IP पता नोट करें
वातावरण सुरक्षित करें
अस्वीकरण: यह सबसे सुरक्षित कॉन्फ़िगरेशन के करीब भी नहीं है। यह स्क्रिप्ट केवल डिफ़ॉल्ट कॉन्फ़िगरेशन से अधिक सुरक्षित होने के लिए अभिप्रेत है। इस स्क्रिप्ट के बारे में कोई वादा नहीं किया जाता है कि यह आपके सर्वर को स्वामित्व में आने से या आपकी बाइक चोरी होने से रोकेगा। बुरे लोग अभी भी आपको पाने के लिए बाहर हैं। और इस स्क्रिप्ट को चलाने से आप सुरक्षित एप्लिकेशन कोड लिखने से मुक्त नहीं होते!
अपने सर्वर पर ब्रूट फोर्स लॉगिन प्रयासों को रोकने के लिए fail2ban इंस्टॉल करें और ufw के साथ एक फ़ायरवॉल सेटअप करें ताकि केवल उन्हीं पोर्ट की अनुमति दी जाए जिनकी हमें आवश्यकता है। ध्यान दें कि कमांड पूरी तरह से समाप्त होने तक कोई आउटपुट प्रकट नहीं होता है इसलिए थोड़ा धैर्य आवश्यक है।
docker-machine ssh guestbook "apt-get update"
docker-machine ssh guestbook "apt-get -y install fail2ban"
docker-machine ssh guestbook "ufw default deny"
docker-machine ssh guestbook "ufw allow ssh"
docker-machine ssh guestbook "ufw allow http"
docker-machine ssh guestbook "ufw allow 2376" # Docker
docker-machine ssh guestbook "ufw --force enable"
वातावरण आरंभ करना जारी रखें
इससे पहले कि Docker Compose हमारे रिमोट डिप्लॉयमेंट को बनाए, हमें अपने डेटाबेस के लिए कुछ पर्यावरण चर सेट करने की आवश्यकता है। ये पर्यावरण चर docker-compose-prod.yml फ़ाइल द्वारा उपयोग किए जाते हैं। हम ऐसा करते हैं ताकि संवेदनशील डेटा को GitHub पर कमिट करने से रोका जा सके।
export MYSQL_USER=guestbook-admin
export MYSQL_PASSWORD=$(hexdump -v -e '1/1 "%.2x"' -n 32 /dev/random)
export MYSQL_ROOT_PASSWORD=$(hexdump -v -e '1/1 "%.2x"' -n 32 /dev/random)
echo "MYSQL_USER=$MYSQL_USER"
echo "MYSQL_PASSWORD=$MYSQL_PASSWORD"
echo "MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD"
अब हम Docker को उस होस्ट का उपयोग करने के लिए कॉन्फ़िगर करते हैं। अंत में, docker-compose हमारे कंटेनरों को पृष्ठभूमि में बनाएगा और चलाएगा ताकि हम स्थानीय विकास की तरह रंगीन लॉग संदेश नहीं देखेंगे।
eval "$(docker-machine env guestbook)"
docker-compose --file docker-compose-prod.yml build
docker-compose --file docker-compose-prod.yml up -d
जब यह चल रहा है, तो यह समझने के लिए docker-compose-prod.yml पढ़ें कि यह हमारे लिए क्या कर रहा है। ध्यान दें कि इसे डिफ़ॉल्ट docker-compose.yml फ़ाइल नाम दिया गया है इसलिए हमें docker-compose कमांड में फ़ाइल नाम शामिल करने की आवश्यकता नहीं है। यह अच्छी तरह से टिप्पणी किया गया है इसलिए यह स्वयं-व्याख्यात्मक होना चाहिए। यह भी सामान्य घटकों के लिए अपने आधार के रूप में docker-compose-common.yml को विस्तारित करता है।
एक बार सब कुछ बन जाए और चलने लगे, तो हमें डेटाबेस को आरंभ करने की आवश्यकता है। हम अपने ऐप के एक-ऑफ कंटेनर रन का उपयोग करके एक पायथन कमांड चलाएंगे जो हमारे डेटाबेस में टेबल बनाता है।
docker-compose --file docker-compose-prod.yml run --rm --no-deps app python app.py create_db
अब अपना ब्राउज़र खोलें और ऊपर नोट किए गए गेस्टबुक IP पते पर जाएं। कृपया हमारी गेस्टबुक पर हस्ताक्षर करें।
परिवर्तन करें
हम अपने एप्लिकेशन कोड को रिमोट वातावरण में विकसित नहीं करना चाहेंगे लेकिन हम वहां आसानी से परिवर्तन डिप्लॉय करना चाहते हैं।
अपने पसंदीदा टेक्स्ट एडिटर में app/templates/index.html खोलें। एक परिवर्तन करें और इसे सहेजें। अपने ब्राउज़र पर वापस जाएं गेस्टबुक देव IP पते पर और रीलोड करें। सुनिश्चित करें कि यह आपके स्थानीय विकास वातावरण में अपेक्षित रूप से बदल गया है।
अब हम कुछ परिचित कमांड चलाकर उस परिवर्तन को रिमोट वातावरण में डिप्लॉय करते हैं।
docker-compose --file docker-compose-prod.yml build
docker-compose --file docker-compose-prod.yml up -d
अपने ब्राउज़र पर गेस्टबुक IP पते पर वापस जाएं और रीलोड करें। वोइला! आपका परिवर्तन दिखाई दिया और आपका डेटा बरकरार है।
आगे क्या?
आप इसे एक कदम आगे ले जाने के लिए आगे क्या करेंगे?
आपका डेटा आपके एप्लिकेशन का सबसे महत्वपूर्ण हिस्सा है। आपको यह सुनिश्चित करने की आवश्यकता है कि यह सुरक्षित है। बैकअप योजना के साथ शुरू करें। आप अपना समाधान रोल कर सकते हैं और एक क्रॉन जॉब रख सकते हैं जो डेटाबेस डंप को क्लाउड फाइल्स में स्टोर करता है। या आप आसान रास्ता अपना सकते हैं और क्लाउड बैकअप का उपयोग कर सकते हैं। अंत में, आप पूरी तरह से जा सकते हैं और एक अत्यधिक उपलब्ध क्लाउड डेटाबेस बना सकते हैं और docker-compose.yml को उसका उपयोग करने के लिए बदल सकते हैं।
निष्कर्ष
मुझे आशा है कि आपने सीखा है कि कैसे एक ऐसे वातावरण में एप्लिकेशन विकसित किया जाए जो आपके रिमोट डिप्लॉयमेंट वातावरण के जितना संभव हो उतना करीब हो। यदि आपको कोई समस्या आई है, तो कृपया नीचे टिप्पणियों में हमें बताएं।