কনটেইনারাইজিং সফ্টওয়্যার উন্নয়ন এবং স্থাপনার সহজতার জন্য এটিকে মানক ইউনিটে প্যাকেজ করছে। ধারকগুলি আপনার অ্যাপ্লিকেশন থেকে এর সমস্ত নির্ভরতা সহ কোডগুলিকে একত্রিত করে৷ একটি ধারক সম্পূর্ণরূপে একা দাঁড়াতে পারে; এটিতে আপনার সফ্টওয়্যার, একটি রানটাইম পরিবেশ এবং সিস্টেম লাইব্রেরি সহ একটি প্যাকেজ রয়েছে। কনটেইনারগুলি ডেভেলপার এবং অপারেশন দলগুলিকে নিশ্চিত করতে সাহায্য করে যে সফ্টওয়্যার পরিবেশ নির্বিশেষে একইভাবে চলে। অবকাঠামো থেকে কোড আলাদা করার মাধ্যমে, "কন্টেইনারাইজড" অ্যাপগুলি স্থানীয় পরিবেশে, পরীক্ষার পরিবেশে এবং উৎপাদনে একইভাবে চলে।
সফ্টওয়্যার বিকাশ এবং স্থাপনের জন্য ডকার অন্যতম জনপ্রিয় প্ল্যাটফর্ম। ডকার একটি "ইমেজ" হিসাবে সফ্টওয়্যারকে প্যাকেজ করে, যা ডকার ইমেজে কার্যকর করার সময় রানটাইমে একটি পাত্রে পরিণত হয়। বিচ্ছিন্নতা বিকাশকারীদের একই সময়ে একটি একক হোস্টে অনেকগুলি কন্টেইনার চালানোর অনুমতি দেয়৷
একটি বিদ্যমান অ্যাপ্লিকেশন কন্টেইনারাইজ করার সময় রেল বিকাশকারীরা চ্যালেঞ্জের একটি অনন্য সেটের মুখোমুখি হন। এই নিবন্ধটি একটি কার্যকরী রেল অ্যাপকে কনটেইনারাইজ করার একটি ওয়াকথ্রু প্রদান করবে এবং সেই পথে গুরুত্বপূর্ণ ধারণা এবং সমস্যাগুলি ব্যাখ্যা করবে। এই নিবন্ধটি পাত্র বা ডকারের একটি মৌলিক বিবরণ নয়; পরিবর্তে, এটি প্রোডাকশন অ্যাপ্লিকেশন কন্টেইনারাইজ করার সময় ডেভেলপারদের যে সমস্যার সম্মুখীন হয় তার একটি ব্যাখ্যা৷
পূর্বশর্ত
আপনি যদি অনুসরণ করেন, তাহলে আপনার অবশ্যই এমন একটি রেল অ্যাপ্লিকেশনের প্রয়োজন হবে যা ইতিমধ্যেই ডকারাইজড নয় (এটি 'কন্টেইনারাইজড'-এর জন্য ডকার-নির্দিষ্ট শব্দ)। আমি RailsWork ব্যবহার করব, একটি সম্পূর্ণ বৈশিষ্ট্যযুক্ত পার্শ্ব প্রকল্প যা আমি শুধু চালু এটি রেলের সাথে লেখা একটি জব-বোর্ড এবং হেরোকুতে স্থাপন করা হয়েছে, তবে এটি কন্টেইনারাইজড নয়৷
এর বাইরে, আপনাকে ডকার ইনস্টল করতে হবে। এটি ইনস্টল করার একটি জনপ্রিয় উপায় হল ডকার ডেস্কটপ, যা অফিসিয়াল ওয়েবসাইটের মাধ্যমে ডাউনলোড করা যেতে পারে।
অ্যাপটি ডাউনলোড হয়ে গেলে, ইনস্টলারটি চালান। এটি চালানোর পরে, এটি আপনাকে অ্যাপ্লিকেশনটিকে আপনার অ্যাপ্লিকেশন ফোল্ডারে টেনে আনতে অনুরোধ করবে। তারপরে আপনাকে আপনার অ্যাপ্লিকেশন ফোল্ডার থেকে অ্যাপটি চালু করতে হবে৷ এবং এটির জন্য অনুরোধ করা বিশেষাধিকারপ্রাপ্ত অনুমতি প্রদান করুন। ডকার সঠিকভাবে ইনস্টল করা হয়েছে তা নিশ্চিত করার জন্য শেষ পরীক্ষা হিসাবে, নিম্নলিখিতগুলি চালিয়ে আপনার টার্মিনাল থেকে আপনার মেশিনে চলমান কন্টেইনারগুলি তালিকাভুক্ত করার চেষ্টা করুন:
docker ps
যদি ডকার ইনস্টল করা থাকে (এবং আপনি কোনও পাত্রে চালাচ্ছেন না), আপনি এইরকম দেখতে শুধুমাত্র শিরোনাম সহ একটি খালি তালিকা পাবেন:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ডকারফাইল
আমরা খুব গভীরে ডুব দেওয়ার আগে পরিষ্কার পরিভাষা দিয়ে শুরু করা গুরুত্বপূর্ণ৷
আপনার রেল অ্যাপ্লিকেশন "ডকারাইজড" হওয়ার পরে, এটি একটি পাত্রে চলবে৷ . একটি ধারক একা থাকে, প্রতিস্থাপনযোগ্য, এবং প্রায়ই পুনর্নির্মিত হয়।
একটি ধারক একটি ছবি থেকে তৈরি করা হয়েছে৷ . একটি ছবি হল একটি ফাইল সিস্টেমের ভার্চুয়াল স্ন্যাপশট যা মেটাডেটার সাথে যুক্ত।
একটি ডকারফাইল সোর্স কোড যা বর্ণনা করে যে কিভাবে একটি ছবি তৈরি করা উচিত। ডকারফাইলগুলি প্রায়শই একটি ডকারাইজড অ্যাপের সংগ্রহস্থলে অন্তর্ভুক্ত করা হয় এবং বাকি অ্যাপের সাথে সংস্করণ নিয়ন্ত্রণে ট্র্যাক করা হয়।
একটি ডকারফাইল তৈরি করা এটি শোনার চেয়ে সহজ! ডকার আমাদের বিশেষ সিনট্যাক্স দেয় যা কিছু কন্টেইনারাইজ করার কঠোর পরিশ্রমকে বিমূর্ত করে। প্রথমে, আপনি যে অ্যাপটি ধারণ করতে চান তার রুট ডিরেক্টরিতে আপনার পথ তৈরি করুন। এখন আপনি কাজ শুরু করার জন্য প্রস্তুত, আপনি যদি গিট ব্যবহার করেন তবে একটি নতুন শাখা তৈরি করা একটি ভাল ধারণা। আপনি সহজেই dockerize-this-app
নামে একটি নতুন শাখা তৈরি করতে পারেন নিম্নলিখিত চালানোর মাধ্যমে:
git checkout -b dockerize-this-app
এরপরে, একটি ডকারফাইল তৈরি করুন এবং এটিকে রুবি অ্যাপ্লিকেশনের উপর ভিত্তি করে একটি চিত্র তৈরি করতে নির্দেশ করুন। নিম্নলিখিতটি চালিয়ে কমান্ড লাইন থেকে এটি করা যেতে পারে:
echo "FROM ruby:3.0.0" > 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
একটি এখানে একটি সমস্যা হওয়ার সম্ভাবনা আছে৷ , বিশেষ করে যদি আপনি এটি একটি বিদ্যমান উত্পাদন অ্যাপ্লিকেশনে করছেন। Bundler অভিযোগ করতে পারে যে Bundler যে সংস্করণটি ব্যবহার করার চেষ্টা করছে সেটি Gemfile.lock
তৈরি করেছে তার থেকে ভিন্ন। ফাইল যদি এটি ঘটে, আপনার কাছে দুটি পরিষ্কার বিকল্প রয়েছে:
- চিত্রটি যে সংস্করণটি ব্যবহার করছে সেটি পরিবর্তন করুন।
Gemfile.lock
মুছুন সম্পূর্ণরূপে **যদি আপনি এটি করেন, তাহলে নিশ্চিত করুন যে রত্ন-এর যেকোন সংস্করণ আপনার প্রয়োজনে নির্দিষ্ট সংস্করণে পিন করুন, কারণ লকফাইল সম্পূর্ণরূপে পুনরুত্থিত হবে৷
যদি আপনার বান্ডেল ইনস্টল এখনও ব্যর্থ হয়, তাহলে আপনার ডকারফাইলে কিছু অতিরিক্ত ইনস্টলেশনের প্রয়োজন হতে পারে :
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"]
সব মিলিয়ে, আপনার ডকারফাইলটি দেখতে এইরকম হওয়া উচিত (রেল_ওয়ার্ক নামের প্রতিস্থাপিত):
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"]
ডকার কমান্ড ব্যাখ্যা করা হয়েছে
এটি অবশ্যই কিছু সাধারণ ডকারফাইল কমান্ডের সম্পূর্ণ বোঝার জন্য সাহায্য করবে।
- FROM -> এটি নির্ধারণ করে কোন চিত্রের ভিত্তি বন্ধ করা হবে।
- RUN -> এটি ভিতরে কমান্ডগুলি চালায় ধারক।
- ENV -> এটি পরিবেশের ভেরিয়েবলকে সংজ্ঞায়িত করে।
- WORKDIR -> এটি কন্টেইনার ব্যবহার করা ডিরেক্টরিটিকে পরিবর্তন করে।
- CMD -> কন্টেইনার শুরু হলে কোন প্রোগ্রাম চালানো হবে তা নির্দিষ্ট করে।
ডকার রচনা
ডকারের ডকুমেন্টেশন অনুসারে, "কম্পোজ" হল একাধিক ডকার পাত্রে অ্যাপ্লিকেশন তৈরি (এবং শুরু করার) জন্য তাদের টুল। অ্যাপ্লিকেশনের প্রয়োজনীয় পাত্রে স্পিন আপ করার জন্য যা কিছু প্রয়োজন তা YAML-এ রূপরেখা দেওয়া হয়েছে। যখন কেউ docker-compose up
চালায় , পাত্র তৈরি করা হয়! ডকার-কম্পোজ আমাদের কন্টেইনার কনফিগারেশনকে ঘোষণামূলকভাবে বর্ণনা করতে দেয়।
আপনার ডকার কম্পোজ ফাইল তৈরি করার আগে, ডকারকে নির্দেশ করা গুরুত্বপূর্ণ যে কোন ফাইলগুলি তৈরি করা হয়েছে তা থেকে বাদ দেওয়া উচিত। .dockerignore
নামে একটি ফাইল তৈরি করুন . (পিরিয়ড নোট করুন!) এই ফাইলে, নিম্নলিখিত পেস্ট করুন:
.git
.dockerignore
.env
যদি আপনার Gemfile বিল্ড প্রক্রিয়া দ্বারা রক্ষণাবেক্ষণ করা হয়, তাহলে Gemfile.lock
যোগ করতে ভুলবেন না। উপরের উপেক্ষা করার জন্য।
এরপর, docker-compose.yml
নামে একটি ফাইল তৈরি করুন . এখানেই আমরা আমাদের কন্টেইনার কনফিগারেশন বর্ণনা করব। আমরা ফাইলের বিষয়বস্তুর জন্য এটি দিয়ে শুরু করব:
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
. db কন্টেইনারটি পোস্টগ্রেসের উদ্দেশ্যে তৈরি করা একটি পূর্বনির্ধারিত চিত্র থেকে তৈরি করা হবে এবং আপনাকে POSTGRES_USER
এর জন্য প্রাসঙ্গিক মানগুলি প্রতিস্থাপন করা উচিত এবং POSTGRES_PASSWORD
. আপনার উচিত উৎপাদন গোপনীয়তা না রাখার ব্যাপারে সতর্ক থাকা এই ফাইলটিতে - এটি সম্পর্কে আরও তথ্যের জন্য নীচের "গোপন ব্যবস্থাপনা" বিভাগটি দেখুন৷
ওয়েব কন্টেইনারটি আমাদের ডকারফাইল থেকে তৈরি করা হয়েছে এবং তারপর পোর্ট 3000-এ আইপি ঠিকানা 0.0.0.0 এ একটি রেল সার্ভার শুরু করে। অভ্যন্তরীণ পোর্ট 3000 তারপর প্রকৃত পোর্ট 3000-এ ম্যাপ করা হয়৷
এবং সবশেষে, আমাদের জন্য ডেটা বজায় রাখার জন্য আমাদের কাছে একটি Postgres ভলিউম আছে।
সিক্রেট ম্যানেজ করা
বিল্ড-টাইমে প্রমাণীকরণ উত্পাদন অ্যাপ্লিকেশনের জন্য একটি সমস্যা হতে পারে। সম্ভবত আপনার অ্যাপ্লিকেশনটি একটি ব্যক্তিগত সংগ্রহস্থল থেকে রত্ন খুঁজছে, অথবা আপনাকে কেবল ডাটাবেস শংসাপত্রগুলি সংরক্ষণ করতে হবে৷
ডকারফাইলে সরাসরি থাকা যেকোনো তথ্য চিরকালের জন্য ধারক চিত্রে বেক করা হয়, এবং এটি একটি সাধারণ নিরাপত্তা বিপত্তি।
আপনি যদি রেলের শংসাপত্র ম্যানেজার ব্যবহার করেন তবে ডকারকে (বা সেই বিষয়ে কোনও হোস্ট) অ্যাক্সেস দেওয়া তুলনামূলকভাবে তুচ্ছ। ডকার কম্পোজ ফাইলে, আপনি কেবল RAILS_MASTER_KEY
প্রদান করেন পরিবেশ সূচক. প্রদত্ত রচনা লক্ষ্যের জন্য, আপনি একটি environment
এর অধীনে কীটি নির্দিষ্ট করুন শিরোনাম, যা আপনাকে তৈরি করতে হবে যদি আপনি ইতিমধ্যে না করেন। উপরের থেকে ডকার-কম্পোজ ফাইলটি নিম্নলিখিত হয়ে যাবে:
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
-এ স্পষ্টভাবে কনফিগার করা যেতে পারে .
আরেকটি সাধারণ সমস্যা হল মেইলারদের। যদি আপনার অ্যাপ্লিকেশন মেইলার ব্যবহার করে, আপনাকে অবশ্যই সংযোগ সেটিংস স্পষ্টভাবে সংজ্ঞায়িত করতে হবে . SMTP একটি সম্পূর্ণ সূক্ষ্ম ডেলিভারি পদ্ধতি এবং সাধারণত ডিফল্টের সাথে ভাল কাজ করে, তবে আমাদের কনটেইনার কনফিগারেশনের সাথে মেলে সার্ভারের অবস্থান এবং অন্যান্য সেটিংস সেট করার বিষয়ে আমাদের সতর্ক থাকতে হবে।
আপনার যদি কর্মী বা ব্যাকগ্রাউন্ডের চাকরি থাকে, যেমন sidekiq , তাহলে আপনাকে অবশ্যই এটির নিজস্ব পাত্রে চালাতে হবে।
উপসংহার
একটি প্রোডাকশন রেল অ্যাপ্লিকেশন কন্টেইনারাইজ করা বেশ কয়েকটি চ্যালেঞ্জের সাথে আসে, আপনি নিঃসন্দেহে দেখেছেন। যেহেতু আপনার আবেদন বেড়েছে, এটি সম্ভবত অনেকগুলি নির্ভরতা জমা করেছে যা এইরকম চ্যালেঞ্জিং মাইগ্রেশন করে। এটি ব্যাকগ্রাউন্ড কর্মী, মেইলার বা সিক্রেটসই হোক না কেন, বেশিরভাগ সমস্যাগুলি পরিচালনা করার জন্য প্রতিষ্ঠিত নিদর্শন রয়েছে। একবার ডকারের সাথে কাজ করে একটি প্রোডাকশন অ্যাপ্লিকেশন পাওয়ার প্রাথমিক কাজ সম্পূর্ণ হয়ে গেলে, ভবিষ্যতের পরিবর্তন এবং স্থাপনের সহজতা বিনিয়োগটিকে সার্থক করে তুলবে৷