ডেভেলপারদের জন্য Docker: ইমেজ, কন্টেইনার এবং Compose
আপনি নিশ্চয়ই Docker সম্পর্কে শুনেছেন এবং এটি কীভাবে আপনার ডেভেলপমেন্ট ওয়ার্কফ্লো সহজ করতে পারে। কিন্তু যখন আপনি প্রথমবার ইমেজ, কন্টেইনার, এবং Docker Compose এর মতো শব্দগুলির সম্মুখীন হন, তখন এটি অপ্রতিরোধ্য মনে হতে পারে। এই গাইডটি সমস্ত বিভ্রান্তি দূর করে এবং দেখায় যে কীভাবে আপনার প্রকল্পে Docker কার্যকরভাবে ব্যবহার করবেন।
Docker কী এবং কেন আপনার এটি নিয়ে ভাবা উচিত?
Docker হল একটি প্ল্যাটফর্ম যা আপনার অ্যাপ্লিকেশন এবং এর নির্ভরতাগুলিকে একটি মানসম্মত ইউনিটে প্যাকেজ করে যাকে কন্টেইনার বলা হয়। কন্টেইনারগুলি হালকা, পোর্টেবল এবং একে অপরের থেকে বিচ্ছিন্ন। তারা ক্লাসিক "এটি আমার মেশিনে কাজ করে" সমস্যার সমাধান করে নিশ্চিত করে যে আপনার অ্যাপ সর্বত্র একইভাবে চলে।
ভার্চুয়াল মেশিনের বিপরীতে, কন্টেইনারগুলি হোস্ট OS কার্নেল শেয়ার করে, যা তাদের দ্রুত স্টার্ট করতে এবং আরও দক্ষ করে তোলে। এই কারণেই Docker আধুনিক ডেভেলপমেন্ট এবং ডিপ্লয়মেন্ট পাইপলাইনে একটি প্রধান উপাদান হয়ে উঠেছে।
ইমেজ বনাম কন্টেইনার: বিল্ডিং ব্লকস
একটি ইমেজ হল একটি রিড-অনলি টেমপ্লেট যা আপনার অ্যাপ্লিকেশন কোড, রানটাইম, লাইব্রেরি এবং সেটিংস ধারণ করে। একটি কন্টেইনার হল একটি ইমেজের চলমান ইনস্ট্যান্স। একটি ইমেজকে ক্লাস এবং একটি কন্টেইনারকে অবজেক্ট হিসেবে ভাবুন।
আপনি একটি Dockerfile ব্যবহার করে ইমেজ তৈরি করেন। এখানে একটি Node.js অ্যাপের জন্য একটি সহজ উদাহরণ:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Dockerfile-এর প্রতিটি লাইন একটি লেয়ার তৈরি করে। লেয়ারগুলি ক্যাশ করা হয়, তাই শুধুমাত্র পরবর্তী ধাপগুলি পরিবর্তিত হলে পুনর্নির্মাণ দ্রুত হয়।
সাধারণ Docker কমান্ড
docker build -t my-app .— বর্তমান ডিরেক্টরি থেকে একটি ইমেজ তৈরি করুনdocker run -p 3000:3000 my-app— একটি কন্টেইনার চালান এবং পোর্ট ম্যাপ করুনdocker ps— চলমান কন্টেইনারগুলি তালিকাভুক্ত করুনdocker stop <container_id>— একটি কন্টেইনার থামানdocker rmi <image_id>— একটি ইমেজ সরান
Docker Compose: মাল্টি-কন্টেইনার অ্যাপ পরিচালনা
বাস্তব-বিশ্বের অ্যাপগুলির প্রায়শই একাধিক পরিষেবার প্রয়োজন হয়: একটি ওয়েব সার্ভার, একটি ডেটাবেস, একটি ক্যাশে। Docker Compose আপনাকে একটি একক YAML ফাইল দিয়ে মাল্টি-কন্টেইনার অ্যাপ্লিকেশন সংজ্ঞায়িত এবং চালানোর অনুমতি দেয়।
এখানে PostgreSQL এবং Redis সহ একটি Node.js অ্যাপের জন্য একটি docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
- REDIS_URL=redis://cache:6379
depends_on:
- db
- cache
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- pgdata:/var/lib/postgresql/data
cache:
image: redis:7
volumes:
pgdata:
docker compose up চালান এবং সমস্ত পরিষেবা একসাথে শুরু হবে। depends_on নিশ্চিত করে যে ডেটাবেস এবং ক্যাশে ওয়েব পরিষেবার আগে শুরু হয়।
মূল Compose কমান্ড
docker compose up -d— সমস্ত পরিষেবা ডিটাচড মোডে শুরু করুনdocker compose down— কন্টেইনার, নেটওয়ার্ক থামান এবং সরানdocker compose logs -f web— একটি নির্দিষ্ট পরিষেবার লগ অনুসরণ করুনdocker compose exec web sh— একটি চলমান কন্টেইনারের ভিতরে একটি শেল খুলুন
ডেভেলপমেন্টের জন্য সেরা অনুশীলন
- .dockerignore ব্যবহার করুন বিল্ড কনটেক্সট থেকে node_modules, .git, এবং অন্যান্য অপ্রয়োজনীয় ফাইল বাদ দিতে।
- ইমেজ ছোট রাখুন Alpine-ভিত্তিক ইমেজ এবং মাল্টি-স্টেজ বিল্ড ব্যবহার করে।
- রুট হিসেবে চালাবেন না — নিরাপত্তার জন্য আপনার Dockerfile-এ একটি নন-রুট ব্যবহারকারী তৈরি করুন।
- স্থায়ী ডেটার জন্য ভলিউম ব্যবহার করুন এবং ডেভেলপমেন্টের সময় লাইভ কোড রিলোডের জন্য বাইন্ড মাউন্ট ব্যবহার করুন।
- সংস্করণ পিন করুন আপনার Dockerfile এবং Compose ফাইলে অপ্রত্যাশিত আপডেট এড়াতে।
কখন Docker ব্যবহার করবেন (এবং কখন নয়)
Docker উজ্জ্বল হয় যখন আপনার দলগুলির মধ্যে সামঞ্জস্যপূর্ণ পরিবেশ, সহজ নির্ভরতা ব্যবস্থাপনা বা মাইক্রোসার্ভিস প্রয়োজন। সাধারণ স্ট্যাটিক সাইট বা স্ক্রিপ্টের জন্য এটি অতিরিক্ত হতে পারে। আপনার প্রকল্পের জটিলতা এবং ডিপ্লয়মেন্ট প্রয়োজনীয়তার উপর ভিত্তি করে মূল্যায়ন করুন।
FAQ
ইমেজ এবং কন্টেইনারের মধ্যে পার্থক্য কী?
একটি ইমেজ একটি স্ট্যাটিক টেমপ্লেট; একটি কন্টেইনার সেই ইমেজের একটি চলমান ইনস্ট্যান্স। আপনি একই ইমেজ থেকে একাধিক কন্টেইনার চালাতে পারেন।
একটি একক কন্টেইনারের জন্য আমার কি Docker Compose প্রয়োজন?
না, একটি একক কন্টেইনারের জন্য আপনি docker run ব্যবহার করতে পারেন। Compose উপকারী যখন আপনার একাধিক পরিষেবা থাকে যাদের যোগাযোগ করতে হয়।
Docker-এ আমি কীভাবে ডেটা স্থায়ী করব?
ভলিউম বা বাইন্ড মাউন্ট ব্যবহার করুন। ভলিউমগুলি Docker দ্বারা পরিচালিত হয় এবং ডেটাবেসের জন্য আদর্শ; বাইন্ড মাউন্ট একটি হোস্ট ডিরেক্টরি কন্টেইনারে ম্যাপ করে, ডেভেলপমেন্টের জন্য উপযোগী।
আপনার Dockerized অ্যাপগুলি অপ্টিমাইজ করতে প্রস্তুত? যদি আপনি কন্টেইনারগুলির ভিতরে Nginx লগ নিয়ে কাজ করেন, তাহলে দ্রুত লগ পার্স এবং বিশ্লেষণ করতে আমাদের Nginx Log Analyzer ব্যবহার করে দেখুন।