6 पॉइंट द्वारा GN⁺ 2024-11-24 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • 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 और bridge0 network configuration की जरूरत होती है
  • README का उदाहरण centos:7 image 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 filesystem
      • bridge0 नाम का network bridge और 10.0.0.1/24 IP
      • /proc/sys/net/ipv4/ip_forward में IP forwarding enabled
      • bridge0 से 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:7 image लाने पर img_42150 जैसा image ID बनता है
  • bocker images image ID और source दिखाता है
    • example output: img_42150, centos:7
  • bocker run img_42150 cat /etc/centos-release container में CentOS release information output करता है
    • example output: CentOS Linux release 7.1.1503 (Core)
  • bocker ps चलाए गए container ID और command दिखाता है
  • bocker logs ps_42045 उस container के output logs दिखाता है
  • bocker rm ps_42045 container को remove करता है
  • bocker run img_42150 which wget चलाने पर शुरुआत में यह result आता है कि wget मौजूद नहीं है
  • bocker run img_42150 yum install -y wget से wget install करने के बाद, bocker commit ps_42018 img_42150 से changes को image में reflect किया जाता है
  • इसके बाद bocker run img_42150 which wget /usr/bin/wget output करता है

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=1024
    • BOCKER_MEM_LIMIT=1024
  • बदलाव के बाद example ये values दिखाता है
    • CPU shares: 1024
    • memory limit: 1024000000

लागू और未लागू features

  • फिलहाल लागू features ये हैं
    • docker build
    • docker pull
    • docker images
    • docker ps
    • docker run
    • docker exec
    • docker logs
    • docker commit
    • docker rm / docker rmi
    • Networking

      • Quota Support / CGroups
      • bocker init docker 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 टिप्पणियां

 
GN⁺ 2024-11-24
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

    • लगता है ऐसी कहानियाँ काफ़ी रही होंगी। ऐसी स्थिति में जहाँ VM उपयुक्त नहीं था, कई components को एक ही environment में package करना पड़ा, इसलिए मैंने chroot और deb-bootstrap का इस्तेमाल किया और makeself से installer बनाया
      /opt के अंदर ज़रूरी software और MySQL जैसी dependencies के साथ एक छोटा Debian बनाया था, और वह काफ़ी अच्छा चला, इतना कि इसे बनवाने वाली कंपनी के लगभग 2016 में acquire होने तक इसका इस्तेमाल होता रहा। ज़्यादा सामान्य रूप से, किसी बड़े application का एक rough version खुद implement करना उसकी अंदरूनी कार्यप्रणाली सीखने के सबसे अच्छे तरीकों में से एक है
    • लगता है script में कुछ महत्वपूर्ण quotes छूट गए हैं। shellcheck चला कर देखना अच्छा रहेगा
      mkdir -p $(dirname "$2")
    • 8-इंच टैबलेट को landscape में घुमाकर किसी तरह लगभग 80x22 का आकार मिला, जो सच में पढ़ने लायक था
      अगर इसे लगभग 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/

    • 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 बहुत बेहतर है

    • Rancher Desktop भी एक practical विकल्प है और मुफ़्त है। Docker के नए license लागू होने के बाद, मेरी workplace सहित कई जगहें उधर चली गईं
      व्यक्तिगत रूप से मुझे लगता है कि Docker का असली जादू Docker/OCI image format था। यह caching और container image distribution को शानदार ढंग से संभालता है, और अब भी “full” VM और workflow के बीच अंतर करने वाली मुख्य चीज़ है
    • Mac पर Docker Desktop एक सीमाओं से भरा, अपर्याप्त permissions वाला mess है। Mac पर Docker CLI और Colima का इस्तेमाल करने में भी permission constraints हैं, लेकिन कम-से-कम बेतुके license और Docker GUI से तो बचा जा सकता है
      Windows में WSL के अंदर Docker इस्तेमाल किया जा सकता है और वह बहुत अच्छा चलता है। समझना मुश्किल है कि फिर Docker Desktop क्यों इस्तेमाल करें
    • macOS पर मैं बस Colima इस्तेमाल करता हूँ, यह काफ़ी बेहतर experience है और बहुत हल्का भी
    • नहीं, Docker को CloudRun, Render, Fly जैसे PaaS को प्राथमिकता देकर बनाना चाहिए था और enterprise को महँगे में बेचना चाहिए था
      उसकी जगह उन्होंने अधपका Docker Swarm बनाया, जो भरोसेमंद तरीके से ठीक से चलता भी नहीं था, और जल्दी ही Kubernetes से पीछे रह गया
    • कई popular और profitable systems ऐसे होते हैं जिन्हें “आसानी” से फिर से implement किया जा सकता है। मुझे लगता था Docker की value Docker images में है, लेकिन शायद Docker का इस्तेमाल उस तरह नहीं हो रहा
      मैंने इसे कुछ साल पहले सिर्फ इस काम के लिए इस्तेमाल किया था कि किसी दूसरे व्यक्ति का virtual build environment लेकर software build किया जा सके
  • रिपॉज़िटरी में “अभी तक implement नहीं किया गया”, “TODO”, “काम जारी है” जैसे वाक्य हैं, लेकिन आख़िरी commit कई साल पहले का है, यह अच्छा लगता है
    इससे अपने code में इधर-उधर बिखेरे हुए TODOs को फिर से जाकर न देखने को लेकर थोड़ा सुकून मिलता है। लेखक को नीचा दिखाने की बात नहीं, बस तसल्ली मिलती है

    • अच्छी बात है। यह बिल्कुल भी नीचा दिखाना नहीं है, बल्कि ऐसी स्थिति को सामान्य मानने की दिशा में मदद करता है, इसलिए अच्छा है
      अगर unpaid, volunteer, hobby code में सिर्फ़ public होने की वजह से करना ही चाहिए वाला दबाव महसूस हो, तो coding कम मज़ेदार हो जाती है, और जो code वरना public किया जाता, वह भी शायद public न किया जाए
    • ज़्यादातर projects, शायद सभी projects, कभी सच में ख़त्म नहीं होते। कब रुकना है यह जानना महत्वपूर्ण है
    • मुझे यह अच्छा लगता है। कोई चीज़ बस पूरी हो सकती है, और यह ज़रूरी नहीं कि हमेशा अगले ideas का ढेर हो, लेकिन आम तौर पर अगला idea हमेशा होता ही है
      अगर हमेशा अगला idea मौजूद है, तो परिभाषा के मुताबिक़ अधूरे TODO भी हमेशा बचे रहेंगे। वास्तव में सभी projects की सामान्य स्थिति ऐसी ही होनी चाहिए
    • project शुरू करते समय “non-goals”, यानी वे features जिनका ख़याल आता है लेकिन जिन्हें जानबूझकर implement नहीं करना, उन पर सोचने के लिए समय देना अच्छा होता है
      scope की सीमाएँ साफ़ रखना पूरी तरह ठीक है और अक्सर मददगार भी होता है। इससे project किसी भटकाव का पीछा करते-करते हमेशा “पूरा नहीं हुआ” जैसा महसूस नहीं होता
    • यह बिल्कुल ठीक है। जब program वह काम कर देता है जो मैं चाहता हूँ और मेरा काम पूरा हो जाता है, तो मैं development रोक देता हूँ। software मेरा hobby नहीं है
  • हैरानी है कि lazydocker का ज़िक्र अभी तक Docker Desktop के एक शानदार alternative के रूप में नहीं हुआ। यह Linux/macOS/Windows पर चल सकता है [1]
    यह काफ़ी feature-rich terminal UI है, और इसका एक फ़ायदा यह भी है कि इसे SSH के ज़रिए चलाया जा सकता है
    [1] https://github.com/jesseduffield/lazydocker

    • सचमुच, यह तो बस कुछ दिन पहले ही पोस्ट हुआ था: https://news.ycombinator.com/item?id=42214873
    • Lazydocker निश्चित रूप से दिलचस्प लगता है, लेकिन किसी open source project की README.md में बिल्कुल अलग क्षेत्र के product के लिए self-promotional ad होना थोड़ा ज़्यादा है
      कम से कम मैंने ऐसा पहली बार देखा है। यह भी जिज्ञासा है कि क्या ऐसे ads GitHub की terms of service या acceptable use policy के तहत allowed हैं
  • सोचता हूँ Bocker इतनी बार front page पर क्यों आ जाता है। क्या 2024 में भी Docker इतना controversial है?
    समझ नहीं आता लोग यह क्यों नहीं मानते कि Docker ने वाक़ई उपयोगी चीज़ें दीं, ख़ासकर software deployment और “कहीं भी आसानी से चलाओ” जैसी सुविधा

    • यह तो सिर्फ़ यह देखने के लिए learning tool है कि Docker कैसे काम करता है
      Docker पहले से मौजूद kernel technologies का एक संयोजन है। namespaces, cgroups, union file systems, और शायद कुछ और चीज़ें
    • इसके बार-बार front page पर आने की वजह शायद यह है कि बहुत से लोग Docker को बहुत जटिल मानते हैं, लेकिन सबसे बुनियादी स्तर पर यह वास्तव में काफ़ी elegant और समझने योग्य है
      इसलिए यह दिलचस्प है, और सच कहें तो यह लगभग एकदम सही HN-स्टाइल कहानी है
    • यह front page पर Docker को नीचा दिखाने के लिए नहीं आता, बल्कि इसलिए आ सकता है कि लोग Docker की उपयोगिता देखकर यह जानना चाहते हैं कि यह काम कैसे करता है। Bocker उन technologies की दुनिया में प्रवेश-द्वार बन सकता है
    • मैंने company में लंबी CI process कम करने के लिए overlayfs दिखाया था, और speedup देखकर सब चौंक गए थे
      कुछ लोगों को demo देने के बाद ही मुझे एहसास हुआ कि वे बस / का इस्तेमाल कर सकते थे, या फिर मैं Docker ही ले आता तो भी काम हो जाता
  • इसी तरह का एक और प्रोजेक्ट https://bastillebsd.org/ है
    Bastille, shell का उपयोग करके Docker जैसी कई संरचनाओं के साथ FreeBSD jail को manage करता है। इसकी dependencies बहुत कम हैं, इसलिए BSD के दूसरे jail management software की तुलना में मुझे यह ज़्यादा पसंद है

    • cbsd भी काफ़ी प्रभावशाली है: shttps://www.bsdstore.ru/en/about.html
      बस, CLI/TUI-आधारित tool होने के बावजूद यह लगभग “अधिकतम अति” वाला समाधान है। इन दिनों मैं FreeBSD की default configuration भर से jail बनाने और manage करने की प्रक्रिया से गुज़र रहा हूँ, लेकिन यह सिर्फ़ एक अस्थायी चरण है
      जब तक पूरी चीज़ मेरे दिमाग़ में इतना बैठ न जाए कि debugging को लेकर आत्मविश्वास आ जाए, तब तक ऐसा करूँगा; उसके बाद समझदार इंसान की तरह पत्थर टकराना बंद करके किसी higher-level tool पर वापस लौटने का इरादा है
    • सही है। लगभग 100 lines की shell script के लिए यह काफ़ी value जोड़ता है
      लेकिन इसका नाम 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 है

    • macOS/Windows वगैरह पर Docker मूल रूप से Linux VM के अंदर चलने वाला fancy chroot है
  • मज़ेदार तथ्य: Docker की शुरुआत Bash में हुई थी, बाद में यह Python में गया, और अंत में Go पर आकर टिक गया
    और 2013 के Docker meetup में किसी ने Bash में एक Docker clone भी लिखा था। लोग सीखना चाहते हैं, और अच्छा है अगर ऐसी चीज़ें मदद करें