चूंकि डॉकर कंटेनर सॉफ़्टवेयर के छोटे बॉक्स हैं, इसलिए आप उन्हें कंप्यूटर से कंप्यूटर पर कॉपी और मूव कर सकते हैं। हालांकि, इस पर अक्सर चर्चा नहीं की जाती है, शायद इसलिए क्योंकि बड़े संगठन अपने स्वयं के रिपॉजिटरी सेट करते हैं, जहां वे अपनी खुद की इमेज कस्टमाइज़ कर सकते हैं और उन्हें अपने सर्वर पर वितरित कर सकते हैं जैसा वे फिट देखते हैं। लेकिन अगर आपको कभी-कभी एक या अधिक कंटेनर को घुमाने की आवश्यकता होती है तो आपको अपने स्वयं के वितरण लाइन को सेट करने की परेशानी से नहीं गुजरना चाहिए।
हो सकता है कि आपने अपने स्थानीय कंप्यूटर पर एक डॉकर इंस्टेंस पर काम किया हो और इसे अधिक शक्तिशाली सर्वर पर ले जाने का फैसला किया हो। या शायद आप बस अपने कस्टमाइज़्ड कंटेनर को कई कंप्यूटरों पर तैनात करना चाहते हैं, इसे चारों ओर "कॉपी और पेस्ट" करें। अन्य समय आप एक क्लाउड-कंप्यूटिंग प्रोवाइडर से असंतुष्ट हो सकते हैं और एक अलग पर स्विच करना चाहते हों। जो भी स्थिति हो, ऐसा करने के लिए एक काफी सरल प्रक्रिया है जिसका विवरण नीचे दिया जाएगा।
सोर्स होस्ट से कंटेनर इमेज सेव करें
कंटेनर को पहले रोकना आवश्यक नहीं है, लेकिन यह अत्यधिक अनुशंसित है कि आप ऐसा करें। आप अपने डॉकर इंस्टेंस में डेटा का एक स्नैपशॉट लेंगे। यदि यह चल रहा है जब आप ऐसा करते हैं, तो एक छोटा सा मौका है कि आपके स्नैपशॉट में कुछ फाइलें अधूरी हो सकती हैं। कल्पना करें कि कोई 500MB फाइल अपलोड कर रहा है। जब 250MB अपलोड हो चुका होता है, तो आप docker commit कमांड जारी करते हैं। अपलोड तब जारी रहता है, लेकिन जब आप इस डॉकर इमेज को दूसरे होस्ट पर पुनर्स्थापित करते हैं, तो 500MB में से केवल 250MB उपलब्ध हो सकते हैं।
तो, यदि आप कर सकते हैं, तो पहले इंस्टेंस को रोकें।
docker stop NAME_OF_INSTANCE
एक डॉकर कंटेनर एक जेनेरिक, प्रारंभिक इमेज से बना होता है। समय के साथ, आप इस बेस इमेज में अपने स्वयं के परिवर्तन जोड़ते हैं। कंटेनर के अंदर चल रही प्रोसेस अपना डेटा भी सेव कर सकती हैं या अन्य परिवर्तन कर सकती हैं। यह सब संरक्षित करने के लिए, आप इस नई स्थिति को एक नई इमेज में कमिट कर सकते हैं।
ध्यान दें कि यदि इंस्टेंस वर्तमान में चल रहा है, तो यह कार्रवाई इसकी सामग्री सेव होने तक इसे रोक देगी। यदि आपने अपने कंटेनर में बहुत सारा डेटा जोड़ा है, तो यह ऑपरेशन पूरा होने में अधिक समय लेगा। यदि यह एक समस्या है, तो आप अगली कमांड के बजाय docker commit -p=false NAME_OF_INSTANCE mycontainerimage दर्ज करके इस ठहराव से बच सकते हैं। हालांकि, जब तक बिल्कुल आवश्यक न हो ऐसा न करें। असंगत/अधूरे डेटा वाली इमेज बनाने की संभावना इस मामले में बढ़ जाती है।
इस ट्यूटोरियल में, परिणामी इमेज के लिए एक जेनेरिक नाम चुना गया है, mycontainerimage। यदि आप चाहें तो इस नाम को बदल सकते हैं। यदि आप ऐसा करते हैं, तो इसे उन सभी बाद की कमांड में बदलना याद रखें जहां आप इसका सामना करते हैं।
docker commit NAME_OF_INSTANCE mycontainerimage
अब, इस इमेज को एक फाइल में सेव करें और इसे कंप्रेस करें।
docker save mycontainerimage | gzip > mycontainerimage.tar.gz
अगला, अपनी पसंदीदा फाइल ट्रांसफर विधि का उपयोग करें और mycontainerimage.tar.gz को उस होस्ट पर कॉपी करें जहां आप अपने कंटेनर को माइग्रेट करना चाहते हैं।
डेस्टिनेशन होस्ट पर कंटेनर इमेज लोड करें
जिस होस्ट पर आपने इमेज ट्रांसफर की है, उसमें लॉग इन करने के बाद, इसे डॉकर में इम्पोर्ट करें।
gunzip -c mycontainerimage.tar.gz | docker load
चूंकि आपने इस कंटेनर को यहां कभी इनिशियलाइज़ नहीं किया, आप इसे अभी docker start से शुरू नहीं कर सकते। इसके बजाय, वही कमांड जारी करें जिसे आपने अतीत में उपयोग किया था, जब आपने पहली बार इस डॉकर इंस्टेंस को चलाया था। एकमात्र अंतर अब यह है कि आप अंत में जो भी इमेज आपने अतीत में उपयोग की थी उसके बजाय "mycontainerimage" का उपयोग करेंगे।
अगली कमांड सिर्फ एक उदाहरण है; इसे कॉपी और पेस्ट न करें जब तक कि यह आप पर लागू न हो। (पहली बार इमेज चलाते समय कोई विशेष पैरामीटर आवश्यक नहीं थे)
docker run -d --name=PICK_NAME_FOR_CONTAINER mycontainerimage
इसके विपरीत, निम्न एक कमांड का उदाहरण है जहां पोर्ट 80 को होस्ट मशीन पर कंटेनर पर पोर्ट 80 पर फॉरवर्ड करने के लिए पैरामीटर --publish आवश्यक था:
docker run -d --name=http-server --publish 80:80 mycontainerimage
इसके बाद, आप इस कंटेनर को सामान्य रूप से docker stop और docker start कमांड से रोक और शुरू कर सकते हैं।
फाइल बनाए बिना इमेज ट्रांसफर करें
कभी-कभी आप mycontainerimage.tar.gz फाइल बनाना छोड़ना चाह सकते हैं। शायद आपके पास पर्याप्त डिस्क स्पेस नहीं है क्योंकि कंटेनर में बहुत सारा डेटा है। आप इमेज को सोर्स होस्ट पर सेव, कंप्रेस, ट्रांसफर, अनकंप्रेस और डेस्टिनेशन होस्ट पर लोड एक कमांड में कर सकते हैं। पहले सेक्शन में चर्चा की गई docker commit कमांड चलाने के बाद, आप इसका उपयोग कर सकते हैं:
docker save mycontainerimage | gzip | ssh root@203.0.113.1 'gunzip | docker load'
यह विंडोज से भी काम करना चाहिए, क्योंकि इसमें अब बिल्ट-इन SSH क्लाइंट है (PuTTY अब आवश्यक नहीं)।
इसके बाद, अपनी स्थिति पर लागू होने वाले docker run कमांड के साथ जारी रखें।
निष्कर्ष
docker save और docker load कभी-कभार कंटेनरों को घुमाने के लिए एक तदर्थ समाधान के रूप में बहुत अच्छे हैं। लेकिन याद रखें, यदि आप इसे अक्सर करते हैं, तो आप इसके बजाय अपना स्वयं का प्राइवेट रिपॉजिटरी सेट करना चाह सकते हैं।
इमेज क्रेडिट: एयर फोर्स मेडिकल सर्विस