हाल ही में, मैंने Docker के उपयोग पर कुछ दिलचस्प ट्यूटोरियल लिखे हैं, एक अच्छी तकनीक जो LXC को खुशी के एक प्यारे बंडल में लपेटती है, और, मैं कैसे कहूं, कम ऑटिस्टिकली झुकाव वाले डेवलपर्स, इंजीनियरों और सिस्टम एडमिनिस्ट्रेटर्स को, Python उल्टी पर इतना उत्सुक नहीं, OS-लेवल वर्चुअलाइजेशन के चमत्कारों का आनंद लेने देती है। लेकिन समस्याएं हैं।
आज हम जिन दो मुद्दों पर चर्चा करेंगे, वे तब होते हैं जब आप एक नामित कंटेनर शुरू करते हैं, या एक को हटाने का प्रयास करते हैं। अर्थात्, स्क्रीन पर फैंसी अक्षर पढ़ेंगे: "Conflict. The name W is already in use by container XYZ. You have to delete..." और दूसरी परेशानी पढ़ती है: "Conflict, cannot remove the default name of the container..." विराम चिह्न के घोर दुरुपयोग के अलावा, अब हमें यह पता लगाने की जरूरत है कि इसे कैसे सुलझाया जाए।
समस्याएं
ठीक है, तो हमारे पास यह मुद्दा है:
docker run -d -ti -p 22 -p 80 --name <name> <repo:tag>
FATA[0000] Error response from daemon: Conflict. The name "XYZ" is already in use by container hexacode. You have to delete (or rename) that container to be able to reuse that name.
हम एक कंटेनर शुरू नहीं कर सकते, क्योंकि नाम पहले से ही उपयोग में है। docker ps कमांड चलाएं, आप इसे वहां नहीं देखेंगे। इसके अलावा अगर आप दोषी कंटेनर अवशेषों को मारने या हटाने का प्रयास करते हैं, तो आपको मिलता है:
docker rm --link <name>
Error response from daemon: Conflict, cannot remove the default name of the container
FATA[0000] Error: failed to remove one or more containers
लगता है एक डेड एंड। तो अब क्या?
समाधान
पहले, आइए पता लगाएं कि हमारे हाथ में क्या है। जाहिर है, अतीत में किसी बिंदु पर, आपने एक नामित कंटेनर बनाया था, और फिर, आपने इसे चलते छोड़ दिया। उसके बाद, आपका होस्ट किसी भी कारण से रीबूट हुआ, और आपने अपने कंटेनरों को उचित तरीके से समाप्त नहीं किया। बची हुई फाइलें अब आपको पुराने नाम के साथ नए कंटेनर को फिर से बनाने से रोकती हैं, क्योंकि सिस्टम सोचता है कि पुराने अभी भी मौजूद हैं।
इस मुद्दे को ठीक करने के दो तरीके हैं। हम पहले अनुग्रहपूर्ण तरीके से शुरू करेंगे। यदि आप docker ps कमांड चलाते हैं, तो आप अपने पुराने कंटेनरों को नहीं देखेंगे, क्योंकि वे वास्तव में नहीं चल रहे हैं। लेकिन अगर आप -a फ्लैग के साथ docker ps कमांड चलाते हैं, तो आपको अपने सभी कंटेनर रन इतिहास देखने चाहिए:
बाहर निकलने वाले कंटेनर जिनका स्टेटस कोड शून्येतर है, वे असामान्य तरीके से बाहर निकले हैं। उनके नाम के आधार पर जिन्हें आप खोजते हैं, और फिर वास्तविक हेक्साडेसिमल कोड का उपयोग करके उन्हें हटा दें, उदाहरण के लिए:
docker rm 85c2981e63f6 26ea04f41ab3
दूसरी विधि /var के तहत बची हुई फाइलों को मैन्युअल रूप से हटाना है। विशेष रूप से, फाइलें /var/lib/docker/containers/ के तहत पाई जा सकती हैं। प्रत्येक कंटेनर डायरेक्टरी में एक सुपर लंबा हैश पहचानकर्ता होगा, और इसके अंदर, टन बदसूरत JSON आउटपुट। यदि आप एक विशेष स्ट्रिंग की खोज करते हैं जो आपके वांछित कंटेनर नाम से मेल खाता है, तो आप प्रासंगिक डायरेक्टरी ढूंढ लेंगे जो इसकी कॉन्फ़िगरेशन फाइलों को रखती है।
मिलान करने वाले नाम खोज के पैरेंट डायरेक्टरी को हटाएं, फिर Docker सेवा को पुनरारंभ करें। उसके बाद, आपको अपने नाम का फिर से उपयोग करने में सक्षम होना चाहिए। यह वैसा ही है जैसा हमने KVM और libvirt अवशेषों के साथ देखा था।
systemctl restart docker
और आप चालू और चल रहे होंगे, पुराने लड़के!
निष्कर्ष
कुछ समस्याएं वास्तव में कष्टप्रद हो सकती हैं, खासकर जब वे इस बात से संबंधित हों कि सेवाएं क्रैश, रीबूट और ऐसे को कितनी अच्छी तरह और मजबूती से संभालती हैं। मुझे नापसंद है जब बची हुई फाइलें इतना दुख देती हैं। यह ऐसा नहीं होना चाहिए, और सेवाओं को राजसी ढंग से ठीक होना चाहिए। लेकिन अरे, कंटेनर अभी भी एक युवा तकनीक हैं, इसलिए इस तरह की चीजें अपेक्षित हैं।
उम्मीद है, एक शानदार एयरकॉन सिस्टम की तरह जो अपनी रोष को विंडशील्ड पर उड़ाता है, हमने नामित कंटेनर बनाने और अप्रत्याशित रीबूट और क्या-क्या के बाद बचे हुए को हटाने के आसपास के कोहरे और भ्रम को दूर कर दिया है। अब, आपका Docker अनुभव थोड़ा अधिक सुखद होगा, और आपने पृष्ठभूमि में चीजें कैसे काम करती हैं, इस पर एक या दो चीजें सीखी हैं। वहां जाएं, मज़े करें।
चीयर्स।