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

কন্টেইনার লগ এবং কীভাবে সেগুলো হারাবেন না

Docker লগ কোথায় সংরক্ষিত হয়, ডিস্ক ভরাট না করতে তাদের সাইজ কীভাবে সীমিত করবেন, এবং কন্টেইনার পুনরায় তৈরি হলেও রেকর্ড টিকে থাকতে কী করবেন।

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

কোনো সার্ভিস ডাউন হলে লগই একমাত্র নির্ভরযোগ্য সূত্র। ডিফল্টভাবে Docker এটিকে কন্টেইনারের পাশে একটি ফাইলে লেখে এবং এর আকারে কোনো সীমা রাখে না: বেশি লগ লেখা অ্যাপ্লিকেশন এক সপ্তাহেই পুরো ডিস্ক ভরে দিতে পারে।

কীভাবে পড়বেন

docker logs -f --tail 100 <container>
docker compose logs -f app
docker compose logs --since 30m --timestamps app
docker logs <container> 2>&1 | grep -i error | tail -50

মনে রাখা ভালো: Docker যা দেখায় তা হলো অ্যাপ্লিকেশন standard output এবং standard error-এ যা লেখে। যদি এটি কন্টেইনারের ভেতরে নিজের ফাইলে লেখে, তাহলে docker logs কিছুই দেখাবে না — আপনাকে কন্টেইনারের ভেতরে লগ খুঁজতে হবে বা আউটপুট রিডাইরেক্ট করতে হবে।

docker compose exec app ls -la /var/log

এখনই আকারে সীমা বসান

সব কন্টেইনারের জন্য গ্লোবাল সেটিং হলো /etc/docker/daemon.json:

{
  "log-driver": "json-file",
  "log-opts": { "max-size": "20m", "max-file": "3" }
}
sudo systemctl restart docker

সেটিংটি রিস্টার্টের পরে তৈরি হওয়া কন্টেইনারে প্রযোজ্য। চলমান কন্টেইনারগুলো পুনরায় তৈরি করতে হবে। একটি একক সার্ভিসের জন্য একই জিনিস Compose-এ যায়:

services:
  app:
    logging:
      driver: json-file
      options:
        max-size: "20m"
        max-file: "3"

ফলাফল: সীমাহীন বৃদ্ধির বদলে প্রতি সার্ভিসে সর্বোচ্চ 60 MB।

আপনাকে অবাক করার আগেই বর্তমান আকার দেখে নিন: sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail। rm দিয়ে চলমান ফাইল ছোট করা যায় না — Docker ডেসক্রিপ্টর ধরে রাখা অবস্থায় জায়গা মুক্ত হয় না। সঠিক উপায়: কন্টেইনার পুনরায় তৈরি করুন বা sudo truncate -s 0 <file> চালান।

কন্টেইনার মুছে গেলেও লগ টিকিয়ে রাখুন

লগ ফাইল কন্টেইনারের সাথে মুছে যায়। ইতিহাস গুরুত্বপূর্ণ হলে এটি সিস্টেম journal-এর হাতে দিন:

logging:
  driver: journald
  options:
    tag: "myapp"
journalctl -t myapp -n 200 --since today
journalctl -t myapp -p err --since "2 days ago"

journald নিজেই রেকর্ড রোটেট করে এবং /etc/systemd/journald.conf-এ SystemMaxUse সেটিং দিয়ে সীমাবদ্ধ থাকে। এটি কত জায়গা নেয় তা দেখতে: journalctl --disk-usage।

একসাথে কয়েকটি সার্ভিসের জন্য সবকিছু এক জায়গায় সংগ্রহ করা বেশি সুবিধাজনক — যেমন একটি ডেডিকেটেড কালেক্টর কন্টেইনার যা দিন অনুযায়ী ফাইলে রেকর্ড সংরক্ষণ করে। তবে journald দিয়েই শুরু করুন: এটি আগে থেকেই আছে এবং কিছুই খরচ করে না।

আউটেজ ডিবাগ করার সময় কী দেখবেন

  1. ক্র্যাশের আগের শেষ 200 লাইন: docker logs --tail 200 <container>।
  2. এক্সিট কোড: docker inspect -f '{{.State.ExitCode}} {{.State.OOMKilled}}' <container>। কোড 137 এবং OOMKilled-এ true মানে মেমরি শেষ হয়ে যাওয়ায় কার্নেল প্রসেসটি কিল করেছে — দেখুন রিসোর্স লিমিট।
  3. মেশিনের সিস্টেম লগ: sudo dmesg -T | tail -50 আউট-অব-মেমরি কিল এবং ডিস্ক ত্রুটি দেখাবে।

সাধারণ ভুল

  • লগে ডিস্ক ভরে গেল এবং সব সার্ভিস ডাউন হয়ে গেল। Docker ইনস্টল করার ঠিক পরেই আকারে সীমা বসানো অবশ্যই করণীয়।
  • ইতিমধ্যে মুছে ফেলা কন্টেইনারের লগ দেখা। docker compose down-এর পরে এটি আর থাকে না। আগে থেকেই journald-এ রেকর্ড সংগ্রহ করুন।
  • লগে সিক্রেট। অ্যাপ্লিকেশন পাসওয়ার্ডসহ কানেকশন স্ট্রিং প্রিন্ট করতে ভালোবাসে। মেশিনে যার অ্যাক্সেস আছে সে-ই লগ পড়তে পারে।
  • টেক্সট কনসোলে ত্রুটি খোঁজা। এটি সবসময় 80×24 এবং লম্বা লাইন কেটে যায়। লগ পড়তে SSH বা “Screen” কনসোল বেশি সুবিধাজনক।