এই পোস্টের লক্ষ্য হলো একটি অ্যাপ্লিকেশন ডেভেলপ করা এমন একটি এনভায়রনমেন্টে যা আপনার রিমোট ডিপ্লয়মেন্ট এনভায়রনমেন্টের যতটা সম্ভব কাছাকাছি। ডকার মেশিন এবং কম্পোজ ব্যবহার করে অ্যাপকে লোকাল ডেভেলপমেন্ট থেকে রিমোট ডিপ্লয়মেন্টে সরিয়ে আনে।
Docker Docker Docker
প্রথমে ডকার ইনস্টল করতে হবে। লেখার সময়ে সকল লেটেস্ট ডকার কম্পোনেন্ট ব্যবহার করা হয়েছে।
- Docker 1.7.0
- Docker Machine 0.3.0
- Docker Compose 1.3.0
আমি ধরে নিচ্ছি আপনি VirtualBox-এ ডকার রান করছেন পোস্টের বাকি অংশের জন্য।
আমাদের গেস্টবুক সাইন করুন
আমরা যে অ্যাপ্লিকেশন ডিপ্লয় করব তা একটি সিম্পল গেস্টবুক। এটি একটি বেসিক ৩-টিয়ার অ্যাপ ডেমো করার জন্য যথেষ্ট। আমরা লোকাল ডেভেলপমেন্ট এনভায়রনমেন্ট থেকে শুরু করব যেখানে নিচের টেকনোলজি ব্যবহার করে একটি ওয়েব অ্যাপ ডেভেলপ করব:
- Nginx ওয়েব সার্ভার জন্য
- অ্যাপ সার্ভারের জন্য:
- Python প্রোগ্রামিং ল্যাঙ্গুয়েজ
- Flask ওয়েব ফ্রেমওয়ার্ক
- Gunicorn WSGI সার্ভার
- MySQL ডাটাবেস জন্য
আমরা GitHub-এ একটি রিপোতে কাজ করব, তাই সেটি ক্লোন করে শুরু করি।
git clone https://github.com/rackerlabs/guestbook.git -b dmc guestbook
cd guestbook
নিচে আপনার নিচে কোন ডকার হোস্ট ব্যবহার করছেন তা ট্র্যাক রাখা খুব সহজ। আমি এই অ্যালিয়াস সেট করার পরামর্শ দিচ্ছি যাতে সহজে জানতে পারেন কোন হোস্টে আপনি কথা বলছেন।
alias de='env | grep DOCKER_'
এখন আপনি শুধু de টাইপ করে ডকার এনভায়রনমেন্ট ভেরিয়েবল দেখতে পারেন।
লোকাল ডেভেলপমেন্ট থেকে রিমোট ডিপ্লয়মেন্টে অ্যাপ সরানোর ফাইনাল রেজাল্ট নিচের ছবিতে দেখানো হয়েছে।
লোকাল ডেভেলপমেন্ট
আমাদের লোকাল ডেভেলপমেন্ট এনভায়রনমেন্ট (dev env) খুব সিম্পল কারণ আমাদের ক্রেডেনশিয়াল সেট আপ বা সিকিউরিটি নিয়ে চিন্তা করতে হয় না। আমরা আমাদের সকল dev env স্টাফের সাথে "-dev" সাফিক্স দিয়ে রাখব রিমোট ডিপ্লয়মেন্ট থেকে আলাদা রাখতে।
এনভায়রনমেন্ট ইনিশিয়ালাইজ করা
আমরা docker-machine ব্যবহার করে আমাদের কন্টেইনারের জন্য একটি ডকার হোস্ট তৈরি করব। তারপর ডকারকে সেই হোস্ট ব্যবহার করতে কনফিগার করব। অবশেষে, docker-compose আমাদের পুরো dev env আপ করবে।
docker-machine create --driver virtualbox guestbook-dev
docker-machine ip guestbook-dev # Guestbook Dev IP Address নোট করুন
eval "$(docker-machine env guestbook-dev)"
docker-compose up
যখন এটি রান হচ্ছে, docker-compose.yml পড়ে দেখুন এটি কী করছে। এটি ভালোভাবে কমেন্টেড তাই স্বয়ংবোঝাপড়া। নোট করুন কীভাবে এটি docker-compose-common.yml কে এক্সটেন্ড করে কমন কম্পোনেন্টের ভিত্তি হিসেবে। Docker Compose ফাইল ফরম্যাটের পূর্ণ বিবরণ docker-compose.yml রেফারেন্সে পাবেন।
সব কিছু ডাউনলোড এবং রান হলে, আমাদের ডাটাবেস ইনিশিয়ালাইজ করতে হবে। আমরা আমাদের অ্যাপের একটি one-off কন্টেইনার রান ব্যবহার করব একটি পাইথন কমান্ড চালাতে যা ডাটাবেসে টেবিল তৈরি করবে।
একটি নতুন টার্মিনাল খুলুন এবং guestbook ডিরেক্টরিতে যান।
eval "$(docker-machine env guestbook-dev)"
docker-compose run --rm --no-deps app python app.py create_db
এত কষ্ট কেন এক one-off কন্টেইনার রান করার জন্য? কারণ docker-compose স্বয়ংক্রিয়ভাবে এনভায়রনমেন্ট ভেরিয়েবল ইনজেক্ট করে যা ডাটাবেসে কানেক্ট করার জন্য প্রয়োজন। আমাদের কনফিগারেশন করার কিছু নেই।
এখন আপনার ব্রাউজার খুলুন এবং উপরে নোট করা Guestbook Dev IP Address-এ যান। আমাদের গেস্টবুক সাইন করুন।
একটি পরিবর্তন করুন
নিশ্চিত করি যে আমরা আমাদের অ্যাপ্লিকেশন কোড দ্রুত ডেভেলপ করতে পারি। docker-compose.yml-এ কয়েকটি কী কনফিগারেশন অপশন রয়েছে যা এটাকে সম্ভব করে। volumes এবং command-র কমেন্টগুলো app সার্ভিসের জন্য পুনরায় পড়ুন।
app/templates/index.html আপনার প্রিয় টেক্সট এডিটরে খুলুন। একটি পরিবর্তন করুন এবং সেভ করুন। ব্রাউজারে ফিরে যান এবং রিলোড করুন। Voila!
রিমোট ডিপ্লয়মেন্ট
এই অংশটি একটু ট্রিকি কারণ এখানে ক্রেডেনশিয়াল সেট আপ এবং সিকিউরিটি নিয়ে চিন্তা করতে হয়। আপনার Rackspace অ্যাকাউন্ট না থাকলে, developer+ এর জন্য সাইন আপ করে ফ্রি ক্রেডিট পেতে পারেন। একবার অ্যাকাউন্ট রেডি হলে, আপনার API key খুঁজে বের করুন। আপনার টার্মিনালে নিচের এনভায়রনমেন্ট ভেরিয়েবল সেট করুন।
export OS_USERNAME=your-rackspace-username
export OS_API_KEY=your-rackspace-api-key
export OS_REGION_NAME=IAD
এনভায়রনমেন্ট ইনিশিয়ালাইজ করা
আমরা docker-machine ব্যবহার করে আমাদের কন্টেইনারের জন্য একটি ডকার হোস্ট তৈরি করব।
docker-machine create --driver rackspace guestbook
docker-machine ip guestbook # Guestbook IP Address নোট করুন
এনভায়রনমেন্ট সিকিউর করা
Disclaimer: এটি সবচেয়ে সিকিউর কনফিগারেশনের কাছাকাছি নয়। এই স্ক্রিপ্ট শুধু ডিফল্ট কনফিগারেশনের চেয়ে বেশি সিকিউর করার জন্য intended। এই স্ক্রিপ্ট আপনার সার্ভার owned হয়ে যাওয়া বা বাইক চুরি হয়ে যাওয়া প্রতিরোধ করবে এমন কোনো প্রমিশ নেই। বুরা লোকরা এখনো আপনাকে পাওয়ার চেষ্টা করছে। এবং এই স্ক্রিপ্ট রান করলে আপনাকে সিকিউর অ্যাপ্লিকেশন কোড লিখতে হবে!
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-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 কে এক্সটেন্ড করে কমন কম্পোনেন্টের ভিত্তি হিসেবে।
সব কিছু বিল্ড এবং রান হলে, আমাদের ডাটাবেস ইনিশিয়ালাইজ করতে হবে। আমরা আমাদের অ্যাপের একটি one-off কন্টেইনার রান ব্যবহার করব একটি পাইথন কমান্ড চালাতে যা ডাটাবেসে টেবিল তৈরি করবে।
docker-compose --file docker-compose-prod.yml run --rm --no-deps app python app.py create_db
এখন আপনার ব্রাউজার খুলুন এবং উপরে নোট করা Guestbook IP Address-এ যান। আমাদের গেস্টবুক সাইন করুন।
একটি পরিবর্তন করুন
আমরা রিমোট এনভায়রনমেন্টে অ্যাপ্লিকেশন কোড ডেভেলপ করতে চাই না কিন্তু আমরা সহজে পরিবর্তনগুলো туда ডিপ্লয় করতে চাই।
app/templates/index.html আপনার প্রিয় টেক্সট এডিটরে খুলুন। একটি পরিবর্তন করুন এবং সেভ করুন। ব্রাউজারে ফিরে যান Guestbook Dev IP Address-এ এবং রিলোড করুন। নিশ্চিত করুন লোকাল ডেভেলপমেন্ট এনভায়রনমেন্টে পরিবর্তনটি প্রত্যাশা অনুযায়ী হয়েছে।
এখন সেই পরিবর্তনটি রিমোট এনভায়রনমেন্টে ডিপ্লয় করুন কয়েকটি পরিচিত কমান্ড চালিয়ে।
docker-compose --file docker-compose-prod.yml build
docker-compose --file docker-compose-prod.yml up -d
ব্রাউজারে ফিরে যান Guestbook IP Address-এ এবং রিলোড করুন। Voila! আপনার পরিবর্তনটি দেখাচ্ছে এবং আপনার ডেটা intact আছে।
আর কী করা যায়?
এটি এক ধাপ আরও এগিয়ে নিতে আপনি কী করবেন?
আপনার ডেটা আপনার অ্যাপ্লিকেশনের সবচেয়ে গুরুত্বপূর্ণ অংশ। আপনাকে নিশ্চিত করতে হবে এটি সুরক্ষিত। ব্যাকআপ প্ল্যান দিয়ে শুরু করুন। আপনি নিজের সলিউশন রোল আউট করতে পারেন এবং একটি ক্রন জব ডাটাবেস ডাম্প ক্লাউড ফাইলসে স্টোর করতে পারেন। অথবা আপনি সহজ রুট নিতে পারেন এবং Cloud Backup ব্যবহার করতে পারেন। অবশেষে, আপনি একদম বিস্তৃতভাবে जाয়ে একটি হাইলি অ্যাক্সেসিবল ক্লাউড ডাটাবেস তৈরি করতে পারেন এবং docker-compose.yml কে সেটি ব্যবহার করতে চেঞ্জ করতে পারেন।
উপসংহার
আশা করি আপনি শিখেছেন কীভাবে একটি অ্যাপ্লিকেশন ডেভেলপ করা যায় এমন একটি এনভায়রনমেন্টে যা আপনার রিমোট ডিপ্লয়মেন্ট এনভায়রনমেন্টের যতটা সম্ভব কাছাকাছি। আপনি যদি কোনো সমস্যায় পড়েন, তবে নিচে কমেন্টে জানান।