ডেভেলপারদের জন্য Docker: ইমেজ, কন্টেইনার এবং Compose
আপনি এমন কোড লিখেছেন যা আপনার মেশিনে কাজ করে, কিন্তু যখন একজন সহকর্মী এটি চালানোর চেষ্টা করেন, তখন তিনি অনুপস্থিত ডিপেন্ডেন্সি, ভার্সন দ্বন্দ্ব বা অস্পষ্ট ত্রুটির সম্মুখীন হন। Docker আপনার অ্যাপ্লিকেশন এবং তার পরিবেশকে একটি একক, পোর্টেবল ইউনিটে প্যাকেজ করে এই সমস্যার সমাধান করে। এই গাইডে, আপনি Docker-এর মৌলিক বিষয়গুলি শিখবেন: ইমেজ, কন্টেইনার এবং Compose, একটি সাধারণ ওয়েব অ্যাপ কন্টেইনারাইজ করার ব্যবহারিক পদক্ষেপসহ।
Docker কী?
Docker হল কন্টেইনারে অ্যাপ্লিকেশন তৈরি, চালানো এবং শেয়ার করার একটি প্ল্যাটফর্ম। একটি কন্টেইনার হল একটি হালকা, স্বয়ংসম্পূর্ণ এক্সিকিউটেবল প্যাকেজ যা সফ্টওয়্যার চালানোর জন্য প্রয়োজনীয় সবকিছু অন্তর্ভুক্ত করে: কোড, রানটাইম, সিস্টেম টুলস, লাইব্রেরি এবং সেটিংস। কন্টেইনারগুলি অ্যাপ্লিকেশনগুলিকে একে অপরের থেকে এবং হোস্ট সিস্টেম থেকে বিচ্ছিন্ন করে, ডেভেলপমেন্ট, টেস্টিং এবং প্রোডাকশন জুড়ে ধারাবাহিকতা নিশ্চিত করে।
ইমেজ বনাম কন্টেইনার: ব্লুপ্রিন্ট এবং চলমান ইন্সট্যান্স
একটি ইমেজ হল একটি রিড-অনলি টেমপ্লেট যা একটি কন্টেইনারকে সংজ্ঞায়িত করে। এটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের একটি ক্লাসের মতো। একটি কন্টেইনার হল একটি ইমেজের রানেবল ইন্সট্যান্স, একটি অবজেক্টের মতো। আপনি একই ইমেজ থেকে অনেক কন্টেইনার তৈরি করতে পারেন।
ইমেজগুলি একটি Dockerfile থেকে তৈরি করা হয়, যা নির্দেশাবলী সহ একটি টেক্সট ফাইল। কন্টেইনারগুলি docker run দিয়ে শুরু করা হয়।
মূল পার্থক্য
| ইমেজ | কন্টেইনার |
|---|---|
| রিড-অনলি টেমপ্লেট | রানেবল ইন্সট্যান্স |
docker build দিয়ে তৈরি | docker run দিয়ে শুরু |
| রেজিস্ট্রিতে সংরক্ষিত (যেমন, Docker Hub) | হোস্টে চলে |
| লেয়ারড ফাইলসিস্টেম | উপরে রাইটেবল লেয়ার |
আপনার প্রথম ইমেজ তৈরি করা
চলুন একটি সাধারণ Node.js অ্যাপ কন্টেইনারাইজ করি। Dockerfile নামে একটি ফাইল তৈরি করুন:
# Use an official Node.js runtime as a parent image
FROM node:18-alpine
# Set the working directory
WORKDIR /app
# Copy package.json and install dependencies
COPY package*.json ./
RUN npm install
# Copy the rest of the application
COPY . .
# Expose the port the app runs on
EXPOSE 3000
# Define the command to run the app
CMD ["node", "server.js"]
একটি ট্যাগ দিয়ে ইমেজ তৈরি করুন:
docker build -t my-node-app .
-t ফ্ল্যাগ ইমেজের নাম এবং ট্যাগ নির্ধারণ করে। শেষের . বিল্ড কনটেক্সট (বর্তমান ডিরেক্টরি) নির্দিষ্ট করে।
কন্টেইনার চালানো
আপনার ইমেজ থেকে একটি কন্টেইনার শুরু করুন:
docker run -p 3000:3000 -d --name my-app my-node-app
-p 3000:3000: হোস্টের পোর্ট 3000-কে কন্টেইনারের পোর্ট 3000-এ ম্যাপ করে।-d: কন্টেইনারটি ডিটাচড মোডে (ব্যাকগ্রাউন্ডে) চালায়।--name my-app: সহজে রেফারেন্সের জন্য কন্টেইনারকে একটি নাম দেয়।
docker ps দিয়ে চলমান কন্টেইনার দেখুন। docker stop my-app দিয়ে কন্টেইনার বন্ধ করুন।
ভলিউম দিয়ে ডেটা ম্যানেজ করা
কন্টেইনারগুলি ক্ষণস্থায়ী; কন্টেইনার সরানো হলে এর ভিতরের ডেটা হারিয়ে যায়। ডেটা স্থায়ী করতে, ভলিউম ব্যবহার করুন। উদাহরণস্বরূপ, ডেটাবেস ডেটা স্থায়ী করতে:
docker run -v my-db-data:/var/lib/mysql -d mysql:8
এটি my-db-data নামে একটি নেমড ভলিউম তৈরি করে যা কন্টেইনার রিস্টার্ট এবং রিমুভাল জুড়ে টিকে থাকে।
Docker Compose দিয়ে মাল্টি-কন্টেইনার অ্যাপ সরলীকরণ
প্রকৃত অ্যাপ্লিকেশনগুলির প্রায়ই একাধিক পরিষেবা প্রয়োজন: একটি ওয়েব সার্ভার, একটি ডেটাবেস, একটি ক্যাশে ইত্যাদি। Docker Compose আপনাকে একটি একক YAML ফাইল দিয়ে মাল্টি-কন্টেইনার অ্যাপ সংজ্ঞায়িত এবং চালানোর সুবিধা দেয়।
একটি docker-compose.yml তৈরি করুন:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
db:
image: postgres:15
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mydb
volumes:
postgres_data:
সবকিছু চালান:
docker compose up -d
Compose ওয়েব ইমেজ তৈরি করে, ডেটাবেস শুরু করে এবং একটি শেয়ার্ড নেটওয়ার্কে তাদের সংযুক্ত করে। depends_on নিশ্চিত করে যে ডেটাবেস ওয়েব সার্ভিসের আগে শুরু হয়।
প্রয়োজনীয় Docker কমান্ড
docker ps -a: সমস্ত কন্টেইনার তালিকা করুন (বন্ধগুলিসহ)।docker images: ইমেজ তালিকা করুন।docker logs my-app: কন্টেইনার লগ দেখুন।docker exec -it my-app sh: চলমান কন্টেইনারের ভিতরে একটি শেল খুলুন।docker compose down: Compose ফাইলে সংজ্ঞায়িত কন্টেইনার, নেটওয়ার্ক এবং ভলিউম বন্ধ ও সরান।
ডেভেলপমেন্টের জন্য সেরা অনুশীলন
- .dockerignore ব্যবহার করুন বিল্ড কনটেক্সট থেকে ফাইল (যেমন, node_modules) বাদ দিতে, যা বিল্ড দ্রুত করে।
- মাল্টি-স্টেজ বিল্ড ব্যবহার করুন প্রোডাকশন ইমেজ ছোট রাখতে। উদাহরণস্বরূপ, একটি স্টেজে আপনার অ্যাপ তৈরি করুন এবং শুধুমাত্র প্রয়োজনীয় আর্টিফ্যাক্ট একটি স্লিম রানটাইম ইমেজে কপি করুন।
- ভার্সন পিন করুন আপনার Dockerfile-এ (যেমন,
node:latest-এর পরিবর্তেnode:18-alpine) পুনরুৎপাদনযোগ্যতার জন্য। - নন-রুট ইউজার হিসেবে চালান নিরাপত্তার জন্য। ফাইল কপি করার পরে
USER nodeযোগ করুন।
সাধারণ জিজ্ঞাসা
একটি Docker ইমেজ এবং একটি কন্টেইনারের মধ্যে পার্থক্য কী?
একটি ইমেজ হল একটি রিড-অনলি টেমপ্লেট যা অ্যাপ্লিকেশন এবং তার পরিবেশকে সংজ্ঞায়িত করে। একটি কন্টেইনার হল সেই ইমেজের একটি চলমান ইন্সট্যান্স। আপনি একই ইমেজ থেকে একাধিক কন্টেইনার তৈরি করতে পারেন।
Docker-এ আমি কীভাবে ডেটা স্থায়ী করব?
ভলিউম ব্যবহার করুন। নেমড ভলিউম (যেমন, docker run -v my-vol:/data) কন্টেইনারের ফাইলসিস্টেমের বাইরে সংরক্ষিত হয় এবং কন্টেইনার রিস্টার্ট ও রিমুভাল জুড়ে টিকে থাকে।
আমি কখন Docker Compose ব্যবহার করব?
Compose ব্যবহার করুন যখন আপনার অ্যাপ্লিকেশন একাধিক পরিষেবা নিয়ে গঠিত (যেমন, ওয়েব + ডেটাবেস) যা একসাথে চালানো প্রয়োজন। এটি ডেভেলপমেন্ট এবং টেস্টিংয়ের জন্য অর্কেস্ট্রেশন সরল করে।
আপনার পরবর্তী প্রকল্প কন্টেইনারাইজ করতে প্রস্তুত? একটি সাধারণ Dockerfile লিখে এবং আপনার প্রথম কন্টেইনার চালিয়ে শুরু করুন। আরও ডেভেলপার টুলের জন্য, TryQuickToolBox-এর JSON ফরম্যাটার দেখুন আপনার কন্টেইনারাইজড পরিষেবাগুলি পরীক্ষা করার সময় API প্রতিক্রিয়া যাচাই করতে।