Docker छवियां अपरिवर्तनीय हैं। एक बार बनने के बाद, वे नहीं बदलतीं। यह स्थिरता, पूर्वानुमान और स्थिरता सुनिश्चित करता है। एक ही छवि से बनाया गया हर कंटेनर समान व्यवहार करता है, और संस्करण सुरक्षित और आसान हो जाता है। लेकिन क्या होगा यदि आपको किसी चल रहे कंटेनर के अंदर कुछ बदलने की आवश्यकता है, जैसे पैकेज इंस्टॉल करना या कॉन्फिगरेशन अपडेट करना? यहीं पर docker commit काम आता है। यह आपको एक चल रहे कंटेनर में परिवर्तनों को कैप्चर करने और मूल को छुए बिना एक नई छवि बनाने देता है। यह फिक्स का परीक्षण करने, तेजी से पुनरावृति करने, और स्क्रैच से पुनर्निर्माण के बिना कस्टम छवियों को रोल आउट करने के लिए बहुत अच्छा है।
Docker छवियां क्यों नहीं बदलतीं
Docker छवियों में कई रीड-ओनली लेयर होते हैं। जब आप एक कंटेनर चलाते हैं, तो Docker एक पतली राइटेबल लेयर को ऊपर जोड़ता है जिसे कंटेनर लेयर कहा जाता है। आपके द्वारा किए गए कोई भी परिवर्तन केवल इस शीर्ष लेयर में होते हैं। एक बार कंटेनर हटा दिए जाने के बाद, उस लेयर में सभी परिवर्तन गायब हो जाते हैं, जिससे मूल छवि अपरिवर्तित रहती है।
यह डिज़ाइन कई लाभों की गारंटी देता है:
- एक ही छवि से हर कंटेनर समान व्यवहार करता है, स्थिरता सुनिश्चित करता है।
- एक कंटेनर में परिवर्तन दूसरों को प्रभावित नहीं करते, पूर्वानुमान प्रदान करते हैं।
- आप जोखिम के बिना विशिष्ट छवि संस्करणों को सुरक्षित रूप से टैग कर सकते हैं।
यह डिज़ाइन उत्कृष्ट स्थिरता प्रदान करता है, लेकिन जब आप किसी चल रहे कंटेनर में त्वरित परिवर्तन करना चाहते हैं तो यह आपको सीमित करता है। यहीं पर docker commit मदद करता है।
एक चल रहे कंटेनर से एक नई छवि बनाता है
जब आप docker commit कमांड चलाते हैं, तो Docker एक चल रहे कंटेनर की वर्तमान स्थिति को कैप्चर करता है और उससे एक नई छवि बनाता है। यह कंटेनर के फाइल सिस्टम का एक स्नैपशॉट लेता है, आपके द्वारा किए गए किसी भी परिवर्तन को सहेजता है, जैसे इंस्टॉल किए गए पैकेज, अपडेटेड कॉन्फिगरेशन, या संशोधित फाइलें, एक नई छवि लेयर के रूप में। इस तरह, मूल छवि अपरिवर्तित रहती है, जिससे आप तेजी से प्रयोग और पुनरावृति कर सकते हैं।
यह भविष्य में पुन: उपयोग के लिए एक कस्टम बेस सेटअप को सहेजने, परीक्षण के दौरान छोटे सुधार या कॉन्फिगरेशन परिवर्तन लागू करने, या Dockerfile को स्क्रैच से पुनर्निर्माण किए बिना अपनी टीम के साथ अपडेटेड छवियों को साझा करने के लिए आदर्श बनाता है।
आप एक चल रहे कंटेनर से एक नई छवि बनाने के लिए निम्न सिंटैक्स के साथ docker commit कमांड का उपयोग कर सकते हैं:
docker commit [OPTIONS] CONTAINER_ID NEW_IMAGE_NAME[:TAG]
यहां, CONTAINER_ID उस कंटेनर की आईडी या नाम है जिसे आप कैप्चर करना चाहते हैं, NEW_IMAGE_NAME वह नाम है जो आप नई छवि के लिए चाहते हैं, और TAG वैकल्पिक है, डिफ़ॉल्ट latest है।
नोट: docker commit docker container commit के लिए एक लिगेसी उपनाम है; दोनों समान हैं।
docker commit कमांड कई विकल्प प्रदान करता है जो आपको मेटाडेटा जोड़ने, कॉन्फिगरेशन परिवर्तन लागू करने, और कमिट प्रक्रिया के व्यवहार को नियंत्रित करने देते हैं। नीचे दी गई तालिका सभी समर्थित विकल्पों का सारांश देती है:
| विकल्प | लॉन्ग फॉर्म | विवरण | उदाहरण |
|---|---|---|---|
| -a | --author | नई छवि मेटाडेटा में लेखक का नाम जोड़ता है। | docker commit -a "Anees" my-container my-image |
| -c | --change | नई छवि पर ENV, LABEL, या CMD जैसे Dockerfile निर्देश लागू करता है। | docker commit -c "ENV APP_ENV=prod" my-container my-image |
| -m | --message | छवि में किए गए परिवर्तनों का वर्णन करने वाला एक छोटा संदेश जोड़ता है। | docker commit -m "Installed curl" my-container my-image |
| -p | --pause | संगति सुनिश्चित करने के लिए कमिट के दौरान कंटेनर को रोकता है (डिफ़ॉल्ट: true)। | docker commit --pause=false my-container my-image |
देखें कि docker commit कैसे काम करता है
मान लीजिए आप अपने Dockerfile को पुनर्निर्माण किए बिना Alpine कंटेनर में curl इंस्टॉल करना चाहते हैं। ऐसा करने के लिए, बेस छवि से एक कंटेनर चलाएं:
docker run -it alpine:latest /bin/sh
एक बार जब आप कंटेनर में हों, तो आवश्यक परिवर्तन करें:
apk update && apk add curl
अब कंटेनर से बाहर निकलें:
exit
इसके बाद, कंटेनर को एक नई छवि के रूप में कमिट करें:
docker commit alpine-with-curl:1.0
अपनी नई छवि को सत्यापित करें:
docker images
अब, आपके पास एक नई छवि है जो कहीं भी चलने के लिए तैयार है, जिसमें curl प्री-इंस्टॉल्ड है।
अपनी नई छवि को चलाकर सहेजे गए परिवर्तनों का परीक्षण करें
अपनी नई छवि बनाने के बाद, आप यह सत्यापित करने के लिए इससे एक कंटेनर चला सकते हैं कि आपके परिवर्तन सहेजे गए हैं।
docker run -it alpine-with-curl:1.0 /bin/sh
यह कमांड alpine-with-curl:1.0 छवि पर आधारित एक कंटेनर के अंदर एक इंटरैक्टिव शेल खोलती है। अंदर जाने के बाद, आप जांच सकते हैं कि आपके संशोधन बरकरार हैं।
curl --version
यह दर्शाता है कि परिवर्तन नई छवि में स्थायी हैं।
docker commit बनाम Dockerfile: किसका उपयोग कब करें
Dockerfile और docker commit दोनों आपको Docker छवियां बनाने देते हैं, लेकिन वे बहुत अलग तरीकों से काम करते हैं और विभिन्न स्थितियों के लिए उपयुक्त हैं।
एक Dockerfile सबसे अच्छा विकल्प है जब आपको विश्वसनीय और दोहराने योग्य बिल्ड की आवश्यकता होती है, विशेष रूप से CI/CD पाइपलाइन और उत्पादन वातावरण के लिए। यह सभी परिवर्तनों को कोड में स्पष्ट रूप से परिभाषित रखता है, जिससे उन्हें समय के साथ ट्रैक करना, समीक्षा करना और संस्करण-नियंत्रित करना आसान हो जाता है। यह दृष्टिकोण सुनिश्चित करता है कि बाद में छवि बनाने वाला कोई भी व्यक्ति समान परिणाम प्राप्त करे, जो दीर्घकालिक रखरखाव और टीम सहयोग के लिए महत्वपूर्ण है।
दूसरी ओर, docker commit त्वरित सुधार, परीक्षण, या छोटे समायोजन के लिए अच्छा काम करता है जिन्हें आप संपूर्ण Dockerfile को फिर से लिखे या पुनर्निर्माण किए बिना आज़माना चाहते हैं। यह तब उपयोगी होता है जब आप प्रयोग कर रहे हों, डीबग कर रहे हों, या किसी परिवर्तन को तुरंत मान्य कर रहे हों। हालांकि, चूंकि परिवर्तनों को किसी फ़ाइल में दस्तावेज़ नहीं किया जाता है, यह विधि उत्पादन के बजाय अल्पकालिक उपयोग के लिए बेहतर अनुकूल है।
संक्षेप में, आप docker commit का उपयोग मुख्य रूप से प्रयोग या अस्थायी सुधार के लिए कर सकते हैं। उत्पादन-तैयार छवियों के लिए, हमेशा Dockerfile को प्राथमिकता दें। Docker का अधिकतम लाभ उठाने के लिए, अन्य प्रमुख कमांड का पता लगाना उचित है जो कंटेनर, छवियों और वर्कफ़्लो के साथ काम करना आसान बनाते हैं।