Docker: সাধারণ সমস্যা সমাধান
কন্টেইনার বারবার রিস্টার্ট হচ্ছে, পোর্ট ব্যবহৃত, জায়গা নেই, “permission denied”, একটি সার্ভিস তার প্রতিবেশীকে দেখতে পাচ্ছে না — লক্ষণ ও সমাধান পদ্ধতির একটি টেবিল।
আপডেট: ২৩ আগস্ট, ২০২৬
প্রায় সব কন্টেইনার সমস্যাই এক ডজন সাধারণ সমস্যার মধ্যেই সীমাবদ্ধ। ডায়াগনোসিস সবসময় একই তিনটি কমান্ড দিয়ে শুরু হয়।
প্রথম তিনটি কমান্ড
docker compose ps
docker compose logs --tail 100 <service>
docker inspect -f '{{.State.Status}} {{.State.ExitCode}} {{.State.OOMKilled}} {{.State.Error}}' <container>
স্ট্যাটাস, লগের শেষ কয়েকটি লাইন এবং এক্সিট কোড — এই তিনটিই বেশিরভাগ প্রশ্নের উত্তর দিয়ে দেয়। এরপর লক্ষণ দেখে কাজ শুরু করুন।
লক্ষণের তালিকা
| লক্ষণ | সম্ভাব্য কারণ | কী করবেন |
|---|---|---|
একটানা Restarting | অ্যাপ্লিকেশনটি চালু হওয়ার সময়ই ক্র্যাশ করছে | docker compose logs --tail 200, শেষ নয়, প্রথম এররটি পড়ুন |
এক্সিট কোড 137, OOMKilled: true | মেমরি শেষ | লিমিট বাড়ান বা লিক খুঁজুন, দেখুন রিসোর্স লিমিট |
| চালু হওয়ার সাথে সাথেই এক্সিট কোড 1 | কনফিগারেশন বা ভেরিয়েবলে ত্রুটি | docker compose config — সাবস্টিটিউশন যাচাই করুন |
port is already allocated | পোর্টটি অন্য একটি প্রসেস দখল করে আছে | sudo ss -tulpn | grep :<port> |
no space left on device | ডিস্ক স্পেস বা আইনোড শেষ | df -h এবং df -i, দেখুন ডিস্ক স্পেস |
ভলিউমের ফাইলে permission denied | UID মিলছে না | docker compose exec app id, তারপর chown বা PUID/PGID |
| অ্যাপ্লিকেশন ডেটাবেস দেখতে পাচ্ছে না | আলাদা নেটওয়ার্ক বা localhost-এ রিকোয়েস্ট | দেখুন Docker নেটওয়ার্ক |
Cannot connect to the Docker daemon | সার্ভিসটি চলছে না বা আপনার অনুমতি নেই | sudo systemctl status docker, docker গ্রুপ |
| সবকিছু ধীর, লোড কম | ডিস্ক বটলনেক | iostat -x 2, দেখুন ডিস্ক স্পিড |
কন্টেইনার ক্র্যাশ করছে, কিন্তু লগ খালি
এটি ঘটে যখন প্রসেসটি কিছু প্রিন্ট করার আগেই মরে যায়। মূল কমান্ডের বদলে একটি শেল দিয়ে ইমেজটি ম্যানুয়ালি চালান:
docker run --rm -it --entrypoint sh <image>
ভিতরে গিয়ে স্টার্টআপ কমান্ডটি হাতে চালান — এররটি স্ক্রিনে দেখা যাবে। সেখানে থাকতেই দেখে নিন কনফিগারেশন ফাইলগুলো ঠিক জায়গায় আছে কি না:
docker compose run --rm app cat /app/config.yaml
পরিবর্তনগুলো প্রয়োগ হচ্ছে না
ক্লাসিক ঘটনা: আপনি একটি ফাইল এডিট করেন, রিস্টার্ট করেন, কিন্তু কিছুই বদলায় না।
docker compose config # does Compose see your changes
docker compose up -d --force-recreate app
docker compose exec app cat /etc/app/config.yaml
সাধারণত দুটি কারণ থাকে: ফাইলটি আপনি যেখানে ভাবছেন সেখানে নয়, অন্য কোথাও মাউন্ট করা আছে, অথবা কন্টেইনারটি বিল্ডের সময় ইমেজে ঢুকে পড়া একটি কপি দেখছে।
docker system prune -aদিয়ে সমস্যাটি ঠিক করবেন না। এটি অব্যবহৃত ইমেজ, নেটওয়ার্ক এবং বিল্ড ক্যাশ মুছে ফেলে, আর--volumesফ্ল্যাগসহ ডেটাসহ ভলিউমও মুছে ফেলে। কন্টেইনার থামানোর সাথে সাথেই একটি ভলিউম “অব্যবহৃত” হয়ে যায়। আগে কারণটি বের করুন, তারপর পরিষ্কার করুন।
শেষ পর্যন্ত কখন পরিষ্কার করবেন
docker system df
docker image prune
docker builder prune
docker container prune
docker system df দেখাবে ঠিক কী জায়গা দখল করছে: ইমেজ, বিল্ড ক্যাশ, ভলিউম, নাকি কন্টেইনার লগ। সাধারণত বিল্ড ক্যাশই দায়ী — এটি মুছে ফেলা নিরাপদ।
মেশিন সাড়া না দিলে
SSH কানেক্ট হচ্ছে না, সাইট খুলছে না — সাধারণত কোনো কন্টেইনার মেমরি খেয়ে ফেলেছে এবং সিস্টেম swap-এ চলে গেছে। মেশিন প্যানেলের কনসোল দিয়ে লগইন করুন। htop এবং btop-এর জন্য “Screen” মোড দরকার: টেক্সট লাইনের উপর দিয়ে উইন্ডোর সাইজ পাঠানো হয় না, তাই এটি সবসময় 80×24 থাকে।
free -h
sudo dmesg -T | tail -40
sudo systemctl restart docker
সিস্টেম একেবারেই বুট না হলে, “Access” ট্যাবে বুট মোড SystemRescue রিকভারি ডিস্কে বদলে দিন: মেশিনটি সেটিতেই রিবুট হবে, পাসওয়ার্ড ছাড়াই root লগইন, আর ডিস্কটি /dev/sda হিসেবে দেখা যাবে। সেখান থেকে পার্টিশন মাউন্ট করে ডেটা উদ্ধার করতে পারবেন।
পরে নয়, আগে যা যাচাই করবেন
- লগ সাইজের লিমিট সেট করা আছে — দেখুন কন্টেইনার লগ।
- সব সার্ভিসের জন্য মেমরি লিমিট সেট করা আছে।
- ইমেজের ভার্সন পিন করা আছে, আর পুরনো ইমেজ মুছে ফেলা হয়নি — দেখুন কন্টেইনার আপডেট।
- ডেটার একটি কপি আছে এবং তা যাচাই করা হয়েছে — দেখুন রিস্টোর ড্রিল।