Skip to content
VDS · Docker ও কনটেইনার

Docker Compose: এক কমান্ডে একাধিক সার্ভিস

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

আপডেট: ২৩ আগস্ট, ২০২৬

আপনি একটি দীর্ঘ docker run কমান্ড দিয়ে একটি একক সার্ভিস চালু করতে পারেন। দুটি সার্ভিস যাদের একে অপরকে দেখতে হবে — সেটি আর কাজ করবে না: পরদিনই আপনি প্যারামিটারগুলো ভুলে যাবেন। Compose পুরো বর্ণনাটিকে একটি ফাইলে নিয়ে আসে, যা আপনি পড়তে, সম্পাদনা করতে এবং একটি রিপোজিটরিতে রাখতে পারেন।

ন্যূনতম উদাহরণ

/opt/myapp ডিরেক্টরি, যার ভেতরে compose.yaml:

services:
  db:
    image: postgres:17
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: app
    volumes:
      - db-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      retries: 5

  app:
    image: ghcr.io/example/app:1.4.2
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    environment:
      DATABASE_URL: postgres://postgres:${DB_PASSWORD}@db:5432/app
    ports:
      - "127.0.0.1:8080:8080"

volumes:
  db-data:

তার পাশে, .env ফাইল:

DB_PASSWORD=long-random-password
chmod 600 .env
docker compose up -d
docker compose ps
docker compose logs -f app

এখানে যা গুরুত্বপূর্ণ

  • ঠিকানার বদলে নাম। অ্যাপ্লিকেশনটি db নাম দিয়ে ডেটাবেসে পৌঁছায় — Compose একটি শেয়ার্ড নেটওয়ার্ক তৈরি করে যেখানে সার্ভিসের নাম স্বয়ংক্রিয়ভাবে রিজলভ হয়। ডেটাবেসের পোর্ট বাইরে পাবলিশ করার প্রয়োজন নেই, এবং করা উচিতও নয়।
  • restart: unless-stopped। এটি ছাড়া, মেশিন রিবুট হওয়ার পর কিছুই আবার চালু হবে না।
  • হেলথ চেকসহ depends_on। সাধারণ depends_on শুধু কনটেইনার চালু হওয়ার জন্য অপেক্ষা করে, ডেটাবেস সংযোগ গ্রহণের জন্য প্রস্তুত হওয়ার জন্য নয়। অ্যাপ্লিকেশনটি আগেই চালু হয় এবং ক্র্যাশ করে।
  • সঠিক ইমেজ ভার্সন। postgres:17, postgres:latest নয়। latest ব্যবহার করলে, পরবর্তী pull একদিন এমন একটি মেজর ভার্সন নিয়ে আসবে যা পুরনো ডেটা খুলবে না।
  • 127.0.0.1-এ পাবলিশিং। শুধুমাত্র সার্টিফিকেটসহ একটি ওয়েব সার্ভারের মাধ্যমে বাইরে পোর্ট এক্সপোজ করুন।

দৈনন্দিন কমান্ড

docker compose up -d          # bring up or apply changes
docker compose down           # stop and remove containers (volumes intact)
docker compose down -v        # ...and remove volumes too
docker compose restart app    # restart one service
docker compose exec app sh    # go inside
docker compose pull && docker compose up -d   # update images
docker compose config         # show final file with substitutions

docker compose config চালু করার আগে ফাইলটি যাচাই করার সেরা উপায়: এটি দেখাবে ভেরিয়েবলগুলো কীসে প্রসারিত হয়েছে এবং কোনো ইন্ডেন্টেশন হারিয়ে গেছে কি না।

docker compose down -v ডেটাবেসসহ ভলিউমগুলো মুছে দেয়। এটি অপরিবর্তনীয়। -v সহ যেকোনো অপারেশনের আগে, নিশ্চিত করুন যে আপনার একটি কপি আছে — দেখুন ব্যাকআপ।

এনভায়রনমেন্ট ফাইল

ওভারলে দিয়ে টেস্টিং এবং প্রোডাকশনের জন্য একই স্ট্যাক আলাদা করা সুবিধাজনক:

docker compose -f compose.yaml -f compose.prod.yaml up -d

দ্বিতীয় ফাইলটি শুধুমাত্র পার্থক্যগুলো ওভাররাইড করে: মেমরি লিমিট, পাবলিশ করা পোর্ট এবং লগ লেভেল।

সাধারণ ভুল

  • রিপোজিটরিতে রাখা compose.yaml-এ সিক্রেট। সেগুলো 600 পারমিশনসহ .env-এ রাখুন এবং কমিট করবেন না।
  • docker-compose এবং docker compose মেশানো। পুরনো v1 ভার্সন কিছু সিনট্যাক্স বোঝে না এবং প্রজেক্টগুলো ভিন্ন নামে সংরক্ষণ করে। প্লাগইনটি ইনস্টল করুন — দেখুন Docker ইনস্টলেশন।
  • ভলিউমের বদলে কনটেইনারে ডেটা। docker compose down-এর পরে, এটি অদৃশ্য হয়ে যাবে। দেখুন ভলিউম।
  • মেমরি লিমিট নেই। একটি সার্ভিস মেশিনের সমস্ত মেমরি খেয়ে ফেলে, এবং কার্নেল তার প্রতিবেশীদের কিল করে। দেখুন রিসোর্স লিমিট।