मैंने मज़े के लिए अपना खुद का कंटेनर रनटाइम बनाने का फैसला किया, और हालांकि मैं अभी शुरुआती चरण में हूँ, मैंने सीखा है कि Docker अजीब है। यहाँ Docker के बारे में कुछ अजीब बातें हैं जो मैंने सीखीं।
कंटेनर वास्तविक नहीं हैं। VM के विपरीत, कंटेनर केवल विशेष प्रतिबंधों वाली प्रक्रियाएँ हैं। आपका कर्नल अभी भी उस प्रक्रिया को चला रहा है, और आप उसे /proc में पा सकते हैं। कोई एक Linux कंटेनर फीचर नहीं है — कंटेनर वास्तव में एक ट्रेंचकोट में 5 अलग-अलग Linux कर्नल फीचर हैं। Namespaces छिपाते हैं कि होस्ट और कंटेनर क्या देख सकते हैं, cgroups संसाधन उपयोग को सीमित करते हैं, और नेटवर्किंग का जादू कंटेनर के नेटवर्क को अलग करता है।
Images केवल फ़ोल्डर हैं। Docker उन्हें कहीं रखता है और chroot (या pivot_root) को कॉल करता है ताकि वह फ़ोल्डर आपके कंटेनर की नई रूट डायरेक्टरी बन जाए। Go कंटेनर रनटाइम के लिए एक तरह से बुरी भाषा है। Docker का रनटाइम, runc, Go में लिखा गया है, और Go के डिज़ाइन विकल्प इसे कम उपयुक्त बनाते हैं। Go का रनटाइम मूल रूप से मल्टी-थ्रेडेड है, लेकिन कई Linux syscalls को सिंगल-थ्रेडेड वातावरण की आवश्यकता होती है, इसलिए runc में एक C मॉड्यूल है जो Go के इनिशियलाइज़ होने से पहले चलता है। Go में fork भी नहीं है, इसलिए runc fork का अनुमान लगाने के लिए /proc/self/exe को exec करता है।
Docker को root की आवश्यकता होती है। Linux कर्नल के कई APIs को root चाहिए, इसलिए Docker डेमन आमतौर पर root के रूप में चलता है। Rootless रनटाइम को पूरे नेटवर्किंग स्टैक को यूज़रस्पेस में फिर से लागू करना पड़ सकता है। सीखना मज़ेदार है! किसी ऐसे टूल का अपना संस्करण लिखना जिसका आप उपयोग करते हैं, उसके बारे में सीखने का एक शानदार तरीका है।
स्रोत: Hacker News · HeadlinesBriefing द्वारा सारांशित