कैसे पता करें कि डॉकटर कंटेनर क्यों निकलता है?


104

मेरे पास 1G RAM के होस्ट में एक डॉकटर कंटेनर है (उसी होस्ट में चलने वाले अन्य कंटेनर भी हैं)। इस डॉकर कंटेनर में एप्लिकेशन कुछ छवियों को डिकोड करेगा, जो मेमोरी का बहुत अधिक उपभोग कर सकते हैं।

समय-समय पर, यह कंटेनर बाहर निकल जाएगा। मुझे संदेह है कि यह स्मृति से बाहर होने के कारण है लेकिन बहुत निश्चित नहीं है। मुझे मूल कारण खोजने के लिए एक विधि की आवश्यकता है। तो क्या यह जानने का कोई तरीका है कि इस कंटेनर की मौत के लिए क्या हुआ?


5
आप उस कंटेनर के लिए लॉग की जाँच कर सकते हैं docker logs <container-id>
टेकतुबा

2
लेकिन कंटेनर से बाहर निकल गया है, मुझे लगता है कि मैं इसे और अधिक नहीं लॉग कर सकता हूं?
ली बिन

बस मेरी मशीन पर कोशिश की। कंटेनर से बाहर निकलने पर भी आप लॉग का उपयोग कर सकते हैं।
सैमुअल तोह

आपने कम से कम कोशिश की?
टेकतुबा

Techtabu, हाँ मैंने किया। यह वैसे भी मदद नहीं करता है
ली बिन

जवाबों:


122

दूसरों ने docker logs $container_idएप्लिकेशन के आउटपुट को देखने का उल्लेख किया है। यह जांच करने के लिए हमेशा मेरी पहली चीज होगी।

इसके बाद, आप docker inspect $container_idराज्य पर विवरण देखने के लिए दौड़ सकते हैं , जैसे:

    "State": {
        "Status": "exited",
        "Running": false,
        "Paused": false,
        "Restarting": false,
        "OOMKilled": false,
        "Dead": false,
        "Pid": 0,
        "ExitCode": 2,
        "Error": "",
        "StartedAt": "2016-06-28T21:26:53.477229071Z",
        "FinishedAt": "2016-06-28T21:26:53.478066987Z"
    },

महत्वपूर्ण पंक्ति "OOMKilled" है जो कंटेनर मेमोरी लिमिट से अधिक होने पर और आपके ऐप को डॉक करने वाले को मार देगा तो यह सच होगा। आप यह देखने के लिए कि क्या यह आपके ऐप द्वारा बाहर निकलने के कारण की पहचान करता है, आप बाहर निकलने के कोड को देखना चाहते हैं।

ध्यान दें, यह केवल यह इंगित करता है कि क्या docker स्वयं आपकी प्रक्रिया को मारता है, और इसके लिए आवश्यक है कि आपने अपने कंटेनर में मेमोरी सीमा निर्धारित की है। डॉकटर के बाहर, लिनक्स कर्नेल आपकी प्रक्रिया को लोल सकता है यदि होस्ट स्वयं मेमोरी से बाहर चलाता है। लिनक्स अक्सर ऐसा होने पर लॉग / इन / लॉग में लिखता है। विंडोज और मैक पर डॉकर डेस्कटॉप के साथ, आप डॉकटर सेटिंग्स में एम्बेडेड लिनक्स वीएम को आवंटित मेमोरी को समायोजित कर सकते हैं।


9
मुझे समझ नहीं आ रहा है कि मेरे कंटेनर के चले जाने के बाद से, "निरीक्षण" कैसे काम करेगा? ऊपर चर्चा से, एक बार ऐप मर जाता है, कंटेनर भी मर जाएगा। आपका मतलब है उसी छवि को पुनः आरंभ करें फिर निरीक्षण करें?
ली बिन

9
@LiBin एक कंटेनर को तब तक नहीं मिटाया जाता है जब वह मर जाता है, यह बस रुकने जैसी स्थिति में पहुँच जाता है = रुक या बाहर हो जाता है। 'docker ps -a' और अपने लिए देखें
सैमुएल तोह

मुझे हर बार एक मेमोरी सघन ऑपरेशन चलाने के लिए 0 से बाहर निकल रहा था और OOMKilled गलत था। याददाश्त बढ़ने से यह फिर से काम करने लगा।
आंद्रेई

1
यह तब हो सकता है जब लिनक्स कर्नेल, डॉक इंजन के बजाय, कंटेनर में प्रक्रियाओं को मारता है। आप अक्सर देखेंगे कि OS में होस्ट पर / var / log के तहत लॉग होता है।
BMitch

5

आप लॉग पढ़कर कंटेनर के अंदर की प्रक्रिया OOMkilled थी या नहीं यह पता लगा सकते हैं। OOMkills कर्नेल द्वारा शुरू की जाती है, इसलिए हर बार ऐसा होता है कि /var/log/kern.logउदाहरण के लिए लाइनों का एक गुच्छा होता है :

python invoked oom-killer: gfp_mask=0x14000c0(GFP_KERNEL), nodemask=(null), order=0, oom_score_adj=995
oom_kill_process+0x22e/0x450
Memory cgroup out of memory: Kill process 31204 (python) score 1994 or sacrifice child
Killed process 31204 (python) total-vm:7350860kB, anon-rss:4182920kB, file-rss:2356kB, shmem-rss:0kB

इस उत्तर ने मुझे यह पता लगाने में मदद की कि एक कंटेनर के साथ क्या गलत है जो डॉकटर बाहर निकलने पर फिर से शुरू करेगा (डॉक का निरीक्षण यहां बहुत मदद नहीं करता है)।
m90

0

हालांकि स्वीकृत उत्तर सबसे अच्छा विकल्प है, कभी-कभी यह मेजबान की पत्रिका की सामग्री (भी लिनक्स पर) का निरीक्षण करने के लिए उपयोगी हो सकता है।

आप इसे टाइप करके देख सकते हैं:

sudo journalctl -u docker

या यह पूंछा

sudo journalctl -u docker -f

या आउटपुट को कम करने के लिए यदि यह आपके टर्मिनल बफर के लिए बहुत लंबा है

journalctl -xn -u docker | less
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.