Docker: आम समस्याओं का ट्रबलशूटिंग
कंटेनर बार-बार रीस्टार्ट हो रहा है, पोर्ट इस्तेमाल में है, स्पेस खत्म, “permission denied”, सर्विस अपने पड़ोसी को नहीं देख पा रही — लक्षणों की टेबल और ट्रबलशूटिंग प्रक्रिया।
23 अगस्त 2026 को अपडेट किया गया
लगभग सभी कंटेनर समस्याएँ एक दर्जन आम समस्याओं तक ही सीमित होती हैं। निदान हमेशा उन्हीं तीन कमांड से शुरू होता है।
पहले तीन कमांड
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 | मेमोरी ख़त्म | लिमिट बढ़ाएँ या लीक ढूँढें, देखें resource limits |
| स्टार्टअप के तुरंत बाद एग्ज़िट कोड 1 | कॉन्फ़िगरेशन या वेरिएबल में गड़बड़ी | docker compose config — सब्स्टिट्यूशन जाँचें |
port is already allocated | पोर्ट किसी और प्रोसेस ने ले रखा है | sudo ss -tulpn | grep :<port> |
no space left on device | डिस्क स्पेस या inodes ख़त्म | df -h और df -i, देखें disk space |
वॉल्यूम फ़ाइल पर permission denied | UID मेल नहीं खा रहा | docker compose exec app id, फिर chown या PUID/PGID |
| ऐप्लिकेशन को डेटाबेस दिख नहीं रहा | अलग नेटवर्क या localhost पर रिक्वेस्ट | देखें Docker networks |
Cannot connect to the Docker daemon | सर्विस चल नहीं रही या आपके पास परमिशन नहीं है | sudo systemctl status docker, docker ग्रुप |
| सब कुछ धीमा है, लोड कम है | डिस्क बॉटलनेक | iostat -x 2, देखें disk speed |
कंटेनर क्रैश होता है, पर लॉग ख़ाली है
ऐसा तब होता है जब प्रोसेस कुछ प्रिंट करने से पहले ही मर जाता है। मुख्य कमांड की जगह इमेज को शेल के साथ मैन्युअली चलाएँ:
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 कनेक्ट नहीं होता, साइट नहीं खुलती — आम तौर पर किसी कंटेनर ने मेमोरी खा ली होती है और सिस्टम स्वैप में चला गया होता है। मशीन के पैनल में कंसोल से लॉगिन करें। htop और btop के लिए “Screen” मोड चाहिए: टेक्स्ट लाइन पर विंडो साइज़ पास नहीं होता, इसलिए यह हमेशा 80×24 ही रहता है।
free -h
sudo dmesg -T | tail -40
sudo systemctl restart docker
अगर सिस्टम बिल्कुल बूट ही नहीं हो रहा, तो “Access” टैब में बूट मोड को SystemRescue रिकवरी डिस्क पर स्विच करें: मशीन उसमें रीबूट हो जाएगी, बिना पासवर्ड के root लॉगिन, और डिस्क /dev/sda के रूप में दिखेगी। वहाँ से आप पार्टीशन माउंट करके डेटा निकाल सकते हैं।
बाद में नहीं, पहले क्या जाँचें
- लॉग साइज़ लिमिट सेट हैं — देखें container logs।
- सभी सर्विस के लिए मेमोरी लिमिट सेट हैं।
- इमेज वर्ज़न पिन किए हुए हैं, और पुरानी इमेज डिलीट नहीं हुई है — देखें container updates।
- डेटा की एक कॉपी मौजूद है और वेरिफ़ाई की हुई है — देखें restore drill।