लगभग 100 लाइनों की Bash में लागू Docker, Bocker (2015)
(github.com/p8952)- Bocker एक ऐसा प्रोजेक्ट है जिसने Docker को लगभग 100 लाइनों की Bash में लागू किया है; यह image pull, container run, logs देखना, commit और delete जैसे Docker-जैसे flow देता है
- चलाने के लिए btrfs-progs, curl, iproute2, iptables, libcgroup-tools, util-linux 2.25.2 या उससे नया, coreutils 7.5 या उससे नया चाहिए; साथ ही
/var/bockerके नीचे btrfs filesystem औरbridge0network configuration की जरूरत होती है - README का उदाहरण
centos:7image pull करने के बाद container में command चलाने,yum install -y wgetके परिणाम को commit करने और बाद की execution में/usr/bin/wgetकी पुष्टि करने का flow दिखाता है - Bocker root के रूप में चलता है और network interfaces, routing table और firewall rules बदलता है, इसलिए इसे virtual machine में चलाने की सलाह दी जाती है; system damage की संभावना को लेकर कोई guarantee नहीं है
- फिलहाल इसमें
docker pull,images,ps,run,exec,logs,commit,rm/rmi, networking और CGroups-based quota लागू हैं, लेकिन data volumes, data volume containers और port forwarding अभी लागू नहीं हैं
Bocker का उद्देश्य और scope
- Bocker Docker को लगभग 100 लाइनों की Bash में लागू करने वाला प्रोजेक्ट है
- README Bash-based तरीके से Docker-जैसा command flow दिखाता है, जिसमें image management, container execution, log viewing, changes commit करना और resource limits जैसी functionalities शामिल हैं
चलाने की requirements
- चलाने के लिए जरूरी packages ये हैं
-
btrfs-progs
- curl
- iproute2
- iptables
- libcgroup-tools
- util-linux 2.25.2 या उससे नया
- coreutils 7.5 या उससे नया
- ज्यादातर distributions में पर्याप्त नया util-linux शामिल नहीं होता, इसलिए util-linux 2.25 source लेकर खुद compile करने की संभावना हो सकती है
- system में नीचे दी गई configuration चाहिए
/var/bockerके नीचे mounted btrfs filesystembridge0नाम का network bridge और10.0.0.1/24IP/proc/sys/net/ipv4/ip_forwardमें IP forwarding enabledbridge0से physical interface तक traffic route करने वाली firewall settings- जरूरी environment आसानी से बनाने के लिए Vagrantfile शामिल है
-
चलाते समय सावधानियां
- requirements पूरी होने पर भी Bocker को virtual machine में चलाने की सलाह दी जाती है
- Bocker root के रूप में चलता है और नीचे दी गई चीजों को बदलना पड़ता है
- network interfaces
- routing table
- firewall rules
- README साफ कहता है कि Bocker system को नुकसान नहीं पहुंचाएगा, इसकी guarantee नहीं दी जा सकती
example usage flow
bocker pull centos 7सेcentos:7image लाने परimg_42150जैसा image ID बनता हैbocker imagesimage ID और source दिखाता है- example output:
img_42150,centos:7
- example output:
bocker run img_42150 cat /etc/centos-releasecontainer में CentOS release information output करता है- example output:
CentOS Linux release 7.1.1503 (Core)
- example output:
bocker psचलाए गए container ID और command दिखाता हैbocker logs ps_42045उस container के output logs दिखाता हैbocker rm ps_42045container को remove करता हैbocker run img_42150 which wgetचलाने पर शुरुआत में यह result आता है किwgetमौजूद नहीं हैbocker run img_42150 yum install -y wgetसेwgetinstall करने के बाद,bocker commit ps_42018 img_42150से changes को image में reflect किया जाता है- इसके बाद
bocker run img_42150 which wget/usr/bin/wgetoutput करता है
resource limits और CGroups
- Bocker execution example दिखाता है कि container CGroups के नीचे रखा जाता है
/proc/1/cgroupमेंmemory:/ps_42152,cpuacct,cpu:/ps_42152जैसी entries दिखती हैं
- default CPU share और memory limit के example ये हैं
/sys/fs/cgroup/cpu/ps_42152/cpu.shares:512/sys/fs/cgroup/memory/ps_42152/memory.limit_in_bytes:512000000
- environment variables से resource limits बदली जा सकती हैं
BOCKER_CPU_SHARE=1024BOCKER_MEM_LIMIT=1024
- बदलाव के बाद example ये values दिखाता है
- CPU shares:
1024 - memory limit:
1024000000
- CPU shares:
लागू और未लागू features
- फिलहाल लागू features ये हैं
docker build†docker pulldocker imagesdocker psdocker rundocker execdocker logsdocker commitdocker rm/docker rmi-
Networking
- Quota Support / CGroups
- †
bocker initdocker buildका बहुत सीमित implementation देता है - अभी तक लागू नहीं हुए features ये हैं
- Data Volume Containers
- Data Volumes
- Port Forwarding
license
- Bocker GNU General Public License की शर्तों के तहत redistribute और modify किया जा सकने वाला free software है
- license version के रूप में Free Software Foundation द्वारा प्रकाशित GPL v3 या उसके बाद का version चुना जा सकता है
- program उपयोगी होने की उम्मीद से distribute किया जाता है, लेकिन merchantability या किसी specific purpose के लिए fitness की implied warranty भी नहीं है
1 टिप्पणियां
Hacker News की राय
मैंने
prootके साथ कुछ ऐसा ही बनाया था, उसका नाम Bag [1] था, और शायद मैंने उसे Docker का विकल्प नहीं बताया होताउसका
cgroupsसे कोई लेना-देना नहीं था, और command-line interface भी Docker से अलग था। पृष्ठभूमि यह थी कि इंटरनेट censorship और deep packet inspection को बायपास करने के लिए एक proxy chain बनानी थी जो सामान्य HTML traffic जैसी दिखे, और उसे हर जगह लगातार चलना था, लेकिन मैं उसे Android native app में port नहीं करना चाहता थामैं इसे Termux में चलाना चाहता था, लेकिन उस समय Termux में JDK/JRE नहीं था, और
prootसे Arch Linux environment चलाने पर JDK इस्तेमाल किया जा सकता था। Termux के अंदर का Arch environment कुल मिलाकर अधिक उपयोगी था, और अलग-अलग configuration वाले one-off environment बनाना और मिटाना, फिरprootमें जाकर सिर्फ एक command चलाना भी script से आसानी से automate हो जाता था। इसलिए shipping container से कहीं छोटे रूप के अर्थ में इसका नामbag.shरखामज़ेदार बात यह है कि
bag.shमें 5 साल से बिना छुआ पड़ा roadmap/TODO भी अभी तक है। मोबाइल स्क्रीन पर लिखने की वजह से, बिना scroll किए देखने के लिए इसका ज़्यादातर हिस्सा 40-column line wrapping में है[1]: https://github.com/hkoosha/bag
chrootऔरdeb-bootstrapका इस्तेमाल किया औरmakeselfसे installer बनाया/optके अंदर ज़रूरी software और MySQL जैसी dependencies के साथ एक छोटा Debian बनाया था, और वह काफ़ी अच्छा चला, इतना कि इसे बनवाने वाली कंपनी के लगभग 2016 में acquire होने तक इसका इस्तेमाल होता रहा। ज़्यादा सामान्य रूप से, किसी बड़े application का एक rough version खुद implement करना उसकी अंदरूनी कार्यप्रणाली सीखने के सबसे अच्छे तरीकों में से एक हैshellcheckचला कर देखना अच्छा रहेगाmkdir -p $(dirname "$2")अगर इसे लगभग 10-इंच के ऐसे Bluetooth keyboard के साथ जोड़ें जो leather jacket की अंदरूनी जेब में आराम से आ जाए, तो बिना बैग के घर से निकलकर पास के किसी खाली beer garden के कोने में बैठकर code लिखा जा सकता है। हैरानी की बात है कि यह काफ़ी productive भी है, शायद इसलिए कि laptop की तुलना में सामान्य distractions की ओर मुड़ने में थोड़ा अधिक friction होता है, तो आप beer की चुस्की लेते हुए कोड को देखते रहते हैं
मुझे ऐसी चीज़ें पसंद हैं। minimal Bash से बनी चीज़ें मुझे हमेशा पसंद रही हैं
लगभग 10 साल पहले Docker, Mesos जैसी distributed infrastructure को प्रचारित करने के लिए आयोजित किए गए एक hackathon में बनाया गया 40-line Bash का cluster-internal load balancer proof of concept भी है: https://github.com/cell-os/metal-cell/blob/master/discovery/...
शायद अब खो गया हो, लेकिन reverse SSH tunnel पर आधारित, redundancy और distribution वाला colo-to-cloud transfer tool भी था। Shell Fu जैसी साइटों पर ऐसे संग्रह अच्छी तरह व्यवस्थित हैं: https://www.shell-fu.org/
Docker का इतना बड़ा हिस्सा इतनी सरलता से फिर से implement किया जा सकता है, यही Docker कंपनी की सबसे बड़ी समस्या थी और अब भी है। मूल रूप से यह kernel features को जोड़ने वाला glue code ही है
Docker जहाँ वास्तव में value जोड़ता है, वह सिर्फ Docker Hub नहीं बल्कि Docker for Windows और Mac है। development machine पर Docker चलाने के लिए खुद VirtualBox और Vagrant से जूझने की तुलना में integrated experience बहुत बेहतर है
व्यक्तिगत रूप से मुझे लगता है कि Docker का असली जादू Docker/OCI image format था। यह caching और container image distribution को शानदार ढंग से संभालता है, और अब भी “full” VM और workflow के बीच अंतर करने वाली मुख्य चीज़ है
Windows में WSL के अंदर Docker इस्तेमाल किया जा सकता है और वह बहुत अच्छा चलता है। समझना मुश्किल है कि फिर Docker Desktop क्यों इस्तेमाल करें
उसकी जगह उन्होंने अधपका Docker Swarm बनाया, जो भरोसेमंद तरीके से ठीक से चलता भी नहीं था, और जल्दी ही Kubernetes से पीछे रह गया
मैंने इसे कुछ साल पहले सिर्फ इस काम के लिए इस्तेमाल किया था कि किसी दूसरे व्यक्ति का virtual build environment लेकर software build किया जा सके
रिपॉज़िटरी में “अभी तक implement नहीं किया गया”, “TODO”, “काम जारी है” जैसे वाक्य हैं, लेकिन आख़िरी commit कई साल पहले का है, यह अच्छा लगता है
इससे अपने code में इधर-उधर बिखेरे हुए TODOs को फिर से जाकर न देखने को लेकर थोड़ा सुकून मिलता है। लेखक को नीचा दिखाने की बात नहीं, बस तसल्ली मिलती है
अगर unpaid, volunteer, hobby code में सिर्फ़ public होने की वजह से करना ही चाहिए वाला दबाव महसूस हो, तो coding कम मज़ेदार हो जाती है, और जो code वरना public किया जाता, वह भी शायद public न किया जाए
अगर हमेशा अगला idea मौजूद है, तो परिभाषा के मुताबिक़ अधूरे TODO भी हमेशा बचे रहेंगे। वास्तव में सभी projects की सामान्य स्थिति ऐसी ही होनी चाहिए
scope की सीमाएँ साफ़ रखना पूरी तरह ठीक है और अक्सर मददगार भी होता है। इससे project किसी भटकाव का पीछा करते-करते हमेशा “पूरा नहीं हुआ” जैसा महसूस नहीं होता
हैरानी है कि lazydocker का ज़िक्र अभी तक Docker Desktop के एक शानदार alternative के रूप में नहीं हुआ। यह Linux/macOS/Windows पर चल सकता है [1]
यह काफ़ी feature-rich terminal UI है, और इसका एक फ़ायदा यह भी है कि इसे SSH के ज़रिए चलाया जा सकता है
[1] https://github.com/jesseduffield/lazydocker
कम से कम मैंने ऐसा पहली बार देखा है। यह भी जिज्ञासा है कि क्या ऐसे ads GitHub की terms of service या acceptable use policy के तहत allowed हैं
सोचता हूँ Bocker इतनी बार front page पर क्यों आ जाता है। क्या 2024 में भी Docker इतना controversial है?
समझ नहीं आता लोग यह क्यों नहीं मानते कि Docker ने वाक़ई उपयोगी चीज़ें दीं, ख़ासकर software deployment और “कहीं भी आसानी से चलाओ” जैसी सुविधा
Docker पहले से मौजूद kernel technologies का एक संयोजन है। namespaces, cgroups, union file systems, और शायद कुछ और चीज़ें
इसलिए यह दिलचस्प है, और सच कहें तो यह लगभग एकदम सही HN-स्टाइल कहानी है
कुछ लोगों को demo देने के बाद ही मुझे एहसास हुआ कि वे बस
/का इस्तेमाल कर सकते थे, या फिर मैं Docker ही ले आता तो भी काम हो जाताइसी तरह का एक और प्रोजेक्ट https://bastillebsd.org/ है
Bastille, shell का उपयोग करके Docker जैसी कई संरचनाओं के साथ FreeBSD jail को manage करता है। इसकी dependencies बहुत कम हैं, इसलिए BSD के दूसरे jail management software की तुलना में मुझे यह ज़्यादा पसंद है
बस, CLI/TUI-आधारित tool होने के बावजूद यह लगभग “अधिकतम अति” वाला समाधान है। इन दिनों मैं FreeBSD की default configuration भर से jail बनाने और manage करने की प्रक्रिया से गुज़र रहा हूँ, लेकिन यह सिर्फ़ एक अस्थायी चरण है
जब तक पूरी चीज़ मेरे दिमाग़ में इतना बैठ न जाए कि debugging को लेकर आत्मविश्वास आ जाए, तब तक ऐसा करूँगा; उसके बाद समझदार इंसान की तरह पत्थर टकराना बंद करके किसी higher-level tool पर वापस लौटने का इरादा है
लेकिन इसका नाम Bastille क्यों है, यह समझने में मुझे थोड़ा समय लगा। La Bastille सौ वर्षीय युद्ध के दौरान अंग्रेज़ों के हमलों से Paris की रक्षा के लिए बनाया गया एक क़िला था, और बाद में उसे जेल में बदल दिया गया
“ज़्यादातर distributions util-linux का काफ़ी नया version नहीं देते, इसलिए आपको source यहाँ से लेकर खुद compile करना पड़ेगा” वाले हिस्से में सावधानी बरतनी चाहिए
default install prefix
/usr/binहै, इसलिए installation process मौजूदा mount command को ऐसे version से overwrite कर सकती है जिसे ऐसी library चाहिए जो मौजूद ही न हो। फिर अगली boot पर kernel file system को read-only के रूप में mount कर सकता है/usr/local/binहोना चाहिएरोज़मर्रा के उपयोग के लिए यह अच्छा नहीं है, लेकिन Docker क्या है और कैसे काम करता है, इसका एहसास देता है
Linux पर Docker मूल रूप से एक fancy chroot है
मज़ेदार तथ्य: Docker की शुरुआत Bash में हुई थी, बाद में यह Python में गया, और अंत में Go पर आकर टिक गया
और 2013 के Docker meetup में किसी ने Bash में एक Docker clone भी लिखा था। लोग सीखना चाहते हैं, और अच्छा है अगर ऐसी चीज़ें मदद करें