ডেভেলপারদের জন্য Docker: ইমেজ, কন্টেইনার এবং Compose
আপনি একজন ডেভেলপার, এবং Docker সম্পর্কে শুনেছেন। হয়তো চেষ্টা করেছেন, কিন্তু ইমেজ, কন্টেইনার এবং Compose-এর ধারণাগুলো অস্পষ্ট লাগছে। অথবা আপনি "এটা আমার মেশিনে কাজ করে" বলে ক্লান্ত এবং একটি সামঞ্জস্যপূর্ণ পরিবেশ চান। এই গাইডটি সমস্ত বিভ্রান্তি দূর করে Docker-এর মূল উপাদানগুলো এবং কীভাবে সেগুলো কার্যকরভাবে ব্যবহার করবেন তার একটি ব্যবহারিক ধারণা দেবে।
ডেভেলপারদের জন্য কেন Docker?
Docker পরিবেশের অসঙ্গতি সমাধান করে। আপনার মেশিনে সরাসরি ডিপেন্ডেন্সি ইনস্টল করার পরিবর্তে, আপনি আপনার অ্যাপ এবং এর ডিপেন্ডেন্সিগুলো একটি কন্টেইনারে প্যাকেজ করেন। কন্টেইনারগুলো সব জায়গায় একইভাবে চলে: আপনার ল্যাপটপ, আপনার সহকর্মীর ল্যাপটপ এবং প্রোডাকশনে। এটি সেটআপের পার্থক্য দূর করে এবং অনবোর্ডিং সহজ করে তোলে।
ইমেজ: ব্লুপ্রিন্ট
একটি ইমেজ হল একটি রিড-অনলি টেমপ্লেট। এতে আপনার অ্যাপ্লিকেশন কোড, রানটাইম, লাইব্রেরি এবং এনভায়রনমেন্ট ভেরিয়েবল থাকে। আপনি একটি Dockerfile থেকে ইমেজ তৈরি করেন, যা নির্দেশাবলী সম্বলিত একটি টেক্সট ফাইল।
একটি Node.js অ্যাপের জন্য একটি সাধারণ Dockerfile:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
প্রতিটি নির্দেশ একটি লেয়ার তৈরি করে। লেয়ারগুলো ক্যাশ করা হয়, তাই শুধু কোড পরিবর্তন হলে পুনরায় বিল্ড দ্রুত হয়। ইমেজগুলো Docker Hub বা একটি প্রাইভেট রেজিস্ট্রির মতো রেজিস্ট্রিতে সংরক্ষণ করা হয়।
কন্টেইনার: চলমান ইনস্ট্যান্স
একটি কন্টেইনার হল একটি ইমেজের রানযোগ্য ইনস্ট্যান্স। এটি বিচ্ছিন্ন কিন্তু হোস্ট OS কার্নেল শেয়ার করে, যা এটিকে হালকা করে তোলে। আপনি docker run দিয়ে একটি কন্টেইনার শুরু করেন।
docker run -p 3000:3000 -d my-app
এটি হোস্টের পোর্ট 3000 কে কন্টেইনারের পোর্ট 3000-এ ম্যাপ করে এবং ডিটাচড মোডে চালায়। কন্টেইনারগুলো ক্ষণস্থায়ী: ভলিউম ব্যবহার না করলে অপসারণের সময় পরিবর্তনগুলো হারিয়ে যায়।
মূল কমান্ড:
docker ps– চলমান কন্টেইনার তালিকাdocker stop <container>– একটি কন্টেইনার থামানdocker rm <container>– একটি কন্টেইনার অপসারণ করুনdocker images– ইমেজ তালিকাdocker rmi <image>– একটি ইমেজ অপসারণ করুন
Docker Compose: মাল্টি-কন্টেইনার অ্যাপ
বাস্তব অ্যাপগুলোতে প্রায়ই একাধিক সার্ভিস প্রয়োজন হয়: একটি ওয়েব সার্ভার, একটি ডাটাবেস, একটি ক্যাশে। Docker Compose একটি একক YAML ফাইল দিয়ে মাল্টি-কন্টেইনার অ্যাপ্লিকেশন সংজ্ঞায়িত এবং চালানোর সুযোগ দেয়।
PostgreSQL সহ একটি Node.js অ্যাপের জন্য docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
depends_on:
- db
db:
image: postgres:15
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mydb
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
উভয় সার্ভিস শুরু করতে docker compose up চালান। Compose নেটওয়ার্কিং পরিচালনা করে, তাই web সার্ভিসের নাম দিয়ে db তে পৌঁছাতে পারে।
কখন Docker Compose বনাম প্লেইন Docker ব্যবহার করবেন
| পরিস্থিতি | ব্যবহার |
|---|---|
| একক কন্টেইনার | docker run |
| একাধিক সার্ভিস (অ্যাপ + DB) | Docker Compose |
| প্রোডাকশন অর্কেস্ট্রেশন | Kubernetes, Swarm |
ডেভেলপারদের জন্য সেরা অনুশীলন
- .dockerignore ব্যবহার করুন node_modules, .git ইত্যাদি বাদ দিতে, যা বিল্ড দ্রুত করে।
- মাল্টি-স্টেজ বিল্ড চূড়ান্ত ইমেজ ছোট রাখতে।
- FROM স্টেটমেন্টে ভার্সন পিন করুন পুনরুৎপাদনযোগ্যতার জন্য।
- প্রোডাকশন কন্টেইনারে রুট হিসেবে চালাবেন না।
- ভলিউম ব্যবহার করুন স্থায়ী ডেটা এবং ডেভেলপমেন্টের সময় লাইভ কোড রিলোডের জন্য।
সাধারণ ভুল
পোর্ট দ্বন্দ্ব: যদি পোর্ট 3000 দখল করা থাকে, ভিন্ন হোস্ট পোর্টে ম্যাপ করুন: -p 3001:3000।
ডেটা লস: ভলিউম ছাড়া, কন্টেইনার অপসারণের সময় ডাটাবেস ডেটা অদৃশ্য হয়ে যায়।
ধীর বিল্ড: ক্যাশে ব্যবহার করতে Dockerfile নির্দেশাবলী কম থেকে বেশি পরিবর্তনশীল ক্রমে সাজান।
সাধারণ প্রশ্নোত্তর
ইমেজ এবং কন্টেইনারের মধ্যে পার্থক্য কী?
একটি ইমেজ হল একটি রিড-অনলি টেমপ্লেট; একটি কন্টেইনার হল সেই ইমেজের একটি চলমান ইনস্ট্যান্স। আপনি একই ইমেজ থেকে একাধিক কন্টেইনার চালাতে পারেন।
একটি একক সার্ভিসের জন্য কি Docker Compose প্রয়োজন?
না। একাধিক সার্ভিস থাকলে Compose দুর্দান্ত। একটি একক কন্টেইনারের জন্য docker run সহজ।
Docker-এ ডেটা কীভাবে সংরক্ষণ করব?
ভলিউম ব্যবহার করুন। Compose-এ একটি নামযুক্ত ভলিউম সংজ্ঞায়িত করুন বা docker run এর সাথে -v ব্যবহার করে হোস্ট ডিরেক্টরি বা নামযুক্ত ভলিউম মাউন্ট করুন।
আপনার Docker ওয়ার্কফ্লো সহজ করতে প্রস্তুত? docker-compose.yml বা package.json এর মতো JSON কনফিগারেশন ফাইল দ্রুত যাচাই এবং ফরম্যাট করতে আমাদের JSON ফরম্যাটার দেখুন।