कंटेनरीकरण सॉफ्टवेयर विकास और तैनाती में आसानी के लिए इसे मानकीकृत इकाइयों में पैकेजिंग कर रहा है। कंटेनर आपके एप्लिकेशन के सभी निर्भरताओं के साथ कोड को एक साथ बंडल करते हैं। एक कंटेनर पूरी तरह से अकेला खड़ा हो सकता है; इसमें आपके सॉफ़्टवेयर के साथ एक पैकेज, एक रनटाइम वातावरण और सिस्टम लाइब्रेरी शामिल हैं। कंटेनर डेवलपर्स और संचालन टीमों को यह सुनिश्चित करने में मदद करते हैं कि सॉफ्टवेयर अपने पर्यावरण की परवाह किए बिना एक ही चलता है। कोड को अवसंरचना से अलग करके, "कंटेनराइज़्ड" ऐप्स स्थानीय परिवेश, परीक्षण परिवेश और उत्पादन में समान चलते हैं।
सॉफ्टवेयर विकसित करने और तैनात करने के लिए डॉकर सबसे लोकप्रिय प्लेटफार्मों में से एक है। डॉकर सॉफ्टवेयर को एक "इमेज" के रूप में पैकेज करता है, जिसे डॉकटर इमेज पर निष्पादित होने पर रनटाइम पर एक कंटेनर में बदल दिया जाता है। अलगाव डेवलपर्स को एक ही समय में एक ही होस्ट पर कई कंटेनर चलाने की अनुमति देता है।
मौजूदा एप्लिकेशन को कंटेनरीकृत करते समय रेल डेवलपर्स को चुनौतियों का एक अनूठा सेट का सामना करना पड़ता है। यह लेख एक कार्यात्मक रेल ऐप को कंटेनरीकृत करने का एक पूर्वाभ्यास प्रदान करेगा और रास्ते में महत्वपूर्ण अवधारणाओं और नुकसानों की व्याख्या करेगा। यह लेख कंटेनरों या डॉकर का मूल विवरण नहीं है; इसके बजाय, यह उत्पादन अनुप्रयोगों को कंटेनरीकृत करते समय डेवलपर्स के सामने आने वाली समस्याओं की व्याख्या है।
आवश्यकताएँ
यदि आप साथ चल रहे हैं, तो आपको स्पष्ट रूप से एक रेल एप्लिकेशन की आवश्यकता होगी जो पहले से ही डॉकरीकृत नहीं है (यह 'कंटेनराइज्ड' के लिए डॉकर-विशिष्ट शब्द है)। मैं रेल्सवर्क का उपयोग करूँगा, एक पूरी तरह से फीचर्ड साइड प्रोजेक्ट जिसे मैं अभी लॉन्च किया गया। यह रेल के साथ लिखा गया एक जॉब-बोर्ड है और इसे हेरोकू में तैनात किया गया है, लेकिन इसे कंटेनरीकृत नहीं किया गया है।
इसके अलावा, आपको डॉकर स्थापित करने की भी आवश्यकता होगी। इसे स्थापित करने का एक लोकप्रिय तरीका डॉकर डेस्कटॉप है, जिसे आधिकारिक वेबसाइट के माध्यम से डाउनलोड किया जा सकता है।
ऐप डाउनलोड हो जाने के बाद, इंस्टॉलर चलाएं। इसके चलने के बाद, यह आपको एप्लिकेशन को आपके एप्लिकेशन फ़ोल्डर में खींचने के लिए संकेत देगा। फिर आपको ऐप को अपने एप्लिकेशन फ़ोल्डर से launch लॉन्च करना होगा और इसे वह विशेषाधिकार प्राप्त अनुमतियाँ प्रदान करें जो वह माँगता है। डॉकर को ठीक से स्थापित करने के लिए अंतिम जांच के रूप में, निम्नलिखित को चलाकर अपने मशीन पर चल रहे कंटेनरों को अपने टर्मिनल से सूचीबद्ध करने का प्रयास करें:
docker ps
यदि डॉकर स्थापित है (और आप कोई कंटेनर नहीं चला रहे हैं), तो आपको केवल हेडर के साथ एक खाली सूची मिलेगी जो इस तरह दिखती है:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
डॉकरफ़ाइल
इससे पहले कि हम बहुत गहराई में जाएं, स्पष्ट शब्दावली के साथ शुरुआत करना महत्वपूर्ण है।
आपके रेल एप्लिकेशन के "डॉकराइज़्ड" होने के बाद, यह एक कंटेनर . में चलेगा . एक कंटेनर अकेला खड़ा होता है, बदला जा सकता है, और अक्सर इसे फिर से बनाया जाता है।
एक कंटेनर एक छवि . से बनाया गया है . छवि मेटाडेटा के साथ युग्मित फ़ाइल सिस्टम का वर्चुअल स्नैपशॉट है।
एक डॉकरफ़ाइल स्रोत कोड है जो बताता है कि छवि कैसे बनाई जानी चाहिए। Dockerfiles को अक्सर Dockerized ऐप के रिपॉजिटरी में शामिल किया जाता है और बाकी ऐप के साथ वर्जन कंट्रोल में ट्रैक किया जाता है।
डॉकरफाइल बनाना जितना आसान लगता है, उससे कहीं ज्यादा आसान है! डॉकर हमें विशेष सिंटैक्स देता है जो किसी चीज़ को कंटेनर में रखने की कड़ी मेहनत को दूर करता है। सबसे पहले, उस ऐप की रूट डायरेक्टरी में अपना रास्ता बनाएं जिसे आप कंटेनरीकृत करना चाहते हैं। अब जब आप काम करना शुरू करने के लिए तैयार हैं, तो यदि आप git का उपयोग कर रहे हैं तो एक नई शाखा बनाना एक अच्छा विचार है। आप dockerize-this-app
. नाम से आसानी से एक नई शाखा बना सकते हैं निम्नलिखित चलाकर:
git checkout -b dockerize-this-app
इसके बाद, एक डॉकरफाइल बनाएं और इसे रूबी एप्लिकेशन के आधार पर एक छवि बनाने के लिए निर्देशित करें। यह निम्नलिखित को चलाकर कमांड लाइन से किया जा सकता है:
echo "FROM ruby:3.0.0" > Dockerfile
यहां, हम केवल Dockerfile बना रहे हैं और एक पंक्ति जोड़ रहे हैं जो निर्दिष्ट करती है कि रूबी कंटेनर छवि को कहां खोजना है। मेरी परियोजना रूबी 3.0.0 का उपयोग करती है, इसलिए मैंने उपयुक्त छवि का उपयोग किया। यदि आप रूबी के किसी भिन्न संस्करण पर हैं, तो कोई समस्या नहीं है। डॉकर के पास सभी समर्थित छवियों की एक सूची है।
इसके बाद, डॉकर को डॉकर छवि बनाने के लिए मैन्युअल रूप से निर्देश दें:
docker build -t rails_work .
यहां, आप rails_work
. को बदल सकते हैं किसी भी नाम के साथ आप छवि के लिए चाहेंगे। साथ ही, अवधि को अंत में शामिल करना सुनिश्चित करें!
यदि आप यह देखना चाहते हैं कि छवि बनाई गई है, तो आप अपने सिस्टम पर निम्नलिखित के साथ छवियों को सूचीबद्ध कर सकते हैं:
docker image list
हालांकि, यह छवि ज्यादातर खाली है; इसमें वर्तमान में हमारा आवेदन शामिल नहीं है। हम इसे डॉकरफाइल में अंत में निम्नलिखित जोड़कर अपने ऐप से कोड जोड़ने का निर्देश दे सकते हैं:
ADD . /rails_work
WORKDIR /rails_work
RUN bundle install
यह आपके एप्लिकेशन से फ़ाइलों की प्रतिलिपि बनाता है और एप्लिकेशन की निर्भरता को स्थापित करता है। (यहां, आप rails_work
. को बदल देंगे आपके ऐप के नाम के साथ।)
इस बिंदु पर, आपको इमेज बनाने के लिए कमांड को फिर से चलाना चाहिए:
docker image list
यहां किसी समस्या की संभावना है , खासकर यदि आप इसे किसी मौजूदा उत्पादन एप्लिकेशन पर कर रहे हैं। बंडलर शिकायत कर सकता है कि छवि बंडलर के जिस संस्करण का उपयोग करने का प्रयास कर रही है वह Gemfile.lock
बनाने वाले संस्करण से भिन्न है। फ़ाइल। अगर ऐसा होता है, तो आपके पास दो स्पष्ट विकल्प हैं:
- छवि द्वारा उपयोग किए जा रहे संस्करण को बदलें।
- हटाएं
Gemfile.lock
पूरी तरह से। **यदि आप ऐसा करते हैं, तो निश्चित संस्करणों में रत्नों के किसी भी संस्करण को पिन करना सुनिश्चित करें, क्योंकि लॉकफ़ाइल पूरी तरह से पुन:उत्पन्न हो जाएगी।
यदि आपका बंडल इंस्टॉल अभी भी विफल रहता है, तो आपको अपने Dockerfile में कुछ अतिरिक्त इंस्टॉलेशन की आवश्यकता हो सकती है :
RUN apt-get update && apt-get install -y shared-mime-info
यदि आप अभी भी समस्याओं का सामना कर रहे हैं, तो हो सकता है कि आपने गलत रूबी छवि को आधार बनाया हो , इसलिए वहां जांच शुरू करना उचित है।
यहां पर्यावरण चर सेट करने . का एक अच्छा अवसर है :
ENV RAILS_ENV production
ENV RAILS_SERVE_STATIC_FILES true
इसके बाद, पोर्ट 3000 को एक्सपोज़ करने के लिए एक लाइन जोड़ें, जहां रेल डिफ़ॉल्ट रूप से चलती है:
EXPOSE 3000
अंत में, कंटेनर को शुरू होने पर बैश शेल खोलने का निर्देश दें:
CMD ["bash"]
कुल मिलाकर, आपका Dockerfile इस तरह दिखना चाहिए (rails_work नाम को प्रतिस्थापित करके):
FROM ruby:3.0.0
ADD . /rails_work
WORKDIR /rails_work
RUN bundle install
ENV RAILS_ENV production
ENV RAILS_SERVE_STATIC_FILES true
EXPOSE 3000
CMD ["bash"]
डॉकर कमांड समझाया गया
यह निश्चित रूप से कुछ सबसे सामान्य Dockerfile कमांड की पूरी समझ रखने में मदद करेगा।
- FROM -> यह परिभाषित करता है कि किस छवि का आधार बनाया जाए।
- RUN -> यह अंदर कमांड निष्पादित करता है कंटेनर।
- ENV -> यह पर्यावरण चर को परिभाषित करता है।
- WORKDIR -> यह उस निर्देशिका को बदल देता है जिसका उपयोग कंटेनर कर रहा है।
- CMD -> निर्दिष्ट करता है कि कंटेनर शुरू होने पर कौन सा प्रोग्राम चलाना है।
डॉकर लिखें
डॉकर के दस्तावेज़ीकरण के अनुसार, "लिखें" कई डॉकर कंटेनरों के साथ एप्लिकेशन बनाने (और शुरू करने) के लिए उनका उपकरण है। एप्लिकेशन के आवश्यक कंटेनरों को स्पिन करने के लिए आवश्यक सभी चीजें YAML में उल्लिखित हैं। जब कोई docker-compose up
चलाता है , कंटेनर बनाए जाते हैं! डॉकर-कंपोज़ हमें अपने कंटेनर कॉन्फ़िगरेशन का घोषणात्मक रूप से वर्णन करने देता है।
अपनी डॉकर कंपोज़ फ़ाइल बनाने से पहले, डॉकर को यह इंगित करना महत्वपूर्ण है कि कौन सी फाइलें बनाई गई छवि से बाहर रखी जानी चाहिए। .dockerignore
. नामक फ़ाइल बनाएं . (अवधि नोट करें!) इस फ़ाइल में, निम्नलिखित पेस्ट करें:
.git
.dockerignore
.env
यदि आपका Gemfile निर्माण प्रक्रिया द्वारा अनुरक्षित है, तो Gemfile.lock
जोड़ना सुनिश्चित करें ऊपर की उपेक्षा करने वालों के लिए।
इसके बाद, docker-compose.yml
called नाम की एक फाइल बनाएं . यह वह जगह है जहां हम अपने कंटेनर कॉन्फ़िगरेशन का वर्णन करेंगे। हम फ़ाइल की सामग्री के लिए इसके साथ शुरुआत करेंगे:
version: '3.8'
services:
db:
image: postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
volumes:
- postgres:/var/lib/postgresql/data
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/Rails-Docker
ports:
- "3000:3000"
depends_on:
- db
volumes:
postgres:
यह फ़ाइल दो सेवाएँ बनाती है:एक को db
. कहा जाता है और दूसरे को web
. कहा जाता है . डीबी कंटेनर पोस्टग्रेज के लिए एक पूर्वनिर्मित छवि से बनाया जाएगा, और आपको POSTGRES_USER
के लिए प्रासंगिक मानों को प्रतिस्थापित करना चाहिए और POSTGRES_PASSWORD
. आपको सावधान रहना चाहिए कि उत्पादन रहस्य न डालें इस फ़ाइल में - उस पर अधिक जानकारी के लिए नीचे "रहस्य प्रबंधन" अनुभाग देखें।
वेब कंटेनर हमारे Dockerfile से बनाया गया है और फिर IP पते 0.0.0.0 पर पोर्ट 3000 पर एक रेल सर्वर शुरू करता है। आंतरिक पोर्ट 3000 को फिर वास्तविक पोर्ट 3000 में मैप किया जाता है।
और अंत में, हमारे पास डेटा बनाए रखने के लिए हमारे पास पोस्टग्रेज वॉल्यूम है।
सीक्रेट मैनेज करना
निर्माण-समय पर प्रमाणीकरण उत्पादन अनुप्रयोगों के लिए एक समस्या हो सकती है। शायद आपका आवेदन एक निजी भंडार से रत्न की तलाश करता है, या आपको केवल डेटाबेस प्रमाण-पत्रों को संग्रहीत करने की आवश्यकता है।
कोई भी जानकारी जो सीधे Dockerfile में होती है, हमेशा के लिए कंटेनर इमेज में बेक हो जाती है, और यह एक सामान्य सुरक्षा गड़बड़ी है।
यदि आप रेल के क्रेडेंशियल मैनेजर का उपयोग कर रहे हैं, तो डॉकर (या उस मामले के लिए कोई होस्ट) एक्सेस देना अपेक्षाकृत तुच्छ है। डॉकर कंपोज़ फ़ाइल में, आप बस RAILS_MASTER_KEY
. प्रदान करते हैं पर्यावरणपरिवर्ती तारक। दिए गए लिखें लक्ष्य के लिए, आप environment
. के अंतर्गत कुंजी निर्दिष्ट करते हैं हेडर, जिसे आपको बनाने की आवश्यकता है यदि आपने पहले से नहीं बनाया है। ऊपर से docker-compose फ़ाइल तब निम्न बन जाएगी:
version: '3.8'
services:
db:
image: postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
volumes:
- postgres:/var/lib/postgresql/data
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/Rails-Docker
ports:
- "3000:3000"
depends_on:
- db
environment:
- RAILS_MASTER_KEY=this_would_be_the_key
volumes:
postgres:
अब, यह आपको एक चौराहे पर छोड़ देता है। आप शायद इस फ़ाइल को स्रोत नियंत्रण के लिए प्रतिबद्ध करना चाहते हैं, लेकिन आप निश्चित रूप से नहीं चाहते कि आपकी मास्टर कुंजी या यहां तक कि आपका डेटाबेस पासवर्ड स्रोत नियंत्रण द्वारा ट्रैक किया जाए , क्योंकि यह एक और खतरनाक सुरक्षा समस्या होगी। अब तक का सबसे अच्छा समाधान यह होगा कि आप dotenv रत्न का उपयोग करें ताकि आप इन क्रेडेंशियल्स को प्रॉक्सी द्वारा एक्सेस कर सकें, उन्हें अलग फ़ाइल में संग्रहीत कर सकें। जिसे स्रोत नियंत्रण द्वारा ट्रैक नहीं किया जाता है।
डॉकराइज़्ड एप्लिकेशन चलाना
अंत में, आप निम्न कमांड के साथ डॉकराइज़्ड एप्लिकेशन चला सकते हैं:
docker compose up
मानो या न मानो, बस! डॉकर-कंपोज़ कंटेनर को स्पिन करना आसान बनाता है, खासकर जब कमांड-लाइन तर्कों की बात आती है।
यदि आप चल रहे कंटेनरों की सूची चाहते हैं, तो बस निम्नलिखित को चलाएँ:
docker ps
यदि आपके रेल कंटेनर का नाम web
है , आप उस पर कमांड को काफी सरल तरीके से निष्पादित कर सकते हैं। उदाहरण के लिए, यदि आप एक रेल कंसोल चलाना चाहते हैं, तो आपको केवल निम्नलिखित को चलाना होगा:
docker exec -it web rails console
यदि आप केवल कंटेनर के अंदर एक बैश शेल चाहते हैं, तो आप इसके बजाय निम्नलिखित को चलाएंगे:
docker exec -it web bash
यहां सूचीबद्ध लोगों की तरह कुछ और नुकसान
उत्पादन में डॉक किए गए रेल अनुप्रयोगों के साथ एक आम समस्या लॉग के साथ काम कर रही है। उन्हें लंबे समय तक कंटेनर सिस्टम में नहीं होना चाहिए। डॉकर का सुझाव है कि लॉग को केवल STDOUT पर पुनर्निर्देशित किया जाए। इसे config/application.rb
में स्पष्ट रूप से कॉन्फ़िगर किया जा सकता है ।
एक और आम समस्या मेलर्स की है। यदि आपका एप्लिकेशन मेलर्स का उपयोग करता है, तो आपको कनेक्शन सेटिंग्स को स्पष्ट रूप से परिभाषित करना होगा . एसएमटीपी एक पूरी तरह से ठीक वितरण विधि है और आमतौर पर डिफ़ॉल्ट के साथ अच्छी तरह से काम करती है, लेकिन हमें अपने कंटेनर कॉन्फ़िगरेशन से मेल खाने के लिए सर्वर स्थान और अन्य सेटिंग्स सेट करने में सावधानी बरतनी चाहिए।
यदि आपके पास कार्यकर्ता या पृष्ठभूमि की नौकरियां हैं, जैसे sidekiq , तो आपको इसे इसके अपने कंटेनर में चलाना होगा।
निष्कर्ष
एक उत्पादन रेल एप्लिकेशन को कंटेनरीकृत करना चुनौतियों के एक सेट के साथ आता है, जैसा कि आपने निस्संदेह देखा है। जैसे-जैसे आपका आवेदन बढ़ा है, इसने कई निर्भरताएं जमा की हैं जो इस तरह के चुनौतीपूर्ण प्रवास को बनाती हैं। चाहे वह बैकग्राउंड वर्कर हों, मेलर्स हों या सीक्रेट्स हों, अधिकांश नुकसानों को संभालने के लिए स्थापित पैटर्न हैं। एक बार डॉकर के साथ काम करने वाले प्रोडक्शन एप्लिकेशन को प्राप्त करने का प्रारंभिक कार्य पूरा हो जाने के बाद, भविष्य में होने वाले परिवर्तनों और तैनाती में आसानी से निवेश सार्थक हो जाएगा।