स्वीकारोक्ति का समय। हनीबैगर पर मैंने जिन चार वर्षों में काम किया है, उनमें मेरे विकास का माहौल बहुत ज्यादा नहीं बदला है। लेकिन उस समय में काम करने के लिए लगभग दस सेवाओं के आधार पर हनीबैगर बहुत अधिक परिष्कृत हो गया है।
इसलिए हम स्थानीय विकास के लिए डॉकर की ओर बढ़ रहे हैं। पोस्टग्रेज, कैसेंड्रा, मेमकैच्ड और बाकी को स्थापित करने वाले प्रत्येक डेवलपर के बजाय, हम पूर्व-निर्मित वातावरण को स्पिन करने के लिए डॉकर-कंपोज़ का उपयोग कर सकते हैं। यह कमाल है।
स्वाभाविक रूप से, मुझे आश्चर्य होने लगा कि डॉकराइज़्ड एप्लिकेशन को तैनात करना कितना आसान होगा।
डॉकर के साथ परिनियोजन
डॉकर डॉकर-मशीन और डॉकर-झुंड जैसी उपयोगिताओं के साथ आता है जो कि तैनाती को दर्द रहित बनाने के लिए माना जाता है। अभी तक उन्होंने उस वादे को पूरा नहीं किया है। यदि आप उनकी कमियों के बारे में सब कुछ पढ़ना चाहते हैं, तो इस हालिया हैकर समाचार पोस्ट को देखें।
इसलिए मैंने Amazon की ECS (EC2 कंटेनर सर्विस) पर ध्यान देना चुना।
ईसीएस क्या है?
ECS एक तरह से बड़े हो चुके, डॉकटर-कंपोज़ और डॉकर-स्वार्म के प्रोडक्शन-रेडी मैशअप की तरह है।
ईसीएस के साथ आप कह सकते हैं "मेरे वेब ऐप की तीन प्रतियां चलाएं" और यह समझदारी से आपके ईसी 2 उदाहरणों के क्लस्टर के अंदर उपयुक्त डॉकर कंटेनरों को स्पिन कर देगा।
यह आपके कंटेनरों में लोड-बैलेंस अनुरोध कर सकता है, और लोड के आधार पर आपके क्लस्टर को ऊपर या नीचे बढ़ा सकता है।
डॉकराइज़्ड सिनात्रा ऐप बनाना
यहाँ एक सरल सिनात्रा ऐप है। यह वर्तमान समय को प्रिंट करता है, इसलिए आपको पता चल जाएगा कि क्या आपको कैश्ड संस्करण दिखाई देता है। यह ऐप चलाने वाले कंप्यूटर का नाम भी प्रिंट करता है। बाद में, हम इस ऐप को चलाने वाले कई सर्वरों को स्पिन करने जा रहे हैं और अनुरोधों को रूट करने के लिए लोड बैलेंसर का उपयोग कर रहे हैं। होस्टनाम लौटाकर, हम बता सकते हैं कि किस सर्वर ने एक विशेष अनुरोध दिया है।
ऐप
मैं आपको जो डॉकराइज़्ड सिनात्रा ऐप दिखाने जा रहा हूँ, वह tcnksm-sample/docker-sinatra का भारी पुनर्लेखित संस्करण है।
require 'sinatra'
require 'sinatra/base'
class App < Sinatra::Base
get '/' do
"Hello from sinatra! The time is #{ Time.now.to_i } on #{ `hostname` }!"
end
end
यह रहा Gemfile
:
# Gemfile
source 'https://rubygems.org'
gem 'sinatra'
gem 'thin'
...और यह रहा config.ru
फ़ाइल:
$:.unshift(File.dirname(__FILE__))
require 'app'
run App
डॉकरफ़ाइल
इस ऐप के लिए डॉकर इमेज बनाने के लिए हमें डॉकरफाइल की आवश्यकता होगी। यह ऐप के लिए निर्देशिका बनाता है, फाइलों को कॉपी करता है, और पोर्ट 80 पर एक वेब सर्वर चलाता है।
FROM ruby:2.3.1-slim
RUN apt-get update -qq && apt-get install -y build-essential
ENV APP_ROOT /var/www/docker-sinatra
RUN mkdir -p $APP_ROOT
WORKDIR $APP_ROOT
ADD Gemfile* $APP_ROOT/
RUN bundle install
ADD . $APP_ROOT
EXPOSE 80
CMD ["bundle", "exec", "rackup", "config.ru", "-p", "80", "-s", "thin", "-o", "0.0.0.0"]
इमेज बनाना और चलाना
सबसे पहले, हम डॉकर को वर्तमान निर्देशिका में डॉकर फ़ाइल से एक छवि बनाने के लिए कहेंगे। फिर हम कंटेनर के पोर्ट 80 को लोकलहोस्ट:4000 में मैप करते हुए इसे चलाएंगे।
docker build -t docker-sinatra .
docker run -p 4000:80 docker-sinatra
यह जांचने के लिए कि क्या यह काम करता है, अपने वेब ब्राउज़र में लोकलहोस्ट:4000 खोलें। आपको कुछ इस तरह दिखना चाहिए:
ईसीएस में परिनियोजन
अब ईसीएस पर तैनात करते हैं। हम उनके सेटअप विज़ार्ड का उपयोग करने जा रहे हैं। क्या यह धोखा है? मुझे परवाह नहीं है। :) तो ईसीएस कंट्रोल पैनल पर जाएं।
"आरंभ करें" पर क्लिक करें। फिर अगली स्क्रीन पर "जारी रखें" पर क्लिक करें।"
अपनी डॉकर रजिस्ट्री बनाना
आप आमतौर पर अपने विकास परिवेश से डॉकर छवियों को उत्पादन सर्वर पर अपलोड नहीं करते हैं। इसके बजाय, आप छवियों को डॉकर रजिस्ट्री में भेजते हैं - जैसे डॉकरहब - और सर्वर उन्हें तैनात करने पर खींचता है। अमेज़ॅन एक निजी डॉकर रजिस्ट्री प्रदान करता है। यह आवश्यक नहीं है कि आप इसका उपयोग करें, लेकिन हम अभी के लिए जा रहे हैं।
मैं अपनी रजिस्ट्री का नाम "docker-sinatra" रखूंगा:
अपनी छवि को रजिस्ट्री में धकेलना
फिर, मुझे अपनी छवि बनाने और उसे रजिस्ट्री में धकेलने के लिए चलाने के लिए आदेशों की एक सूची दी गई है।
पहली बार मैंने यह कोशिश की, मेरे ब्राउज़र के विज्ञापन-अवरोधक ने आदेशों को सही ढंग से प्रदर्शित होने से रोक दिया। अजीब - मुझे पता है।
अपनी कार्य परिभाषा बनाना
AWS को नई, भ्रमित करने वाली, शब्दावली बनाना पसंद है। एक "कार्य परिभाषा" केवल कंटेनरों की एक सूची है जिसे एक साथ चलना चाहिए। यह एक तरह से एक Procfile, या एक docker-compose कॉन्फ़िगरेशन जैसा है।
इसलिए, यदि आपके एप्लिकेशन में एक कंटेनर Nginx चल रहा है, एक यूनिकॉर्न चल रहा है, और एक साइडकीक चल रहा है तो तीनों आपकी "कार्य परिभाषा" के भीतर समाहित हो सकते हैं।
हमारा ऐप बहुत आसान है। हमारे पास केवल एक कंटेनर है। तो कॉन्फ़िगरेशन न्यूनतम है।
- मैं सुनिश्चित करूंगा कि हमारी रजिस्ट्री से सही छवि निकले
- मैं कंटेनर को चलाने वाले ईसी2 इंस्टेंस पर कंटेनर से पोर्ट 80 को पोर्ट 80 पर मैप करूंगा।
अपनी सेवा बनाना
अधिक भ्रमित शब्दावली! "सेवा" कॉन्फ़िगरेशन आपको यह निर्दिष्ट करने देता है कि कितने "कार्य" (आपके ऐप की उर्फ कॉपी) चलने चाहिए, और वे संतुलित कैसे लोड होते हैं।
यहां, मैं चाहता हूं कि मेरे ऐप की तीन प्रतियां पोर्ट 80 पर लोड बैलेंसिंग के साथ चले।
अपना क्लस्टर स्पिन करना
क्लस्टर विशिष्ट EC2 उदाहरणों का एक समूह है जो Amazon के ECS सॉफ़्टवेयर चला रहे हैं। आप उनके साथ कुछ भी कर सकते हैं जो आप किसी अन्य ईसी 2 इंस्टेंस के साथ कर सकते हैं। इस मामले में, मैंने निर्दिष्ट किया कि मुझे तीन t2.micro इंस्टेंस चाहिए थे।
कुछ पुष्टिकरण चरणों और लगभग 5 मिनट के इंतजार के बाद, सब कुछ तैयार था।
आपकी सेवा के काम करने के बाद, आपको एक स्क्रीन दिखाई देगी जो कुछ इस तरह दिखाई देगी:
एप्लिकेशन का परीक्षण करना
आप लोड बैलेंसर के नाम पर क्लिक करके उसका विवरण प्राप्त कर सकते हैं। वहां, आपको इसका सार्वजनिक डोमेन नाम खोजना चाहिए। इसे अपने ब्राउज़र में रखें और आपको हमारा नमूना ऐप दिखाई देगा।
यदि आप कुछ बार रीफ्रेश करते हैं, तो आप देखेंगे कि होस्टनाम बदल जाता है। ऐसा इसलिए है क्योंकि लोड बैलेंसर तीनों मेजबानों में आपके अनुरोधों को संतुलित कर रहा है।
सफाई करना
ECS विज़ार्ड ने अभी-अभी आपके AWS खाते में बहुत सारे संसाधन बनाए हैं। आप शायद उन्हें वहां नहीं छोड़ना चाहते। वे चीजों को अव्यवस्थित कर देंगे, और आपको पैसे खर्च करने पड़ सकते हैं।
सौभाग्य से, ECS विज़ार्ड अपने सभी संसाधनों को बनाने के लिए CloudFormation का उपयोग करता है। इसका मतलब है कि आप केवल CloudFormation स्टैक को हटाकर सब कुछ हटा सकते हैं।