ডেভেলপারদের জন্য Docker: ইমেজ, কন্টেইনার এবং Compose
আপনি নিশ্চয়ই Docker সম্পর্কে শুনেছেন এবং এটি কীভাবে আপনার ডেভেলপমেন্ট ওয়ার্কফ্লো সহজ করতে পারে। কিন্তু যদি আপনি কন্টেইনারে নতুন হন, তবে পরিভাষা এবং কমান্ডগুলি অপ্রতিরোধ্যযোগ্য মনে হতে পারে। এই গাইডটি সমস্ত বিভ্রান্তি দূর করে Docker ইমেজ, কন্টেইনার এবং Compose-এর একটি প্র্যাকটিক্যাল ধারণা দেয়—যাতে আপনি আজই এগুলি কার্যকরভাবে ব্যবহার শুরু করতে পারেন।
Docker কী এবং কেন আপনার এটির যত্ন নেওয়া উচিত?
Docker হল একটি প্ল্যাটফর্ম যা আপনার অ্যাপ্লিকেশন এবং তার নির্ভরতাগুলিকে একটি মানক ইউনিটে প্যাকেজ করে যাকে কন্টেইনার বলা হয়। কন্টেইনারগুলি হালকা, পোর্টেবল এবং একে অপরের থেকে বিচ্ছিন্ন, যার মানে আপনি আপনার অ্যাপটি আপনার ল্যাপটপ, সহকর্মীর মেশিন বা প্রোডাকশন সার্ভারে ধারাবাহিকভাবে চালাতে পারেন।
মূল সুবিধা? "এটি আমার মেশিনে কাজ করে" অতীতের বিষয় হয়ে যায়। Docker নিশ্চিত করে যে আপনার কোড যে পরিবেশে চলে তা সর্বত্র অভিন্ন।
ইমেজ বনাম কন্টেইনার: বিল্ডিং ব্লক
শুরু করার আগে, আপনাকে ইমেজ এবং কন্টেইনার-এর মধ্যে পার্থক্য বুঝতে হবে।
- ইমেজ: একটি রিড-অনলি টেমপ্লেট যা আপনার অ্যাপ্লিকেশন কোড, রানটাইম, লাইব্রেরি এবং নির্ভরতা ধারণ করে। এটিকে একটি স্ন্যাপশট বা ব্লুপ্রিন্ট হিসাবে ভাবুন।
- কন্টেইনার: একটি ইমেজের রানেবল ইনস্ট্যান্স। আপনি কন্টেইনার শুরু, বন্ধ, সরাতে এবং মুছতে পারেন। একই ইমেজ থেকে একাধিক কন্টেইনার চালানো যেতে পারে।
সংক্ষেপে: একটি ইমেজ হল রেসিপি, এবং একটি কন্টেইনার হল সেই খাবার যা আপনি এটি থেকে রান্না করেন।
ডেভেলপারদের জন্য প্রয়োজনীয় Docker কমান্ড
এখানে কমান্ডগুলি রয়েছে যা আপনি প্রায়শই ব্যবহার করবেন:
docker pull <image>– Docker Hub-এর মতো একটি রেজিস্ট্রি থেকে একটি ইমেজ ডাউনলোড করুন।docker images– সমস্ত স্থানীয় ইমেজ তালিকাভুক্ত করুন।docker run <image>– একটি ইমেজ থেকে একটি কন্টেইনার তৈরি এবং শুরু করুন।docker ps– চলমান কন্টেইনার তালিকাভুক্ত করুন। সমস্ত কন্টেইনার দেখতে-aযোগ করুন, বন্ধগুলি সহ।docker stop <container>– একটি চলমান কন্টেইনার সুন্দরভাবে বন্ধ করুন।docker rm <container>– একটি বন্ধ কন্টেইনার সরান।docker rmi <image>– একটি ইমেজ সরান।docker exec -it <container> bash– একটি চলমান কন্টেইনারের ভিতরে একটি ইন্টারঅ্যাকটিভ শেল খুলুন।
উদাহরণস্বরূপ, একটি সাধারণ Nginx ওয়েব সার্ভার চালাতে:
docker run -d -p 8080:80 nginx
এটি nginx ইমেজটি টেনে আনে (যদি ইতিমধ্যে উপস্থিত না থাকে), ডিটাচড মোডে (-d) একটি কন্টেইনার শুরু করে এবং আপনার হোস্টের পোর্ট 8080 কে কন্টেইনারের পোর্ট 80-এ ম্যাপ করে (-p 8080:80)।
Dockerfile দিয়ে নিজের ইমেজ তৈরি করা
আপনার অ্যাপ্লিকেশন প্যাকেজ করতে, আপনি একটি Dockerfile তৈরি করেন—নির্দেশাবলী সহ একটি টেক্সট ফাইল। এখানে একটি Node.js অ্যাপের জন্য একটি সাধারণ উদাহরণ:
# Use an official Node.js runtime as a parent image
FROM node:18-alpine
# Set the working directory
WORKDIR /usr/src/app
# Copy package.json and install dependencies
COPY package*.json ./
RUN npm install
# Copy the rest of the application code
COPY . .
# Expose the port the app runs on
EXPOSE 3000
# Define the command to run the app
CMD ["node", "app.js"]
ইমেজটি তৈরি করুন:
docker build -t my-node-app .
তারপর এটি চালান:
docker run -p 3000:3000 my-node-app
Docker Compose দিয়ে মাল্টি-কন্টেইনার অ্যাপ সহজ করা
বাস্তব-জগতের অ্যাপ্লিকেশনগুলির প্রায়শই একাধিক পরিষেবা প্রয়োজন: একটি ওয়েব সার্ভার, একটি ডেটাবেস, একটি ক্যাশে ইত্যাদি। docker run দিয়ে সেগুলি আলাদাভাবে পরিচালনা করা ক্লান্তিকর হয়ে ওঠে। Docker Compose আপনাকে একটি YAML ফাইল ব্যবহার করে মাল্টি-কন্টেইনার অ্যাপ্লিকেশন সংজ্ঞায়িত এবং চালানোর অনুমতি দেয়।
একটি docker-compose.yml ফাইল তৈরি করুন:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: example
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
তারপর সবকিছু শুরু করুন:
docker compose up -d
Compose আপনার জন্য নেটওয়ার্কিং, ভলিউম এবং নির্ভরতা পরিচালনা করে। কন্টেইনার, নেটওয়ার্ক এবং ভলিউম বন্ধ এবং সরাতে, docker compose down চালান।
ডেভেলপমেন্টে Docker-এর জন্য সেরা প্র্যাকটিস
- .dockerignore ব্যবহার করুন: বিল্ড দ্রুত করতে বিল্ড কনটেক্সট থেকে অপ্রয়োজনীয় ফাইল (যেমন
node_modules) বাদ দিন। - মাল্টি-স্টেজ বিল্ড ব্যবহার করুন: বিল্ড-টাইম নির্ভরতাগুলিকে রানটাইম থেকে আলাদা করে আপনার চূড়ান্ত ইমেজ ছোট রাখুন।
- সংস্করণ পিন করুন: পুনরুত্পাদনযোগ্যতার জন্য সঠিক ইমেজ ট্যাগ নির্দিষ্ট করুন (যেমন
node:18.16.0-alpine)। - নন-রুট হিসাবে চালান: আপনার Dockerfile-এ একটি ব্যবহারকারী তৈরি করুন এবং নিরাপত্তা উন্নত করতে
USERদিয়ে এটিতে স্যুইচ করুন। - স্থায়ী ডেটার জন্য ভলিউম ব্যবহার করুন: ডেটাবেস এবং অন্যান্য স্টেটফুল পরিষেবাগুলি কন্টেইনারের ভিতরে নয়, ভলিউমে ডেটা সংরক্ষণ করা উচিত।
সাধারণ সমস্যা এবং কীভাবে এগুলি এড়ানো যায়
- ফোলা ইমেজ: একটি ন্যূনতম বেস ইমেজ (যেমন Alpine) থেকে শুরু করুন এবং প্যাকেজ ক্যাশে পরিষ্কার করুন।
- পোর্ট দ্বন্দ্ব: হোস্ট পোর্ট ইতিমধ্যে ব্যবহারে নেই তা নিশ্চিত করুন। পরীক্ষা করতে
docker psব্যবহার করুন। - লগ উপেক্ষা করা: সমস্যা ডিবাগ করতে
docker logs <container>ব্যবহার করুন। - স্থানীয় ডেভের জন্য Compose ব্যবহার না করা: এমনকি সাধারণ অ্যাপগুলিও Compose-এর ডিক্লারেটিভ সেটআপ থেকে উপকৃত হয়।
FAQ
Docker ইমেজ এবং কন্টেইনারের মধ্যে পার্থক্য কী?
একটি ইমেজ হল একটি রিড-অনলি টেমপ্লেট যা অ্যাপ্লিকেশন এবং তার পরিবেশকে সংজ্ঞায়িত করে। একটি কন্টেইনার হল সেই ইমেজের একটি চলমান ইনস্ট্যান্স। আপনি একটি ইমেজ থেকে অনেক কন্টেইনার তৈরি করতে পারেন।
একটি একক-কন্টেইনার অ্যাপের জন্য আমার কি Docker Compose প্রয়োজন?
অগত্যা নয়। সাধারণ অ্যাপের জন্য, docker run যথেষ্ট। তবে, Compose পরিবেশ ভেরিয়েবল, ভলিউম এবং নেটওয়ার্কিং পরিচালনা করা সহজ করে তোলে, এমনকি একটি পরিষেবার জন্যও, এবং পরে স্কেলিং সহজ করে।
আমি Docker-এ ডেটা কীভাবে স্থায়ী করব?
ভলিউম ব্যবহার করুন। ভলিউমগুলি কন্টেইনারের ফাইল সিস্টেমের বাইরে সংরক্ষণ করা হয় এবং কন্টেইনার মুছে ফেললেও স্থায়ী হয়। Compose-এ, একটি ভলিউম সংজ্ঞায়িত করুন এবং এটি কন্টেইনারের একটি পাথে মাউন্ট করুন (যেমন volumes: - mydata:/var/lib/data)।
আপনার Docker ওয়ার্কফ্লো অপ্টিমাইজ করতে প্রস্তুত? যখন আপনার কন্টেইনার লগ বিশ্লেষণ করার প্রয়োজন হয়, আমাদের Nginx Log Analyzer ব্যবহার করে দেখুন—লগ ডেটা দ্রুত পার্স এবং ভিজ্যুয়ালাইজ করতে—কন্টেইনারাইজড ওয়েব সার্ভার ডিবাগ করার জন্য উপযুক্ত।