`docker stop` और` docker kill` में क्या अंतर है?


116

बीच क्या अंतर है docker stopऔर docker kill?

Afik, दोनों एक चल रहे कंटेनर को रोकेंगे। क्या यह docker stopसही तरीके से कंटेनर के अंदर चलने वाली प्रक्रिया को रोकने का प्रयास है, जबकि docker killएक किल सिग्नल भेजेगा? यदि हां, तो कैसे docker stopपता चलेगा कि रनिंग प्रक्रिया को सही ढंग से कैसे रोका जाए। (चूंकि यह प्रक्रिया से प्रक्रिया में भिन्न होता है)

जवाबों:


112

क्या यह है कि डॉकटर कंटेनर के अंदर चलने वाली प्रक्रिया को सही तरीके से रोकने का प्रयास करता है, जबकि डॉक मारने वाला एक किल सिग्नल भेजेगा?

मूल रूप से हां, अंतर सूक्ष्म है, लेकिन कमांड लाइन संदर्भ में उल्लिखित है :

  • docker stop : एक चल रहे कंटेनर को रोकें ( SIGTERM भेजें, और फिर अनुग्रह अवधि के बाद SIGKILL ) [...] कंटेनर के अंदर मुख्य प्रक्रिया SIGTERM प्राप्त करेगी, और एक अनुग्रह अवधि के बाद, SIGKILL। [जोर मेरा]
  • docker मार : एक रनिंग कंटेनर को मारें ( SIGKILL, या निर्दिष्ट सिग्नल भेजें ) [...] कंटेनर के अंदर मुख्य प्रक्रिया को SIGKILL, या विकल्प - signal के साथ निर्दिष्ट कोई भी संकेत भेजा जाएगा। [जोर मेरा]

इसलिए stopमानक POSIX सिग्नल भेजकर एक सुंदर शटडाउन को ट्रिगर करने का प्रयास करता है SIGTERM, जबकि killडिफ़ॉल्ट रूप से प्रक्रिया को मारता है (लेकिन किसी अन्य सिग्नल को भेजने की अनुमति भी देता है):

SIGTERM सिग्नल को समाप्ति के लिए अनुरोध करने के लिए एक प्रक्रिया में भेजा जाता है। SIGKILL सिग्नल के विपरीत, इसे प्रक्रिया द्वारा पकड़ा और व्याख्या या अनदेखा किया जा सकता है। यह यदि आवश्यक हो तो संसाधनों को जारी करने और राज्य को बचाने के लिए अच्छा समाप्ति प्रदर्शन करने की अनुमति देता है। यह ध्यान दिया जाना चाहिए कि SIGINT लगभग SIGTERM के समान है।

वैसे भी लागू नहीं होने पर, प्रक्रियाओं से आम तौर पर SIGTERMसुशोभित रूप से निपटने और उनकी जिम्मेदारियों के आधार पर सही काम करने की उम्मीद की जाती है - यह ग्रेसफुल शटडाउन प्रयास के कारण आसानी से विफल हो सकता है क्योंकि अनुग्रह अवधि की तुलना में अधिक समय लग रहा है, जो कि विचार करने के लिए कुछ है कि क्या डेटा अखंडता है सर्वोपरि (जैसे डेटाबेस के लिए); अधिक विस्तृत विवरण के लिए उदाहरण के लिए मेजर हेडन का साइजमीटर बनाम सिगिल देखें :

आवेदन यह निर्धारित कर सकता है कि एक बार SIGTERM प्राप्त होने के बाद वह क्या करना चाहता है। हालांकि अधिकांश एप्लिकेशन अपने संसाधनों को साफ करेंगे और रोकेंगे, कुछ नहीं। जब कोई SIGTERM प्राप्त होता है तो पूरी तरह से अलग करने के लिए एक एप्लिकेशन को कॉन्फ़िगर किया जा सकता है। इसके अलावा, यदि एप्लिकेशन खराब स्थिति में है, जैसे कि डिस्क I / O की प्रतीक्षा कर रहा है, तो यह उस सिग्नल पर कार्य करने में सक्षम नहीं हो सकता है जो भेजा गया था।


1
इसलिए यदि मैं कंटेनरों के लिए एक सामान्य शटडाउन प्रक्रिया करना चाहता था, तो मुझे पर्यवेक्षक / रनवे प्रक्रिया में SIGTERM को पकड़ना होगा?
CMCDragonkai

यहां सबसे अच्छा अभ्यास क्या है? मैं समझता हूं कि हम docker killशटडाउन के दौरान कुछ समय बचाने के लिए हाथ से उपयोग क्यों करेंगे , लेकिन एक स्क्रिप्ट में, क्या हमेशा एक अच्छा शटडाउन के माध्यम से प्रयास करना बेहतर नहीं होगा docker stop? मैं अभी भी docker killस्क्रिप्ट में बहुत सारे देख रहा हूँ ।
डेनिस

10

docker kill मुख्य प्रविष्टि प्रक्रिया / कार्यक्रम को अचानक रोक देगा

docker stop इनायत से इसे रोकने की कोशिश करेंगे (विनम्रता से पूछेंगे: पी)

दोनों ही मामलों में फाइलसिस्टम में बदलाव (रुकने या मारने के समय) docker start <container>जारी रहेगा, इसलिए यदि आप वहाँ से चले जाते हैं।


1
... लेकिन docker killकिसी भी लंबित फाइल सिस्टम में बदलाव होने की स्थिति में जो मुख्य प्रक्रिया अभी भी मेमोरी में है वह खो जाएगी, इसलिए फाइल सिस्टम खराब हो सकता है?
अर्जन

जाहिर है, चूंकि एक अचानक बंद हो गया है, केवल मारने के समय में परिवर्तन जारी रहेगा। कुछ भी लंबित हो जाएगा। मेरा कहना यह था कि डॉक मारना वास्तव में नहीं है ... कंटेनर को मारना, इसकी प्रक्रिया को रोकना। जैसे जब आप अपने कंप्यूटर को बंद करने के बजाय बिजली बंद करते हैं
awkwardarts

2
डॉकर कंटेनर VMs नहीं हैं और कर्नेल एक मार के माध्यम से जीवित रहता है। इसलिए, कर्नेल तक पहुंचने वाले किसी भी फाइल सिस्टम में बदलाव किए जाएंगे। फाइलसिस्टम को नुकसान पहुंचाना संभव नहीं होना चाहिए (fsck sense में; एप्लिकेशन को अपने कुछ राइट्स को खोना पसंद नहीं हो सकता है)। docker killएक प्रक्रिया को मारने के अनुरूप है, कि कंप्यूटर को बंद करने के लिए।
इयान हॉवसन

3

और पहले जोड़े गए उत्तरों के अलावा

घटनाओं docker eventsको docker stopदिखाने के बाद दौड़ना

  • मार (सिग्नल 15): जहां सिग्नल 15 = SIGTERM
  • मरना
  • रुकें

घटनाओं docker eventsको docker killदिखाने के बाद दौड़ना

  • मार (संकेत 9): जहां संकेत 9 = संकेत
  • डाई (निकास कोड 137)

docker stopप्रक्रिया को मारने से पहले एक समयबाह्य है। डिफॉल्ट दस सेकंड है।

इस तालिका में और भी अधिक विवरण हैं।


1

यह डेस्कटॉप से ​​प्लग ऑफ को खींचने और कंप्यूटर को बंद करने के अनुरूप है

जैसे प्लग ऑफ खींचने का मतलब है हार्ड पॉवर ऑफ, docker killइसका मतलब है कि my_container को मारने का सीधा तरीका, जो पहले इस प्रक्रिया को शालीनतापूर्वक बंद करने का प्रयास नहीं करता है।

कंप्यूटर को बंद करने का मतलब उन सभी प्रक्रियाओं को बंद करने के लिए ओएस को एक संकेत भेजना है, जहां चल रहे कंटेनर को संकेत docker stopभेजने के SIGTERMलिए प्रक्रियाओं को शालीनतापूर्वक बंद करना है।

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