স্বীকারোক্তির সময়। আমি হানিব্যাজারে যে চার বছরে কাজ করেছি তাতে আমার উন্নয়নের পরিবেশ খুব একটা পরিবর্তিত হয়নি। কিন্তু সেই সময়ে হানিব্যাজার অনেক বেশি পরিশীলিত হয়ে উঠেছে, কাজ করার জন্য প্রায় দশটি পরিষেবার উপর নির্ভর করে।
এজন্য আমরা স্থানীয় উন্নয়নের জন্য ডকারের দিকে এগিয়ে যাচ্ছি। প্রতিটি ডেভেলপারকে Postgres, Cassandra, Memcached এবং বাকিগুলি সেট আপ করার পরিবর্তে, আমরা একটি পূর্ব-তৈরি পরিবেশ ঘোরাতে ডকার-কম্পোজ ব্যবহার করতে পারি। এটা অসাধারণ।
স্বাভাবিকভাবেই, আমি ভাবতে শুরু করি যে ডকারাইজড অ্যাপ্লিকেশন স্থাপন করা কতটা সহজ হবে।
ডকারের সাথে স্থাপন করা হচ্ছে
ডকার ডকার-মেশিন এবং ডকার-সোয়ার্মের মতো ইউটিলিটিগুলির সাথে আসে যা স্থাপনাকে ব্যথাহীন করে তোলে। এখন পর্যন্ত তারা সেই প্রতিশ্রুতি পূরণ করেনি। আপনি যদি তাদের ঘাটতিগুলি সম্পর্কে সমস্ত পড়তে চান তবে এই সাম্প্রতিক হ্যাকার নিউজ পোস্টটি দেখুন৷
৷সেজন্য আমি Amazon-এর ECS (EC2 কন্টেইনার সার্ভিস) এ ফোকাস করতে বেছে নিয়েছি।
ECS কি?
ইসিএস অনেকটা ডকার-কম্পোজ এবং ডকার-সোয়ার্মের প্রাপ্তবয়স্ক, উৎপাদন-প্রস্তুত ম্যাশআপের মতো।
ECS এর মাধ্যমে আপনি বলতে পারেন "আমার ওয়েব অ্যাপের তিনটি কপি চালান" এবং এটি বুদ্ধিমত্তার সাথে আপনার EC2 দৃষ্টান্তের ক্লাস্টারের মধ্যে উপযুক্ত ডকার কন্টেনারগুলিকে স্পিন করবে৷
এটি আপনার পাত্রে ভারসাম্যের অনুরোধগুলিকে লোড করতে পারে এবং লোডের উপর নির্ভর করে আপনার ক্লাস্টারকে উপরে বা নিচে স্কেল করতে পারে।
একটি ডকারাইজড সিনাট্রা অ্যাপ তৈরি করা হচ্ছে
এখানে একটি সহজ সিনাট্রা অ্যাপ। এটি বর্তমান সময় মুদ্রণ করে, তাই আপনি একটি ক্যাশে সংস্করণ দেখতে পাবেন কিনা তা জানতে পারবেন। এটি অ্যাপটি চালানো কম্পিউটারের নামও প্রিন্ট করে। পরবর্তীতে, আমরা এই অ্যাপটি চালানোর জন্য একাধিক সার্ভার তৈরি করতে যাচ্ছি এবং রুট অনুরোধের জন্য একটি লোড ব্যালেন্সার ব্যবহার করব। হোস্টনাম ফেরত দিয়ে, আমরা বলতে পারি কোন সার্ভারটি একটি বিশেষ অনুরোধ করেছে৷
৷অ্যাপ
ডকারাইজড সিনাট্রা অ্যাপটি আমি আপনাকে দেখাতে যাচ্ছি এটি 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
এটি কাজ করেছে কিনা তা পরীক্ষা করতে, আপনার ওয়েব ব্রাউজারে localhost:4000 খুলুন। আপনি এই মত কিছু দেখতে হবে:
ECS-এ স্থাপন করা হচ্ছে
এখন ইসিএসে স্থাপন করা যাক। আমরা তাদের সেটআপ উইজার্ড ব্যবহার করতে যাচ্ছি। যে প্রতারণা? আমি পাত্তা দিই না। :) তাই ECS কন্ট্রোল প্যানেলে যান।
"শুরু করুন" এ ক্লিক করুন। তারপর পরবর্তী স্ক্রিনে "চালিয়ে যান" এ ক্লিক করুন।"
আপনার ডকার রেজিস্ট্রি তৈরি করা হচ্ছে
আপনি সাধারণত আপনার উন্নয়ন পরিবেশ থেকে একটি প্রোডাকশন সার্ভারে ডকার ইমেজ আপলোড করবেন না। পরিবর্তে, আপনি ছবিগুলিকে একটি ডকার রেজিস্ট্রিতে পাঠান -- যেমন ডকারহাব -- এবং সার্ভার তাদের স্থাপনে টেনে আনে। আমাজন একটি ব্যক্তিগত ডকার রেজিস্ট্রি প্রদান করে। আপনি এটি ব্যবহার করার প্রয়োজন নেই, তবে আমরা আপাতত এটি করতে যাচ্ছি৷
আমি আমার রেজিস্ট্রির নাম রাখব "docker-sinatra":
আপনার ছবিকে রেজিস্ট্রিতে ঠেলে দেওয়া
তারপর, আমার ইমেজ তৈরি করতে এবং এটিকে রেজিস্ট্রিতে পুশ করার জন্য আমাকে কমান্ডের একটি তালিকা দেওয়া হয়।
প্রথমবার যখন আমি এটি চেষ্টা করেছি, আমার ব্রাউজারের অ্যাড-ব্লকার কমান্ডগুলি সঠিকভাবে প্রদর্শিত হতে বাধা দিয়েছে। অদ্ভুত - আমি জানি।
আপনার টাস্কের সংজ্ঞা তৈরি করা
AWS নতুন, বিভ্রান্তিকর, পরিভাষা তৈরি করতে পছন্দ করে। একটি "টাস্ক ডেফিনেশন" হল কেবল পাত্রের একটি তালিকা যা একসাথে চালানো উচিত। এটা অনেকটা Procfile বা ডকার-কম্পোজ কনফিগারেশনের মত।
সুতরাং, যদি আপনার অ্যাপ্লিকেশনটিতে Nginx চালানোর একটি কন্টেইনার থাকে, একটি চলমান ইউনিকর্ন এবং একটি চলমান Sidekiq থাকে, তাহলে তিনটিই আপনার "টাস্ক সংজ্ঞা" এর মধ্যে থাকতে পারে৷
আমাদের অ্যাপটি অনেক সহজ। আমরা শুধুমাত্র একটি পাত্র আছে. তাই কনফিগারেশন ন্যূনতম।
- আমি নিশ্চিত করব যে আমাদের রেজিস্ট্রি থেকে সঠিক ছবি তোলা হয়েছে
- আমি পোর্ট 80কে কন্টেইনার থেকে পোর্ট 80-এ EC2 ইন্সট্যান্সে কন্টেইনার চালাব।
আপনার পরিষেবা তৈরি করা
আরো বিভ্রান্তিকর পরিভাষা! "পরিষেবা" কনফিগারেশন আপনাকে কতগুলি "টাস্ক" (ওরফে আপনার অ্যাপের কপি) চালানো উচিত এবং সেগুলি কীভাবে ভারসাম্যপূর্ণ লোড হবে তা নির্দিষ্ট করতে দেয়৷
এখানে, আমি পোর্ট 80-এ লোড ব্যালেন্সিং সহ আমার অ্যাপের তিনটি কপি চালাতে চাই।
আপনার ক্লাস্টার স্পিন করা
একটি ক্লাস্টার হল সাধারণ EC2 দৃষ্টান্তগুলির একটি গুচ্ছ যা Amazon-এর ECS সফ্টওয়্যার চালাচ্ছে৷ আপনি তাদের সাথে কিছু করতে পারেন যা আপনি অন্য কোন EC2 উদাহরণের সাথে করতে পারেন। এই ক্ষেত্রে, আমি উল্লেখ করেছি যে আমি তিনটি t2.micro দৃষ্টান্ত চাই।
কিছু নিশ্চিতকরণ পদক্ষেপ এবং প্রায় 5 মিনিট অপেক্ষা করার পরে, সবকিছু প্রস্তুত ছিল।
একবার আপনার পরিষেবা কার্যকরী হয়ে গেলে, আপনি একটি স্ক্রীন দেখতে পাবেন যা এইরকম কিছু দেখায়:
অ্যাপটি পরীক্ষা করা হচ্ছে
আপনি লোড ব্যালেন্সার নামের উপর ক্লিক করতে পারেন তার বিশদ বিবরণ টানতে। সেখানে, আপনি এটির সর্বজনীন ডোমেন নাম খুঁজে পাবেন। এটি আপনার ব্রাউজারে রাখুন এবং আপনি আমাদের নমুনা অ্যাপটি দেখতে পাবেন৷
৷
আপনি যদি কয়েকবার রিফ্রেশ করেন, আপনি দেখতে পাবেন যে হোস্টনাম পরিবর্তন হয়েছে। এর কারণ লোড ব্যালেন্সার তিনটি হোস্ট জুড়ে আপনার অনুরোধের ভারসাম্য রক্ষা করছে।
পরিষ্কার করা
ECS উইজার্ড এই মুহূর্তে আপনার AWS অ্যাকাউন্টে প্রচুর সম্পদ তৈরি করেছে। আপনি সম্ভবত তাদের সেখানে ছেড়ে যেতে চান না. তারা জিনিস বিশৃঙ্খল করবে, এবং আপনার অর্থ খরচ হতে পারে।
সৌভাগ্যবশত, ইসিএস উইজার্ড তার সমস্ত সংস্থান তৈরি করতে ক্লাউডফর্মেশন ব্যবহার করে। তার মানে আপনি ক্লাউডফর্মেশন স্ট্যাকটি সরিয়ে দিয়ে সবকিছু মুছে ফেলতে পারেন।