कोर्स
Debian पर Docker इंस्टॉल करना ऐसा काम नहीं होना चाहिए जहाँ आपको अंदाज़ा लगाना पड़े कि कौन-सा तरीका आपके सिस्टम को नहीं तोड़ेगा।
अधिकांश गाइड कई इंस्टॉलेशन विकल्प थमा देते हैं, बिना यह बताए कि किसे कब इस्तेमाल करें। नतीजतन आप Debian की रिपोजिटरी से आउटडेटेड पैकेज ले आते हैं, या इससे भी बुरा—ऐसी परमिशन त्रुटियाँ मिलती हैं जो आपको अपने ही कंटेनरों से बाहर कर देती हैं। परिणाम? एप्लिकेशन डिप्लॉय करने के बजाय आप घंटों ट्रबलशूटिंग में लगा देते हैं।
Debian का पूर्वानुमेय रिलीज़ साइकिल और चट्टान-सी स्थिरता इसे प्रोडक्शन Docker डिप्लॉयमेंट के लिए बेहतरीन बनाती है। आपको लगातार कंटेनर परफ़ॉर्मेंस मिलता है, बिना किसी अचानक सिस्टम अपडेट के जो आपकी सेटअप तोड़ दे। सिद्धांततः, सबसे पेचीदा भाग—इंस्टॉलेशन—के बाद आपको परेशानी नहीं आनी चाहिए।
इस ट्यूटोरियल में, मैं आपको चार इंस्टॉलेशन तरीकों, आवश्यक सुरक्षा सख्तीकरण, स्टोरेज कॉन्फ़िगरेशन, और ट्रबलशूटिंग चरणों से गुजारूँगा ताकि Debian पर Docker भरोसेमंद तरीके से चले।
Docker में बिल्कुल नए हैं? Docker की बुनियादी जानकारी से शुरुआत करें और फिर इंस्टॉलेशन स्टेप्स पर आएँ।
सिस्टम आवश्यकताएँ
Docker अधिकांश आधुनिक Debian सिस्टम पर चलता है, लेकिन शुरू करने से पहले कुछ चीज़ें जाँचनी होंगी। इस अनुभाग में, मैं आपको ठीक-ठीक सिस्टम आवश्यकताएँ दिखाऊँगा।
Debian 10 (Buster) या नया वर्तमान Docker संस्करणों के लिए आवश्यक है। Debian 9 जैसे पुराने रिलीज़ हालिया Docker Engine बिल्ड के साथ काम नहीं करेंगे। आपका कर्नेल संस्करण 3.10 या उससे अधिक होना चाहिए—पिछले कुछ वर्षों की अधिकांश Debian इंस्टॉलेशन यह आवश्यकता अपने आप पूरी करती हैं।
आपको root एक्सेस या sudo विशेषाधिकार चाहिए ताकि Docker पैकेज इंस्टॉल कर सकें और सिस्टम कॉन्फ़िगर कर सकें। Docker को ये कोर पैकेज भी चाहिए: apt-transport-https, ca-certificates, curl, और gnupg। अधिकांश Debian सिस्टम में ये इंस्टॉल होते हैं, लेकिन आप इसे आगे सत्यापित करेंगे।
हार्डवेयर आवश्यकताएँ न्यूनतम हैं:
- बेसिक कंटेनर वर्कलोड के लिए 2GB RAM, जबकि डेवलपमेंट वातावरण के लिए 4GB या अधिक बेहतर रहता है
- Docker इमेज और कंटेनर डेटा के लिए कम से कम 10GB खाली डिस्क स्पेस। प्रोडक्शन सेटअप को इससे कहीं अधिक की योजना बनानी चाहिए।
यदि आप GNOME डेस्कटॉप वातावरण चला रहे हैं, सुनिश्चित करें कि gnome-terminal पैकेज इंस्टॉल है। कुछ Docker प्रबंधन टूल इंटरैक्टिव कंटेनर सेशन के लिए इसकी अपेक्षा करते हैं।
शुरू करने से पहले पुराने Docker इंस्टॉलेशन हटा दें। docker, docker.io, या docker-engine जैसे लेगेसी पैकेज वर्तमान Docker Engine से टकरा सकते हैं। पुराने संस्करणों की सफाई के लिए यह कमांड चलाएँ:
sudo apt remove docker docker-engine docker.io containerd runc
आपकी फ़ायरवॉल और नेटवर्क सेटिंग्स कंटेनर नेटवर्किंग को प्रभावित कर सकती हैं। Docker अपने स्वयं के नेटवर्क इंटरफ़ेस और iptables नियम बनाता है। यदि आप UFW या कस्टम फ़ायरवॉल नियमों का उपयोग करते हैं, तो इंस्टॉलेशन के बाद कंटेनर ट्रैफ़िक की अनुमति देने के लिए उन्हें समायोजित करना पड़ सकता है।
इन आवश्यकताओं की अभी जाँच कर लें—यह आगे चलकर आपका ट्रबलशूटिंग समय बचाएगा।
इंस्टॉलेशन के तरीके
Debian पर Docker इंस्टॉल करने के चार तरीके हैं, और प्रत्येक के अपने समझौते हैं। मैं आपकी परिवेश और सुरक्षा आवश्यकताओं के अनुसार सही तरीका चुनने में मदद करूँगा।
उबंटू के लिए इंस्टॉलेशन निर्देश खोज रहे हैं? हमारे पास Ubuntu पर Docker इंस्टॉल करने की चरण-दर-चरण गाइड है।
तरीका 1: आधिकारिक Docker रिपोजिटरी (अनुशंसित)
यह तरीका आपको नियमित सुरक्षा अपडेट के साथ नवीनतम Docker संस्करण देता है।
Docker की आधिकारिक रिपोजिटरी में हमेशा सबसे नए स्थिर रिलीज़ होते हैं, और आपको अपने पैकेज मैनेजर के जरिए स्वत: अपडेट मिलते हैं। इस तरह आप पुराने संस्करणों में नहीं अटकते जो महत्वपूर्ण सुरक्षा पैच या नई सुविधाओं से वंचित हों।
सबसे पहले अपने सिस्टम को अपडेट करें और वे पैकेज इंस्टॉल करें जिनकी Docker को ज़रूरत है:
sudo apt update
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
फिर, पैकेज की प्रामाणिकता जाँचने के लिए Docker की आधिकारिक GPG कुंजी जोड़ें:
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
रिपोजिटरी को अपने sources list में जोड़कर कॉन्फ़िगर करें:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
अंत में, Docker Engine, CLI, और Compose इंस्टॉल करें:
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
यह आपको प्रोडक्शन Docker डिप्लॉयमेंट के लिए आवश्यक सब कुछ दे देता है।
तरीका 2: डिफ़ॉल्ट Debian रिपोजिटरी
यह तरीका एक कमांड में Docker इंस्टॉल कर देता है, लेकिन आपको पुराना संस्करण मिलेगा।
Debian की डिफ़ॉल्ट रिपोजिटरी इंस्टॉलेशन को सरल बनाती है—बस sudo apt install docker.io चलाएँ। लेकिन एक पेंच है: अक्सर आपको Docker के ऐसे संस्करण मिलेंगे जो मौजूदा रिलीज़ से महीनों या वर्षों पुराने हैं।
sudo apt update
sudo apt install docker.io
यह तरीका बेसिक टेस्टिंग के लिए ठीक है या तब जब आपको अनुकूलता के लिए कोई खास पुराना संस्करण चाहिए। लेकिन आप हालिया Docker रिलीज़ के साथ आने वाले सुरक्षा अपडेट, परफ़ॉर्मेंस सुधार, और नई सुविधाओं से चूक जाएँगे।
जब आधिकारिक रिपोजिटरी विकल्प न हो, तभी इस तरीके का उपयोग करें।
तरीका 3: मैनुअल DEB पैकेज इंस्टॉलेशन
जब आप रिपोजिटरी तक पहुँच नहीं पा रहे हों, तब पैकेज सीधे डाउनलोड और इंस्टॉल करने का तरीका मैं दिखाऊँगा।
यह तरीका एयर-गैप्ड सिस्टम, सख्त इंटरनेट एक्सेस वाली कॉर्पोरेट नेटवर्क, या कई मशीनों पर एक ही Docker संस्करण बार-बार डाउनलोड किए बिना इंस्टॉल करने के लिए काम आता है।
Docker की वेबसाइट से DEB पैकेज डाउनलोड करें:
-
https://download.docker.com/linux/debian/dists/पर जाएँ -
अपना Debian संस्करण चुनें (bullseye, bookworm, आदि)
-
pool/stable/amd64/पर जाएँ -
ये पैकेज डाउनलोड करें:
docker-ce_*.deb,docker-ce-cli_*.deb, औरcontainerd.io_*.deb
पैकेज इसी क्रम में इंस्टॉल करें:
sudo dpkg -i containerd.io_*.deb
sudo dpkg -i docker-ce-cli_*.deb
sudo dpkg -i docker-ce_*.deb
यदि निर्भरताओं से जुड़ी त्रुटि मिले, तो उन्हें ठीक करने के लिए sudo apt-get install -f चलाएँ।
अपडेट के लिए इस तरीके में अधिक मैनुअल काम होता है, लेकिन इससे आप कौन-सा संस्करण इंस्टॉल हो रहा है इस पर पूरा नियंत्रण पाते हैं।
तरीका 4: सुविधा स्क्रिप्ट्स
आख़िरी तरीका टेस्ट वातावरण के लिए तेज़ इंस्टॉलेशन देता है, लेकिन पहले स्क्रिप्ट का ऑडिट कर लें।
Docker ऐसी इंस्टॉलेशन स्क्रिप्ट देता है जो आपके सिस्टम का पता लगाकर स्वत: Docker इंस्टॉल कर देता है। ये टेस्ट वातावरण जल्दी तैयार करने या कई सिस्टम पर Docker सेटअप करने के समय काम आती हैं।
curl -fsSL https://get.docker.com -o get-docker.sh
स्क्रिप्ट चलाने से पहले हमेशा उसे देखें:
cat get-docker.sh
कुछ संदिग्ध या अप्रत्याशित चीज़ें तो नहीं हैं, इसे देखें। स्क्रिप्ट आपकी सिस्टम कॉन्फ़िगरेशन बदलेगी, तो आपको पता होना चाहिए कि वह क्या कर रही है।
समीक्षा के बाद स्क्रिप्ट चलाएँ:
sudo sh get-docker.sh
प्रोडक्शन में सुविधा स्क्रिप्ट्स का उपयोग न करें। ये तेज़ सेटअप के लिए बनी हैं, सुरक्षित और पुनरुत्पादन योग्य डिप्लॉयमेंट के लिए नहीं। जिन सिस्टमों की परवाह है, वहाँ आधिकारिक रिपोजिटरी वाले तरीके पर टिके रहें।
मैं अनुशंसा करता हूँ कि जब तक कोई विशिष्ट बाधा न हो, आधिकारिक रिपोजिटरी वाला तरीका ही चुनें।
अपनी इंस्टॉलेशन की जाँच
इंस्टॉलेशन तो पहला कदम है—डिप्लॉय करने से पहले आपको यह पक्का करना होगा कि Docker वास्तव में काम कर रहा है। ये त्वरित परीक्षण बताएँगे कि आपका Docker सेटअप असली वर्कलोड के लिए तैयार है या नहीं।
अपना Docker संस्करण जाँचें ताकि पुष्टि हो कि इंस्टॉलेशन पूरा हुआ:
docker --version
आपको Docker version xx.x.x, build x जैसा आउटपुट दिखेगा। यदि "command not found" त्रुटि मिले, तो Docker सही से इंस्टॉल नहीं हुआ या आपके PATH में नहीं है।
क्या-क्या चल रहा है यह देखने के लिए विस्तृत बिल्ड जानकारी लें:
docker version
यह अलग-अलग क्लाइंट और सर्वर संस्करण के साथ आर्किटेक्चर विवरण दिखाता है। सर्वर सेक्शन पुष्टि करता है कि Docker डेमन चल रहा है और सुलभ है।
एक टेस्ट कंटेनर चलाएँ ताकि एंड-टू-एंड सब कुछ सत्यापित हो जाए:
docker run hello-world
Docker hello-world इमेज डाउनलोड करेगा और उसे चलाएगा। यदि सब ठीक रहा, तो आपको एक संदेश दिखेगा जो बताता है कि Docker कंटेनर कैसे काम करते हैं। यह परीक्षण पुष्टि करता है कि Docker इमेज खींच सकता है, कंटेनर बना सकता है, और कमांड चला सकता है।
आप जाँच सकते हैं कि Docker Compose इंस्टॉल है और काम कर रहा है:
docker compose version
आपको Docker Compose version vX.xx.x जैसा आउटपुट दिखना चाहिए। ध्यान दें कि नए Docker इंस्टॉलेशन docker-compose की बजाय docker compose (बीच में स्पेस) का इस्तेमाल करते हैं।
यदि ये सभी कमांड बिना त्रुटि के चलती हैं, तो आपका Docker इंस्टॉलेशन प्रोडक्शन उपयोग के लिए तैयार है।
अपना पहला वास्तविक कंटेनर चलाने के लिए तैयार हैं? स्टेप-बाय-स्टेप Docker इमेज चलाना सीखें।
पोस्ट-इंस्टॉलेशन कॉन्फ़िगरेशन
Docker बॉक्स से बाहर काम करता है, लेकिन दैनिक उपयोग के लिए कुछ चीज़ें कॉन्फ़िगर करना चाहेंगे। इस अनुभाग में, मैं सर्विस प्रबंधन और उपयोगकर्ता अनुमतियों को कवर करूँगा जो Docker को अधिक सुविधाजनक और सुरक्षित बनाते हैं।
सर्विस मैनेजमेंट
आप इन systemd कमांड से नियंत्रित कर सकते हैं कि Docker कब चले:
sudo systemctl start docker # Start Docker
sudo systemctl stop docker # Stop Docker
sudo systemctl restart docker # Restart Docker service
जब आपका सिस्टम बूट हो तो Docker को स्वत: शुरू करने के लिए, यह चलाएँ:
sudo systemctl enable docker
यह सुनिश्चित करता है कि हर बार सर्वर रीस्टार्ट होने पर Docker चले, जो प्रोडक्शन सिस्टम के लिए वांछनीय है।
यदि आपको जाँचना है कि Docker चल रहा है या नहीं और उसकी मौजूदा स्थिति देखनी है, यह कमांड चलाएँ:
sudo systemctl status docker
आप देखेंगे कि सर्विस सक्रिय है या नहीं, कब से चल रही है, और हालिया लॉग संदेश क्या हैं। यदि Docker काम नहीं कर रहा, तो आमतौर पर यही कमांड वजह दिखा देती है।
सर्विस से जुड़ी समस्याओं को ट्रबलशूट करने के लिए लॉग देखें:
sudo journalctl -u docker.service
यह विस्तृत Docker डेमन लॉग दिखाता है, जो स्टार्टअप समस्याएँ, परमिशन त्रुटियाँ, या कॉन्फ़िगरेशन मुद्दों का निदान करने में मदद करते हैं।
नॉन-रूट यूज़र एक्सेस
यदि आपको अपने यूज़र को docker समूह में जोड़ना है ताकि sudo के बिना Docker कमांड चला सकें:
sudo usermod -aG docker $USER
यह आपके मौजूदा यूज़र को docker समूह में जोड़ता है, जिससे आपको Docker डेमन से संवाद करने की अनुमति मिलती है।
ग्रुप परिवर्तन प्रभावी करने के लिए आपको लॉग आउट कर फिर लॉग इन करना होगा:
logout
वैकल्पिक रूप से, अपना टर्मिनल सेशन रीस्टार्ट करें। आप newgrp docker भी चला सकते हैं ताकि बिना लॉग आउट किए मौजूदा सेशन में ही समूह सक्रिय हो जाए।
अंत में, नॉन-रूट एक्सेस जाँचने के लिए यह Docker कमांड चलाएँ:
docker run hello-world
यदि यह sudo के बिना काम करता है, तो सब ठीक है।
लेकिन सुरक्षा का यह समझौता याद रखें: docker समूह के यूज़र को आपके सिस्टम पर लगभग root-जैसी पहुँच मिलती है। वे होस्ट डायरेक्टरी माउंट कर सकते हैं, संवेदनशील फ़ाइलों तक पहुँच सकते हैं, और संभावित रूप से कंटेनरों से बाहर निकलकर होस्ट से समझौता कर सकते हैं।
केवल विश्वसनीय यूज़र्स को ही docker समूह में जोड़ें, और साझा सिस्टम पर जहाँ सभी यूज़र आपके नियंत्रण में नहीं हैं, ऐसा कभी न करें।
इन सेटिंग्स को एक बार कॉन्फ़िगर कर लें, Docker के साथ रोज़मर्रा का काम कहीं आसान हो जाता है।
स्टोरेज ड्राइवर कॉन्फ़िगरेशन
Docker का स्टोरेज ड्राइवर यह प्रबंधित करता है कि कंटेनर इमेज और डेटा आपके सिस्टम पर कैसे संग्रहित हों। अधिकांश यूज़र को इसे बदलने की ज़रूरत नहीं पड़ती, लेकिन अपने विकल्प समझना विशेष वर्कलोड के लिए परफ़ॉर्मेंस अनुकूल बनाने में मदद करता है।
Docker इंस्टॉलेशन के दौरान अपने आप आपके सिस्टम के लिए सर्वश्रेष्ठ स्टोरेज ड्राइवर चुनता है। Debian पर यह आम तौर पर overlay2 होता है, जो अधिकांश उपयोग मामलों के लिए उत्कृष्ट परफ़ॉर्मेंस और स्थिरता देता है।
अपना मौजूदा स्टोरेज ड्राइवर इस कमांड से जाँचें:
docker info | grep "Storage Driver"
overlay2 ड्राइवर अच्छा काम करता है क्योंकि यह:
- कॉपी-ऑन-राइट ऑपरेशन तेज़ी से संभालता है जब कंटेनर फ़ाइलें संशोधित करते हैं
- इमेज के बीच लेयर साझा करता है ताकि डिस्क स्पेस बचे
- सभी Docker फ़ीचर सपोर्ट करता है बिना अनुकूलता समस्याओं के
- भरोसेमंद तरीके से काम करता है अलग-अलग फ़ाइलसिस्टम प्रकारों पर
यदि आप विशेष वर्कलोड चला रहे हैं या आपके पास विशिष्ट फ़ाइलसिस्टम आवश्यकताएँ हैं, तो आपको अलग स्टोरेज ड्राइवर चाहिए हो सकता है।
उदाहरण के लिए, कुछ एंटरप्राइज़ स्टोरेज सिस्टम devicemapper ड्राइवर के साथ बेहतर काम करते हैं, या आपको कंटेनर फ़ाइलसिस्टम समस्याओं की डीबगिंग के लिए vfs चाहिए हो सकता है।
आप Docker के डेमन कॉन्फ़िगरेशन को संपादित करके स्टोरेज ड्राइवर बदल सकते हैं:
sudo nano /etc/docker/daemon.json
यहाँ, storage-driver सेटिंग जोड़ें या संशोधित करें:
{
"storage-driver": "devicemapper"
}
अंत में, परिवर्तन लागू करने के लिए Docker रीस्टार्ट करना याद रखें:
sudo systemctl restart docker
ध्यान रहे, स्टोरेज ड्राइवर बदलने से आपके मौजूदा कंटेनर और इमेज अप्राप्य हो जाती हैं। पहले महत्वपूर्ण डेटा का बैकअप लें, या जिन कंटेनरों को रखना है उन्हें एक्सपोर्ट करें।
अब आप नई ड्राइवर जाँचने के लिए एक इमेज पुल कर कंटेनर चला सकते हैं:
docker pull hello-world
docker run hello-world
संक्षेप में, जब तक किसी खास आवश्यकता की वजह से अलग ड्राइवर न माँगा जाए, overlay2 पर ही टिके रहें।
सुरक्षा सख्तीकरण
डिफ़ॉल्ट Docker इंस्टॉलेशन डेवलपमेंट के लिए ठीक हैं, लेकिन प्रोडक्शन वातावरण में अतिरिक्त सुरक्षा परतें चाहिए होती हैं। ये कॉन्फ़िगरेशन आपके होस्ट सिस्टम को कंटेनर ब्रेकआउट और संसाधन-खपत हमलों से बचाते हैं।
SELinux/AppArmor एकीकरण
अनिवार्य एक्सेस कंट्रोल एक सुरक्षा परत जोड़ते हैं जो यह सीमित करती है कि कंटेनर क्या कर सकते हैं, भले ही वे समझौता कर लिए गए हों। इनके बिना, रूट के रूप में चल रहा कंटेनर संभावित रूप से उन होस्ट संसाधनों तक पहुँच सकता है, जहाँ उसे नहीं जाना चाहिए।
आप Docker के लिए AppArmor सक्षम कर सकते हैं, जो Debian का डिफ़ॉल्ट सुरक्षा फ़्रेमवर्क है, इन कमांड से:
sudo apt install apparmor-utils
sudo systemctl enable apparmor
sudo systemctl start apparmor
AppArmor चलने के बाद, Docker की सुरक्षा प्रोफ़ाइल लोड करें:
sudo apparmor_parser -r /etc/apparmor.d/docker
अब आप AppArmor सुरक्षा सक्षम करके कंटेनर चला सकते हैं:
docker run --security-opt apparmor=docker-default nginx
docker-default प्रोफ़ाइल कंटेनर की क्षमताओं को सीमित करती है, जैसे फ़ाइलसिस्टम माउंट करना, रॉ नेटवर्क इंटरफ़ेस की पहुँच, और कर्नेल मॉड्यूल लोड करना।
SELinux सिस्टम के लिए (यदि आप AppArmor के बजाय इसका उपयोग कर रहे हैं), पहले कंटेनर प्रबंधन सक्षम करें:
sudo setsebool -P container_manage_cgroup on
फिर SELinux लेबल्स के साथ कंटेनर चलाएँ:
docker run --security-opt label=type:container_t nginx
ये नियंत्रण कई सामान्य कंटेनर एस्केप तकनीकों को रोकते हैं और समझौता किए गए कंटेनरों से होने वाले नुकसान को सीमित करते हैं।
डेमन कॉन्फ़िगरेशन
आप Docker डेमन सेटिंग्स को अनुकूलित कर सकते हैं (और करना चाहिए) ताकि हमले की सतह घटे और सुरक्षा स्थिति बेहतर हो। /etc/docker/daemon.json फ़ाइल बनाएँ या संपादित करें:
{
"live-restore": true,
"userland-proxy": false,
"no-new-privileges": true,
"icc": false,
"disable-legacy-registry": true
}
हर सेटिंग क्या करती है, यह रहा:
-
live-restore: trueडेमन क्रैश होने पर भी कंटेनरों को चलता रखता है -
userland-proxy: falseबेहतर परफ़ॉर्मेंस के लिए userland प्रॉक्सी की जगह सीधे iptables का उपयोग करता है -
no-new-privileges: trueकंटेनरों को नए विशेषाधिकार हासिल करने से रोकता है -
icc: falseडिफ़ॉल्ट रूप से इंटर-कंटेनर कम्युनिकेशन को निष्क्रिय करता हैdisable-legacy-registry: trueपुराने, असुरक्षित रजिस्ट्री प्रोटोकॉल तक पहुँच को रोकता है
इन परिवर्तनों के बाद, उन्हें लागू करने के लिए Docker रीस्टार्ट करें:
sudo systemctl restart docker
जहाँ संभव हो, कंटेनर को नॉन-रूट यूज़र के रूप में चलाएँ:
docker run --user 1000:1000 nginx
यह सीमित करता है कि समझौता किए गए कंटेनर आपके सिस्टम के साथ क्या कर सकते हैं।
कंट्रोल ग्रुप (cgroups) के साथ संसाधन सीमाएँ
बिना संसाधन सीमा वाले कंटेनर उपलब्ध CPU, मेमोरी और I/O सब कुछ खपा सकते हैं और अंततः पूरे होस्ट सिस्टम को नीचे ला सकते हैं। कंट्रोल ग्रुप (cgroups) सख्त सीमाएँ लागू कर इसे रोकते हैं।
शुरुआत मेमोरी सीमा से करें ताकि कंटेनर अत्यधिक RAM न खाएँ:
docker run --memory=512m nginx
आप CPU उपयोग भी सीमित कर सकते हैं ताकि कोई एक कंटेनर प्रोसेसिंग पावर पर कब्ज़ा न कर ले:
docker run --cpus=1.5 nginx
उच्च डिस्क I/O वाले सिस्टम पर, पढ़ने/लिखने की गति नियंत्रित करें:
docker run --device-read-bps /dev/sda:1mb nginx
पूर्ण संसाधन नियंत्रण के लिए आप एकाधिक सीमाएँ साथ में लगा सकते हैं:
docker run \
--memory=1g \
--cpus=2 \
--pids-limit=100 \
nginx
सभी कंटेनरों पर एकसमान सीमाएँ लागू करने के लिए, daemon.json में डिफ़ॉल्ट कॉन्फ़िगर करें:
{
"default-ulimits": {
"nofile": {
"Hard": 64000,
"Name": "nofile",
"Soft": 64000
}
}
}
ये सीमाएँ संसाधन-खपत हमलों को रोकती हैं और कंटेनरों के बीच निष्पक्ष संसाधन साझा सुनिश्चित करती हैं।
इन सुरक्षा उपायों को एक बार कॉन्फ़िगर कर लें, आपका Docker वातावरण समझौता करना कहीं कठिन हो जाएगा।
दैनिक प्रबंधन के लिए Docker कमांड्स में महारत चाहिए? ये 18 आवश्यक Docker कमांड आपकी उत्पादकता बढ़ाएँगे।
सामान्य समस्याओं का ट्रबलशूटिंग
सही इंस्टॉलेशन के बावजूद, Docker में ऐसी दिक्कतें आ सकती हैं जो कंटेनरों को सही से चलने नहीं देतीं। यहाँ सबसे आम समस्याएँ हैं और उन्हें तुरंत कैसे ठीक करें।
परमिशन त्रुटियाँ
ज्यादातर Docker परमिशन समस्याएँ इस बात पर आ टिकती हैं कि आपके यूज़र के पास Docker के सॉकेट फ़ाइल तक सही पहुँच नहीं है। जब आपको Got permission denied while trying to connect to the Docker daemon socket दिखे, तो इसका अर्थ है कि आप अभी docker समूह में शामिल नहीं हैं।
ऐसा इसलिए होता है क्योंकि Docker root के रूप में चलता है, लेकिन वह ऐसा सॉकेट बनाता है जिसे docker समूह के सदस्य एक्सेस कर सकते हैं। खुद को समूह में जोड़ें:
sudo usermod -aG docker $USER
परिवर्तन लागू करने के लिए आपको लॉग आउट कर फिर लॉग इन करना होगा। अभी लॉग आउट नहीं करना चाहते, तो मौजूदा सेशन में ही समूह सक्रिय करें:
newgrp docker
कंटेनरों के अंदर फ़ाइल परमिशन त्रुटियाँ अलग होती हैं लेकिन उतनी ही आम। ये तब होती हैं जब कंटेनर प्रक्रिया उन फ़ाइलों को पढ़/लिख नहीं पाती जिन्हें आपने अपने होस्ट सिस्टम से माउंट किया है। कंटेनर किसी ऐसे यूज़र ID के रूप में चल रहा हो सकता है जो आपकी फ़ाइलों का मालिक नहीं है।
कौन-सा यूज़र आपकी फ़ाइलों का मालिक है, जाँचें:
ls -la /path/to/your/files
अधिकांश Docker कंटेनर डिफ़ॉल्ट रूप से यूज़र ID 1000 के रूप में चलते हैं। यदि आपकी फ़ाइलें root या किसी अन्य यूज़र की हैं, तो ओनरशिप बदलें:
sudo chown -R 1000:1000 /path/to/your/files
यदि आप AppArmor की बजाय SELinux चला रहे हैं, तो आपको अलग तरह की परमिशन डिनायल दिख सकती हैं जो ऑडिट लॉग में दर्ज होती हैं। ये अधिक जटिल होती हैं क्योंकि SELinux यूज़र ID के बजाय सुरक्षा संदर्भों के आधार पर नियंत्रित करता है कि प्रक्रियाएँ कहाँ पहुँच सकती हैं।
हालिया एक्सेस उल्लंघन ढूँढें:
sudo ausearch -m avc -ts recent
Docker वॉल्यूम पर उचित लेबल बहाल कर और कंटेनर प्रबंधन सक्षम कर SELinux संदर्भ ठीक करें:
sudo setsebool -P container_manage_cgroup on
sudo restorecon -R /path/to/your/volume
सर्विस फेल्योर
जब Docker शुरू नहीं होता या बार-बार क्रैश करता है, तो उसे ठीक करने से पहले यह समझना ज़रूरी है कि विफल क्या हो रहा है। systemd सर्विस स्टेटस आपको त्वरित ओवरव्यू देता है:
sudo systemctl status docker
यह दिखाता है कि Docker चल रहा है या नहीं और हालिया त्रुटि संदेश क्या हैं। लेकिन विस्तृत ट्रबलशूटिंग के लिए, Docker के शुरू होने की कोशिश के दौरान लाइव लॉग देखें:
sudo journalctl -u docker.service -f
एक आम स्टार्टअप फेल्योर तब होता है जब Docker साफ़-सुथरे ढंग से बंद नहीं हुआ। आपको ऐसा एरर दिखेगा: "failed to start daemon: pid file found, ensure docker is not running." इसका मतलब है कि कोई बची-खुची प्रोसेस फ़ाइल स्टार्टअप स्क्रिप्ट को भ्रमित कर रही है।
बासी फ़ाइल हटाएँ और फिर से शुरू करने की कोशिश करें:
sudo rm /var/run/docker.pid
sudo systemctl start docker
स्टोरेज समस्याएँ डेमन फेल्योर का एक और सामान्य कारण हैं। Docker अपना सारा डेटा /var/lib/docker में रखता है, और यदि यह डायरेक्टरी स्पेस से बाहर हो जाए या करप्ट हो जाए, तो Docker ठीक से शुरू नहीं हो पाएगा।
कितनी जगह उपलब्ध है, जाँचें:
df -h /var/lib/docker
यदि स्पेस कम है, तो पुराने कंटेनर और इमेज हटा दें जिनका आप उपयोग नहीं कर रहे:
docker system prune -a
नेटवर्क संघर्ष भी Docker को शुरू होने से रोक सकते हैं। ऐसा तब होता है जब Docker का डिफ़ॉल्ट ब्रिज नेटवर्क (आमतौर पर 172.17.0.0/16) आपके मौजूदा नेटवर्क सेटअप से टकरा जाता है। आपको एड्रेस रेंज उपलब्ध न होने से जुड़े एरर दिखेंगे।
इसे किसी ऐसे कस्टम ब्रिज IP को कॉन्फ़िगर कर ठीक करें जो आपके नेटवर्क से टकराता न हो। /etc/docker/daemon.json संपादित करें:
{
"bip": "192.168.1.1/24"
}
परिवर्तन के बाद, नया नेटवर्क कॉन्फ़िगरेशन उपयोग करने के लिए Docker रीस्टार्ट करें:
sudo systemctl restart docker
पुराने कर्नेल से जुड़ी समस्याएँ
Docker कंटेनरीकरण, नेटवर्किंग और सुरक्षा के लिए Linux कर्नेल फ़ीचर पर निर्भर करता है। यदि आपका कर्नेल बहुत पुराना है, तो ऐसी समस्याएँ मिलेंगी जिन्हें अपग्रेड किए बिना ठीक नहीं किया जा सकता।
आप कौन-सा कर्नेल संस्करण चला रहे हैं, यह कमांड चलाकर जाँचें:
uname -r
बेसिक कार्यक्षमता के लिए Docker को कम से कम 3.10 कर्नेल चाहिए, लेकिन प्रोडक्शन उपयोग के लिए वास्तव में 4.0 या नया बेहतर है। 3.10 से पुराना कुछ भी आधुनिक Docker संस्करणों के साथ काम नहीं करेगा।
Debian पर कर्नेल को अपडेट करना आसान है, बस नवीनतम कर्नेल पैकेज इंस्टॉल करें:
sudo apt update
sudo apt install linux-image-amd64
नया कर्नेल तब तक सक्रिय नहीं होगा जब तक आप सिस्टम रीबूट नहीं कर लेते:
sudo reboot
कभी-कभी कर्नेल नया तो होता है, लेकिन कुछ कर्नेल मॉड्यूल लोड नहीं होते। Docker को नेटवर्किंग और कंटेनरीकरण फ़ीचर के लिए विशिष्ट मॉड्यूल चाहिए। आपको नेटवर्क इंटरफ़ेस उपलब्ध न होने या कंटेनर ठीक से शुरू न होने जैसे एरर दिखेंगे।
आवश्यक मॉड्यूल मैन्युअली लोड करें:
sudo modprobe bridge
sudo modprobe ip_tables
sudo modprobe iptable_nat
ये मॉड्यूल स्वत: लोड हो जाने चाहिए, लेकिन यदि नहीं होते, तो उन्हें स्थायी बनाने के लिए अपनी सिस्टम कॉन्फ़िगरेशन में जोड़ दें:
echo "bridge" | sudo tee -a /etc/modules
echo "ip_tables" | sudo tee -a /etc/modules
echo "iptable_nat" | sudo tee -a /etc/modules
ताज़ा कर्नेल होने पर भी, आपको कभी-कभी "operation not supported" जैसे कंटेनर रनटाइम एरर मिल सकते हैं। आम तौर पर इसका मतलब है कि आपका कर्नेल कुछ ऐसे फ़ीचर के बिना कंपाइल हुआ है जिनकी Docker अपेक्षा करता है। दुर्भाग्यवश, गायब कर्नेल फ़ीचर के लिए कोई वर्कअराउंड नहीं—आपको सही तरीके से कॉन्फ़िगर किया हुआ कर्नेल चाहिए।
अधिकांश Docker इंस्टॉलेशन समस्याएँ इन्हीं तीन क्षेत्रों तक सिमटती हैं: यूज़र परमिशन, सर्विस कॉन्फ़िगरेशन, या कर्नेल अनुकूलता। लक्षणों को घुमाने के बजाय मूल समस्या ठीक करें, आपका Docker वातावरण अधिक स्थिर होगा।
कंटेनरों में डेटाबेस के साथ काम कर रहे हैं? Docker में PostgreSQL कॉन्फ़िगरेशन आपकी सोच से आसान है।
Docker अनइंस्टॉल करना
कभी-कभी आपको अपने सिस्टम से Docker को पूरी तरह हटाने की ज़रूरत होती है—चाहे आप किसी और कंटेनर रनटाइम पर स्विच कर रहे हों या कॉन्फ़िगरेशन समस्याओं के बाद नया सिरे से शुरुआत करना चाहते हों।
यह प्रक्रिया केवल पैकेज हटाने से बढ़कर है—आप डेटा और सिस्टम परिवर्तनों की सफाई भी करना चाहेंगे।
शुरुआत अपने सिस्टम से सभी Docker पैकेज हटाने से करें। सटीक कमांड इस पर निर्भर करेगा कि आपने Docker मूल रूप से कैसे इंस्टॉल किया था।
यदि आपने आधिकारिक Docker रिपोजिटरी से इंस्टॉल किया था:
sudo apt purge docker-ce docker-ce-cli containerd.io docker-compose-plugin
यदि आपने Debian की डिफ़ॉल्ट रिपोजिटरी से इंस्टॉल किया था:
sudo apt purge docker.io docker-compose
यह पैकेजों को हटा देता है, लेकिन वे कॉन्फ़िगरेशन फ़ाइलें और निर्भरताएँ छोड़ देता है जिनकी अन्य पैकेजों को अभी भी आवश्यकता हो सकती है। उन्हें भी हटाने के लिए:
sudo apt autoremove --purge
इसके बाद, Docker की डेटा निर्देशिका हटाएँ यदि आप सभी इमेज, कंटेनर और वॉल्यूम हटाना चाहते हैं। यह चरण वैकल्पिक है, लेकिन पूर्ण सफ़ाई के लिए अनुशंसित है।
डिफ़ॉल्ट रूप से Docker सब कुछ /var/lib/docker में संग्रहीत करता है। इस निर्देशिका को हटाने से आपके सभी कंटेनर, इमेज, नेटवर्क और वॉल्यूम स्थायी रूप से हट जाते हैं:
sudo rm -rf /var/lib/docker
आपको Docker की कॉन्फ़िगरेशन निर्देशिका भी हटानी चाहिए:
sudo rm -rf /etc/docker
आगे बढ़ें और सिस्टम समूहों और उपयोगकर्ताओं की सफ़ाई करें जिन्हें Docker ने इंस्टॉलेशन के दौरान बनाया था। Docker आपके सिस्टम में एक docker समूह जोड़ता है और उपयोगकर्ता अनुमतियों में बदलाव कर सकता है।
docker समूह हटाएँ:
sudo groupdel docker
यदि आपने उपयोगकर्ताओं को docker समूह में जोड़ा है, तो समूह हटाने पर उनकी सदस्यता अपने-आप साफ़ हो जाएगी। लेकिन आप इसे हटाने से पहले विशिष्ट उपयोगकर्ताओं को समूह से मैन्युअल रूप से भी हटा सकते हैं:
sudo gpasswd -d username docker
फिर, Docker की systemd सेवा फ़ाइलें और सॉकिट फ़ाइलें हटाएँ:
sudo rm -f /lib/systemd/system/docker.service
sudo rm -f /lib/systemd/system/docker.socket
sudo systemctl daemon-reload
अंत में, शेष चल रहे Docker प्रोसेस जाँचें जो अभी भी सक्रिय हो सकते हैं:
ps aux | grep docker
यदि कोई मिले, तो उन्हें मैन्युअल रूप से रोकें:
sudo pkill -f docker
इन चरणों के बाद, Docker आपके सिस्टम से पूरी तरह हट जाना चाहिए और कोई फ़ाइल या कॉन्फ़िगरेशन शेष नहीं रहना चाहिए।
Docker के विकल्पों पर विचार कर रहे हैं? स्विच करने से पहले अन्य कंटेनरीकरण प्लेटफ़ॉर्म देखें।
निष्कर्ष और सर्वोत्तम प्रथाएँ
अब आपके Debian पर Docker चल रहा है, पर इंस्टॉलेशन तो बस शुरुआत है। आप अपना Docker वातावरण कैसे कॉन्फ़िगर और मेंटेन करते हैं, यही तय करता है कि आपका प्रोडक्शन अनुभव सुचारू रहेगा या आप रातों को कंटेनर समस्याओं का समाधान करते रहेंगे।
विभिन्न स्थापत्यों के लिए मल्टी-प्लेटफ़ॉर्म कंटेनर बना रहे हैं? Docker Buildx क्रॉस-प्लेटफ़ॉर्म बिल्ड को सरल बनाता है।
अपनी बाधाओं के आधार पर इंस्टॉलेशन विधि चुनें। अधिकांश प्रोडक्शन वातावरण के लिए आधिकारिक Docker रिपोजिटरी सर्वोत्तम है क्योंकि इससे आपको नवीनतम फ़ीचर और सुरक्षा पैच मिलते हैं। लेकिन एयर-गैप्ड नेटवर्क या वर्शन संगति आवश्यकताओं के कारण आपको इसके बजाय मैन्युअल DEB इंस्टॉलेशन की ज़रूरत पड़ सकती है।
अपने Docker वातावरण को तुरंत सुरक्षित करें। अनिवार्य ऐक्सेस कंट्रोल के लिए AppArmor या SELinux सक्षम करें, प्रतिबंधात्मक डेमॉन सेटिंग्स कॉन्फ़िगर करें, और कंटेनर संसाधनों को सीमित करने के लिए cgroups का उपयोग करें। Docker को स्वत: सुरक्षा अद्यतनों के साथ अपडेट रखें, लेकिन पहले उन्हें स्टेजिंग में टेस्ट करें।
मल्टी-कंटेनर एप्लिकेशनों के लिए Docker Compose का उपयोग करें। जटिल docker run कमांड प्रबंधित करने के बजाय, अपनी एप्लिकेशन स्टैक को YAML में परिभाषित करें।
डिस्क उपयोग की निगरानी करें और नियमित रूप से सफ़ाई करें। अप्रयुक्त इमेज हटाने के लिए docker system prune चलाएँ और लॉग रोटेशन सेट करें ताकि कंटेनर आपकी डिस्क न भर दें।
जब आपको और विस्तृत जानकारी चाहिए, तो आधिकारिक दस्तावेज़ीकरण उन उन्नत विषयों को कवर करता है जिन्हें यह गाइड नहीं छूती। नेटवर्किंग, स्टोरेज ड्राइवर और ऑर्केस्ट्रेशन में गहराई से जानने के लिए Docker प्रलेखन देखें। Debian Docker पैकेज प्रलेखन पैकेज-विशिष्ट कॉन्फ़िगरेशन और ज्ञात समस्याएँ समझाता है।
Debian पर Docker आपको कंटेनरीकृत एप्लिकेशनों के लिए एक स्थिर, शक्तिशाली प्लेटफ़ॉर्म देता है — लेकिन तभी, जब आप इसे सोच-समझकर कॉन्फ़िगर करें और निरंतर मेंटेन रखें।
Docker, कंटेनरीकरण, और डेटा साइंस व मशीन लर्निंग में इसके उपयोग के बारे में अधिक सीखना चाहते हैं? ये DataCamp कोर्स आपके लिए अगला सर्वश्रेष्ठ पड़ाव हैं:
FAQs
प्रोडक्शन उपयोग के लिए Debian पर Docker इंस्टॉल करने का सबसे अच्छा तरीका क्या है?
प्रोडक्शन वातावरण के लिए आधिकारिक Docker रिपोजिटरी विधि सबसे अच्छा विकल्प है क्योंकि यह नवीनतम स्थिर रिलीज़ नियमित सुरक्षा अपडेट के साथ प्रदान करती है। इस विधि से आपको वे सभी नए फ़ीचर और अहम पैच मिलते हैं जो Debian की डिफ़ॉल्ट रिपोजिटरी में उपलब्ध न हों। आप अपने पैकेज मैनेजर के माध्यम से स्वत: अपडेट का लाभ भी उठाते हैं, जिससे बिना मैन्युअल हस्तक्षेप के आपकी Docker इंस्टॉलेशन सुरक्षित रहती है।
Debian पर Docker चलाते समय क्या मुझे सुरक्षा को लेकर चिंतित होना चाहिए?
हाँ, Docker सुरक्षा के लिए बेसिक इंस्टॉलेशन से आगे सोच-समझकर कॉन्फ़िगरेशन करना ज़रूरी है। कंटेनर होस्ट कर्नेल साझा करते हैं, इसलिए यदि कंटेनर से समझौता होता है और उसे ठीक से आइसोलेट नहीं किया गया है, तो वह होस्ट संसाधनों तक पहुँच सकता है। आपको अनिवार्य ऐक्सेस कंट्रोल के लिए AppArmor या SELinux सक्षम करना चाहिए, cgroups से संसाधन सीमाएँ कॉन्फ़िगर करनी चाहिए, और जहाँ संभव हो कंटेनर को non-root उपयोगकर्ता के रूप में चलाना चाहिए। इसके अलावा, Docker को अद्यतन रखें और केवल अत्यावश्यक होने पर ही उपयोगकर्ताओं को docker समूह में जोड़ें, क्योंकि इससे उन्हें रूट-समतुल्य सिस्टम ऐक्सेस मिल जाता है।
क्या मैं Debian के पुराने संस्करणों पर Docker चला सकता/सकती हूँ?
वर्तमान Docker Engine संस्करणों के लिए Docker को Debian 10 (Buster) या नया चाहिए। Debian 9 जैसे पुराने रिलीज़ में वे आवश्यक कर्नेल फ़ीचर और पैकेज निर्भरताएँ नहीं हैं जो आधुनिक Docker को चाहिए। यदि आप पुराने Debian संस्करण पर अटके हैं, तो आपको पहले अपना सिस्टम अपग्रेड करना होगा, क्योंकि कंटेनरीकरण और नेटवर्किंग के लिए Docker जिस कर्नेल फ़ंक्शनलिटी पर निर्भर है, उसके अभाव का कोई विश्वसनीय समाधान नहीं है।
इंस्टॉलेशन के बाद Docker शुरू होने में क्यों विफल रहता है, और डेमॉन समस्याएँ कैसे ठीक करूँ?
Docker डेमॉन विफलताएँ आमतौर पर तीन मुख्य कारणों से होती हैं: स्टोरेज समस्याएँ, नेटवर्क संघर्ष, या पिछले इंस्टॉलेशन से बचे हुए प्रोसेस फ़ाइलें। /var/lib/docker में पर्याप्त डिस्क स्पेस है या नहीं, यह df -h /var/lib/docker से जाँचें, और आवश्यकता हो तो docker system prune -a से सफ़ाई करें। नेटवर्क संघर्ष के लिए, Docker का डिफ़ॉल्ट ब्रिज IP (172.17.0.0/16) आपके मौजूदा नेटवर्क सेटअप से टकरा सकता है, ऐसे में आपको /etc/docker/daemon.json में कस्टम ब्रिज IP कॉन्फ़िगर करना होगा। यदि "pid file found" जैसी त्रुटियाँ दिखें, तो sudo rm /var/run/docker.pid से स्टेल फ़ाइल हटाएँ और सेवा को पुनः आरंभ करें।
मैं अपने Debian सिस्टम से Docker और उसका सारा डेटा ठीक तरह से कैसे हटाऊँ?
Docker को पूरी तरह हटाने के लिए केवल पैकेज अनइंस्टॉल करना पर्याप्त नहीं है — आपको डेटा निर्देशिकाएँ, सिस्टम समूह और सेवा फ़ाइलें भी साफ़ करनी होंगी। शुरुआत करें sudo apt purge docker-ce docker-ce-cli containerd.io docker-compose-plugin से Docker पैकेज पर्ज करके, फिर sudo rm -rf /var/lib/docker से डेटा निर्देशिका हटाएँ (यह सभी कंटेनर और इमेज स्थायी रूप से हटाता है)। sudo groupdel docker से docker समूह हटाएँ, systemd सेवा फ़ाइलें हटाएँ, और ps aux | grep docker से बचे हुए किसी भी Docker प्रोसेस की जाँच करें। यदि आपको दोबारा इंस्टॉल करना हो या किसी अन्य कंटेनर रनटाइम पर स्विच करना हो, तो यह एक साफ़ सलेट सुनिश्चित करता है।
