Monday, August 3, 2020

ডকার কি জিনিস?

এই জটিল টপিকগুলা বুঝতে গেলে মাথা হ্যাং করে বলেই আজ বাধ্য হয়ে পোস্টটা লিখতে হলো।

Image for post
বিশ্বাস করেন গল্পে পিজ্জা নিয়া কিছু নাই

আচ্ছা ভার্চুয়াল বক্সের নাম শুনসেন? যেটা দিয়া উইন্ডোজের ভিতর লিনাক্স চালানো যাইতো? ওইটা যদি না শুনে থাকেন, তাইলে এন্ড্রয়েড এমুলেটর নাম শুনসেন ত সিউর? পিসিতে মোবাইলের গেমস গুলা খেলার জন্য অনেকেই ইন্সটল করতো, ব্লুস্ট্যাক, নক্স সহ কত নাম ছিলো। ডকার ওইটা না, কিন্তু ভার্চুয়াল জিনিসটা কি জিনিস তা বুঝা দরকার।

এইটা ভয়ানক লেভেলের জটিল কারণ এইটাকে কেউ সহজভাবে উপস্থাপন করে না। সবাই শুরুতেই কি ভার্চুয়ালাইজেশন সহ কি কি বলে মাথার উপর দিয়ে যায়।

ধরেন একটা অফিসে নতুন জয়েন করসেন। আর একটা এপ বানাইতে দিসে আপনারে, তো আপনি পিএইচপি, ডট নেট, জাভা ইত্যাদি সব মিলায়া একটা সেই লেভেলের এপ বানায়ে ফেললেন। কোডটাও ধরেন গিটহাবে পুশ করে দিলেন। কিন্তু যেদিন এইটা প্রেজেন্ট করতে যাবেন, ওইদিন আপনার ল্যাপটপ ক্র্যাশ করলো।

জলদি কোড নামায়া আরেকজনের পিসিতে নিয়া গেলেন এইটা রান করার জন্য, কিন্তু ওইখানে এরর দিলো এক বস্তা, ভার্সন নাকি মিলে না। এইবার ভার্সন কই পাবেন? মিটিং কবে হবে? কেমনে কি?

তো আপনার তমুক ভাই কোনমতে অফিসের বসকে একটু ঠান্ডা করলো, আর আপনারে দুইটা দিন হাতে সময় দিলো। আপনি এইবার চিন্তা করতে থাকলেন, কিভাবে আপনার কোডটাকে সব জায়গায় রান করা যায়, ভার্সন নিয়াও যেন হাতাহাতি না করা লাগে।

তো সবার আগে করলেন কি, কি কি ভার্সন লাগবে, ওই সব জিনিস একটা কাগজে লেখলেন। পিএইচপি ৮, ডট নেট ৫, জাভা ৯ ইত্যাদি ভার্সন ছাড়া এইটা নাকি চলবেই না। আবার খালি ইন্সটল দিলে হবে না, একটু কনফিগারও করে নিতে হবে।

কিন্তু আবার ভাবলেন, এত কিছু কনফিগার করতে ত অনেক সময় লাগবে, বারবার এইটা কনফিগার করাও ত ঝামেলা। তো কি করলেন, সবকিছু আপনার ল্যাপটপে ঠিকমত ইন্সটল দিয়া পুরা পিসির একটা ব্যাকআপ নিয়া ফেললেন পেন ড্রাইভে, যেন পেন ড্রাইভ হতেই সরাসরি কাজ করতে পারেন।

কিন্তু পেন ড্রাইভে ফাইল বারবার এডিট করে ফেললেও ত সমস্যা। তাই প্রতিবার দেখানোর সময় জাস্ট পেন ড্রাইভের ফাইলগুলার কপি পিসিতে নিয়া ওটাতে কাজ করবেন।

কি বিশাল গল্প! সামান্য একটা এপপ দেখাইতে গিয়া পেন ড্রাইভ আর কত কিছুর কাহিনী!!!

Image for post
পেনড্রাইভ দেখতে সুন্দর তবে গল্পটা জটিল, ছবি এইখান থেকে পাইছি

আচ্ছা তো ডকার হইলো এই জিনিসটা সহজ করে দিবে। এইটা হইলো এক রকম কনটেইনার টেকনোলোজি। এইসব জটিল ইংরেজি আমিও বুঝিনা, তাও আরকি লিখতেসি। এইটা উইন্ডোজ, লিনাক্স, ম্যাক সবগুলাতেই চলে।

নিচে আমি একটু টেকনিকাল আলোচনা শুরু করলাম। মাথার উপর দিয়া গেলেও জ্বি স্যার, হ্যা স্যার করে যান, পুরোটা পড়ে আরো দুইবার পড়েন, একবার লিখেন, তিনবার রান করে দেখেন, বুঝে ফেলতে পারবেন।

তো, আপনের কাজ হবে নিচের কয়েকটা লাইন বুঝার চেষ্টা করা, না বুঝলে পুরো পোস্ট পড়ে আবার আইসেন এখানে।

  • একটা ছোট Dockerfile ফাইলে বলে দেয়া কি কি করতে হবে, কোনটা কোনটা ইন্সটল দেয়া লাগবে এগুলা লিখে দেয়া
  • এইটার একটা কপি তৈরি করা, বা ইমেইজ বিল্ড করা আরকি, যেটারে পেন ড্রাইভে নেয়ার মত চিন্তা করতে পারেন, স্ন্যাপশটও বলতে পারেন।
  • ওই ইমেইজ টারে একটা কনটেইনারে রান করা। মানে বুঝতেই পারতেসেন, পেন ড্রাইভ হতে যেমনে তমুক ভাইয়ের পিসিতে কপি করসিলেন, তেমনে একদম যা যা দরকার সব অটো হয়ে যাবে আরকি।

ব্যাপার হলো আপনার ওই ছোট Dockerfile ফাইলটা দরকার, আপনি চাইলে ওই স্ন্যাপশট বা ইমেইজটাকেও শেয়ার করতে পারবেন, আপলোড করতে পারবেন রেজিস্ট্রিতে (পেন ড্রাইভে না আরকি, ক্লাউডে/অনলাইনে), এমনকি আসলেই পেন ড্রাইভেও শেয়ার করা সম্ভব।

এইটাই ডকার। কিসের লেয়ার কন্টেইনার কি কি বলে শব্দগুলা শুনলে মাথা নষ্ট হয়ে যায়।

আর ডকার কম্পোজ হইলো অনেকগুলা ডকার সিস্টেম সুন্দর করে ম্যানেজ করার সিস্টেম। ধরেন পিএইচপির অংশটা একটা ডকার ফাইল, জাভার অংশ আরেক ডকার ফাইল, ডট নেটের অংশ আরেক ডকার ফাইল হইলেও সেটা খুব সহজে ম্যানেজ করতে পারবেন এই কম্পোজ দিয়ে।

আরেকটু টেকনিকাল উদাহরন দিই,

ডকারকে আপনে ভাড়া বাসার সাথে তুলনা করতে পারেন। একটা বিল্ডিংয়ে অনেকজন ভাড়া থাকে, কিন্তু পানির লাইন কিংবা গ্যাসের মেইন লাইন মোটামুটি একটাই হয়। যেটা আবার একটু এদিক ওদিক করে সবাইকে ভাগ করে দেয়া হয়। আবার কিছু কিছু অংশ যেমন মিটার কারো কারো জন্য আলাদা হয়, একজন আরেকজনের বাসায় চাইলেই দরজা দিয়া নক দিতে পারে কিন্তু সবাই নিজের নিজের বাসায় থাকে একই বিল্ডিংয়ে। আবার ধরেন গ্যারেজটাও কারো একার না, সবাই একত্রে ওইটা ব্যবহার করতে পারে। ভিতরের রুমগুলাও এইরকম, সবাই আলাদা রুমে থাকে, কিন্তু ডায়নিং রুম বা ওয়াশরুম, বা রান্নাঘর ইত্যাদি আবার শেয়ার করে। আপনার রুমে আপনার শান্তি। মাঝে মাঝে মনে চায় যেন যদি রুমটাকে সাথে নিয়া যাইতে পারতেন কোথাও।

এই জিনিসটাই মূলত ডকার করে। কন্টেইনার, ইমেইজ এইগুলা নিয়ে কাজ করার সময় কিছু না বুঝলে বাসার সাথে তুলনা করবেন, মোটামুটি ধরতে পারবেন।

ব্যাপার হলো ডকার কি জিনিস সেইটা বুঝা আর বুঝে কাজে লাগানো এক জিনিস না, সবাই ত ইন্সটল করতে গেলেই ভয় পায় যে কি না কি। আর তাদের দোষ নাই, এত জটিল কিওয়ার্ডগুলা ব্যবহার করে মানুষ ত ভয় পাবেই!

তো সবার আগে ডকার ইন্সটল করে ফেলেন। বেশি জটিল না। এরপর কন্টিনিউ করেন।

আমাদের ছোট এপ

আমি ধরে নিতেসি আপনে একটা NodeJS এপ বানাইতেসেন (যদিও পিএইচপি ৮ সহ কত কিছু লিখসি উপরে)। তো একটা ফাইল যেটার নাম package.json আর আমরা express ইন্সটল করসি ওটার ভিতর।

{
"name": "docker-tutorial",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"express": "^4.17.1"
}
}

তো আরেকটা ফাইল বানাইলেন index.js নামে, যেটায় একটা মিনিমাল express এপ আছে। যেটা চালালে সে ৩০০০ পোর্টে হ্যালো দুনিয়া দেখাবে।

const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => res.send('Hello World!'));app.listen(port, () =>
console.log(`Example app listening at http://localhost:${port}`)
);

ডকার নিয়ে লেখালেখি

এবার একটা Dockerfile তৈরি করেন, আর একটা একটা লাইন লিখতে থাকেন,

FROM node:14.5.0

প্রথমে আমরা বললাম Docker Hub নামে একটা পাবলিক রিপো আছে, ওখান থেকে node এর 14.5.0 ভার্সনের যেই ইমেইজ আছে ওইটা দিয়ে শুরু করতে।

WORKDIR /app

এমনিতে এইটা /root হয়ে থাকে, এইটা ডকারের ভিতরে (যেইটা ভিতরে চলতেসে, যেটা দিয়া ডকার চালাইতেসি ওইটা না) ওই ফোল্ডারে কাজ করবে। ফোল্ডার না থাকলে তৈরি করে নিবে। কিন্তু যা আছে সবকিছু root ফোল্ডারে নিলে কেমন যেন হয়, তাই এপপ ফোল্ডারে নেয়া।

COPY package.json ./

এখানে আমরা বলতেসি আমার পিসি হতে ইমেইজের ভিতরে package.json টা নাও। এখানে একটা ব্যাপার আছে, পুরা এপের সবকিছু কপি না করে আমরা বলতেসি শুধু package.json নেয়ার জন্য, এটার কারণ হলো আমরা সাধারনত সোর্স কোড একটু বেশি এডিট করি, কিন্তু প্যাকেজ এত বেশি বার ইন্সটল করি না, মেবি দশ বারে একবার। তো ডকার একটু বুদ্ধি করে এইটা রেখে দিবে যেন পরের বার ইনস্টল করলে নতুন করে প্যাকেজগুলা ডাউনলোড না হয়। এইটারে ক্যাশ বলে।

RUN npm install

এখানে এখন package.json এ যা আছে, ওগুলা ইন্সটল করতে বলতেসি।

COPY . .

এরপর বাকি যা আছে সব কপি করে নিবো যেন চালাইতে পারি। সব বলতে index.js ফাইল বা অন্য যা যা আছে ওই ফোল্ডারে।

EXPOSE 3000

আমার এপটা ৩০০০ পোর্টে চলবে, আমরা এই EXPOSE দিয়ে এটাকে ডকারের যে সিস্টেমটা আছে ওটার সাথে সংযুক্ত করতেসি।

CMD ["node", "index.js"]

এরপর ও যতবার রান হবে, ততবার আমাদের নোড এপের কমান্ড দিয়া শুরু করবে।

তো এই কিছু লাইন লিখলাম, যেটা হয়তো মাথার উপর দিয়া যাইতে পারে, কিন্তু Dockerfile এর ভিতর হয়তো এখন এই লাইনগুলা আছে,

FROM node:14.5.0WORKDIR /appCOPY package.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "index.js"]

এইবার আমরা একটা .dockerignore ফাইল তৈরি করবো, যেখানে Dockerfile টা আছে, ওখানেই।

node_modules

এটার কারণে সে আমাদের বাহিরে ইন্সটল করা মডিউলগুলারে ডকারের ভিতর নিবে না। বাহিরেরটা ভিতরে নিয়ে যদি সে ভিতরে ইন্সটল করা মডিউলগুলা নষ্ট করে ফেলে? তাই আরকি।

লেখালেখির পর? বিল্ডিং এর কাজ!

আচ্ছা সব করসি, এইবার এইটা বানাইতে হবে। ও তো নিজে নিজে ইমেইজ হয়া যাবে না, পেন ড্রাইভেও কপি হয়া যাবে না, ভাইরাস না হয়ে থাকলে।

docker build -t docker-sikhtasi .

এখানে বললাম আমার এই ফাইলটা থেকে একটা ইমেইজ বানায়ে দেও আর ওটারে docker-sikhtasi নামে ট্যাগ করো, যেন পরে ব্যবহার করতে পারি। এরপর আমরা এইটা সহজেই খুজে পাবো। আমি docker images কথাটা লিখলাম আর আমাকে বললো এইটা হয়া গেছে।

➜  docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-sikhtasi latest 3160ddd5c450 3 seconds ago 947MB

তো এইটারে যদি আমি রান করতে চাই তাইলে কেমনে? কারণ দিন শেষে আমার nodejs এ তৈরি এপটাই মূল উদ্দেশ্য, এইসব ইমেইজ ছবি কন্টেইনার দিয়া কি করবো?

docker run -p 4000:3000 -d docker-sikhtasi

ওরে বললাম docker-sikhtasi ইমেইজটা রান করো, আর p দিয়া বলতেসি ভিতরের ৩০০০ পোর্টরে বাহিরের ৪০০০ পোর্টে দেখাও। আর d দিয়া বলতেসি এইটা সরাসরি না দেখায়া ব্যাকগ্রাউন্ডে চালাও।

➜  docker run -p 4000:3000 -d docker-sikhtasi
c25a53f3b4a8b2b6d89b88021f2a557624f619abb6f4a518cba00458a85fcee2

চালানোর পর কি জানি একটা বিশাল লেখা দিলো, ওইটাই কন্টেইনারের আইডি। অনেকটা পেন ড্রাইভ হতে একটা কপি নিয়া ওইটা চালানোর মত। এখন আইডিটার কিছু অংশ নিয়া দেখতে চাইলেই দেখায়া দিবে।

➜  ~ docker logs c25a53f3b
Example app listening at http://localhost:3000
➜ ~ docker logs c25
Example app listening at http://localhost:3000

ভিতরে ৩০০০ পোর্টে চলতেসে, কিন্তু বাহিরে চলতেসে ৪০০০ পোর্টে, তাই আমরা ৪০০০ পোর্টে নক দিয়ে দেখি,

➜  ~ curl localhost:4000
Hello World!

বুঝতেই পারতেসেন, ভিতরের আর বাহিরের জগৎ পুরাই আলাদা। এইটা বন্ধ করতে চাইলে আমরা সোজা বলে দিবো, স্টপ!!! বন্ধ করো এইসব!

➜  ~ docker stop c25
c25

আরো জটিল অনেক কিছু করা যায়, যেগুলা লিখতে গেলে অনেক সময় পার হয়ে যাবে। একটু প্রাকটিস করলেই ব্যাপারটা মাথায় চলে আসবে। মেইন কথা, মোবাইলে ছবি তুলে সেইটা পিসিতে কপি করার পর ফটোশপ দিয়া যা খুশি তাই করেন, ডিলিট করে দেন, আপনার মোবাইলের ছবির ত কিছুই হবে না। আর ছবি যারে খুশি তারে পাঠাইতে পারবেন, সে যেই মোবাইল বা পিসি দিয়া দেখা দরকার সেইটা দিয়াই দেখতে পারবে। (আরেক উদাহরণে চলে গেলাম আরকি)।

বাকিটা আপনাদের দায়িত্ব। ডকার নিয়া ঘাটাঘাটি করতে গেলে একটু সমস্যা হবে প্রথম দিকে, ভয় কাজ করবে, এত ভয় পেয়ে লাভ নাই। ভয় পেলে শিখতেই পারবেন না। আর কমেন্ট না করলে আমি শিখতে পারবো না, শেয়ার না করলে আরেকজন শিখতে পারবে না।

Original Post Link: Click Here

No comments:

Post a Comment