Docker yang Diimplementasikan dalam Sekitar 100 Baris Bash, Bocker (2015)
(github.com/p8952)- Bocker adalah proyek yang mengimplementasikan Docker dalam sekitar 100 baris Bash, dan menyediakan alur mirip Docker seperti pull image, menjalankan container, melihat log, commit, dan menghapus
- Untuk menjalankannya diperlukan btrfs-progs, curl, iproute2, iptables, libcgroup-tools, util-linux 2.25.2 atau lebih baru, serta coreutils 7.5 atau lebih baru, dan dibutuhkan filesystem btrfs di bawah
/var/bockerserta konfigurasi jaringanbridge0 - Contoh di README menunjukkan alur menarik image
centos:7, menjalankan perintah di dalam container, lalu commit hasilyum install -y wgetsehingga/usr/bin/wgetdapat dikonfirmasi pada eksekusi berikutnya - Bocker dijalankan sebagai root dan mengubah antarmuka jaringan, tabel routing, serta aturan firewall, sehingga disarankan menjalankannya di mesin virtual, dan tidak ada jaminan terhadap kemungkinan kerusakan sistem
- Saat ini telah diimplementasikan
docker pull,images,ps,run,exec,logs,commit,rm/rmi, networking, dan kuota berbasis CGroups, tetapi data volume, data volume container, dan port forwarding belum diimplementasikan
Tujuan dan cakupan Bocker
- Bocker adalah proyek yang mengimplementasikan Docker dalam sekitar 100 baris Bash
- README memperlihatkan alur perintah yang mirip Docker berbasis Bash, termasuk pengelolaan image, menjalankan container, melihat log, commit perubahan, dan pembatasan resource
Persyaratan menjalankan
- Paket yang diperlukan untuk menjalankan adalah sebagai berikut
-
btrfs-progs
- curl
- iproute2
- iptables
- libcgroup-tools
- util-linux 2.25.2 atau lebih baru
- coreutils 7.5 atau lebih baru
- Sebagian besar distribusi tidak menyertakan util-linux yang cukup baru, sehingga ada kemungkinan Anda perlu mengunduh source util-linux 2.25 dan mengompilasinya sendiri
- Sistem memerlukan konfigurasi berikut
- filesystem btrfs yang ter-mount di bawah
/var/bocker - bridge jaringan bernama
bridge0dan IP10.0.0.1/24 - IP forwarding diaktifkan pada
/proc/sys/net/ipv4/ip_forward - konfigurasi firewall yang merutekan traffic dari
bridge0ke antarmuka fisik - Vagrantfile disertakan agar lingkungan yang diperlukan dapat dibuat dengan mudah
-
Hal yang perlu diperhatikan saat menjalankan
- Meskipun persyaratan terpenuhi, Bocker disarankan dijalankan di mesin virtual
- Bocker dijalankan sebagai root dan perlu mengubah hal-hal berikut
- antarmuka jaringan
- tabel routing
- aturan firewall
- README menyatakan bahwa Bocker tidak dapat menjamin sistem Anda tidak akan rusak
Contoh alur penggunaan
bocker pull centos 7akan mengambil imagecentos:7dan menghasilkan ID image sepertiimg_42150bocker imagesmenampilkan ID image dan sumbernya- Contoh output:
img_42150,centos:7
- Contoh output:
bocker run img_42150 cat /etc/centos-releasemenampilkan informasi rilis CentOS dari dalam container- Contoh output:
CentOS Linux release 7.1.1503 (Core)
- Contoh output:
bocker psmenampilkan ID container yang berjalan dan perintahnyabocker logs ps_42045menampilkan log output dari container tersebutbocker rm ps_42045menghapus container- Saat menjalankan
bocker run img_42150 which wget, awalnya akan muncul hasil bahwawgetbelum ada - Setelah memasang
wgetdenganbocker run img_42150 yum install -y wget, perubahan dapat diterapkan ke image lewatbocker commit ps_42018 img_42150 - Setelah itu,
bocker run img_42150 which wgetakan menampilkan/usr/bin/wget
Pembatasan resource dan CGroups
- Contoh eksekusi Bocker menunjukkan bahwa container ditempatkan di bawah CGroups
- Di
/proc/1/cgroupmuncul entri sepertimemory:/ps_42152,cpuacct,cpu:/ps_42152
- Di
- Contoh CPU share default dan batas memori adalah sebagai berikut
/sys/fs/cgroup/cpu/ps_42152/cpu.shares:512/sys/fs/cgroup/memory/ps_42152/memory.limit_in_bytes:512000000
- Batas resource dapat diubah melalui environment variable
BOCKER_CPU_SHARE=1024BOCKER_MEM_LIMIT=1024
- Setelah diubah, contoh menunjukkan nilai berikut
- CPU shares:
1024 - memory limit:
1024000000
- CPU shares:
Fitur yang sudah diimplementasikan dan yang belum
- Fitur yang saat ini sudah diimplementasikan adalah sebagai berikut
docker build†docker pulldocker imagesdocker psdocker rundocker execdocker logsdocker commitdocker rm/docker rmi-
Networking
- Quota Support / CGroups
- †
bocker initmenyediakan implementasi yang sangat terbatas daridocker build - Fitur yang belum diimplementasikan adalah sebagai berikut
- Data Volume Containers
- Data Volumes
- Port Forwarding
Lisensi
- Bocker adalah perangkat lunak bebas yang dapat didistribusikan ulang dan dimodifikasi sesuai ketentuan GNU General Public License
- Versi lisensinya dapat memilih GPL v3 yang dipublikasikan oleh Free Software Foundation atau versi yang lebih baru
- Program ini didistribusikan dengan harapan berguna, tetapi tanpa jaminan tersirat apa pun, termasuk kelayakan jual atau kesesuaian untuk tujuan tertentu
1 komentar
Pendapat Hacker News
Saya pernah membuat sesuatu yang mirip dengan proot, namanya Bag [1], dan sepertinya saya tidak mendeskripsikannya sebagai alternatif Docker
Itu tidak berhubungan dengan cgroups, dan antarmuka baris perintahnya juga berbeda dari Docker. Latar belakangnya adalah saya membuat rantai proxy yang terlihat seperti trafik HTML biasa untuk mengakali sensor internet dan deep packet inspection, dan ia harus terus berjalan di mana saja, tetapi saya tidak ingin mem-porting-nya menjadi aplikasi native Android
Saya ingin menjalankannya di Termux, tetapi saat itu Termux belum punya JDK/JRE, dan dengan proot menjalankan lingkungan Arch Linux, JDK bisa dipakai. Lingkungan Arch di dalam Termux secara keseluruhan lebih berguna, dan membuat lingkungan sekali pakai dengan konfigurasi berbeda-beda, menghapusnya, lalu masuk lewat proot untuk menjalankan satu perintah saja juga mudah diotomatisasi dengan skrip. Jadi saya menamainya bag.sh, dengan maksud bentuk yang jauh lebih kecil daripada kontainer pengiriman
Menariknya, di bag.sh masih ada roadmap/TODO yang tidak disentuh selama 5 tahun. Karena ditulis di layar ponsel agar bisa dilihat tanpa menggulir, sebagian besar dirapikan pada lebar 40 kolom
[1]: https://github.com/hkoosha/bag
Saya membuat Debian kecil di dalam /opt yang berisi software yang dibutuhkan dan dependensi seperti MySQL, dan itu berjalan cukup baik sehingga dipakai sampai perusahaan tempat saya membuatnya diakuisisi sekitar 2016. Secara lebih umum, menurut saya mengimplementasikan sendiri versi kasar dari aplikasi besar adalah salah satu cara terbaik untuk mempelajari cara kerja internalnya
mkdir -p $(dirname "$2")Jika dipadukan dengan keyboard Bluetooth sekitar 10 inci yang muat nyaman di saku dalam jaket kulit, Anda bisa keluar rumah tanpa tas dan tetap duduk di sudut beer garden terdekat untuk menulis kode. Anehnya ini juga cukup produktif; mungkin karena dibanding laptop, ada sedikit lebih banyak gesekan untuk beralih ke hal-hal yang biasanya mengganggu, sehingga Anda malah terus menatap kode sambil menyesap bir
Saya suka hal-hal seperti ini. Saya selalu menyukai sesuatu yang dibuat dengan Bash minimal
Ada juga proof of concept load balancer internal klaster 40 baris Bash yang dibuat di hackathon yang saya selenggarakan sekitar 10 tahun lalu untuk memperkenalkan infrastruktur terdistribusi seperti Docker dan Mesos: https://github.com/cell-os/metal-cell/blob/master/discovery/...
Mungkin sudah hilang, tetapi dulu juga ada alat transfer colo-to-cloud berbasis reverse SSH tunnel yang redundan dan terdistribusi. Kumpulan seperti ini tersusun rapi di Shell Fu dan sejenisnya: https://www.shell-fu.org/
Fakta bahwa bagian besar Docker bisa diimplementasikan ulang sesederhana ini adalah masalah terbesar yang pernah dan masih dihadapi Docker sebagai perusahaan. Pada dasarnya, Docker lebih mirip kode perekat yang merangkai fitur-fitur kernel
Tempat Docker benar-benar menambahkan nilai bukan hanya Docker Hub, melainkan Docker for Windows dan Mac. Pengalaman terintegrasinya jauh lebih baik daripada harus mengutak-atik VirtualBox dan Vagrant sendiri untuk menjalankan Docker di mesin pengembangan
Secara pribadi, menurut saya keajaiban sebenarnya dari Docker adalah format image Docker/OCI. Itu menangani caching dan distribusi image container dengan sangat baik, dan masih menjadi inti yang membedakan workflow ini dari VM “utuh”
Di Windows, Docker bisa dipakai lewat WSL dan berjalan sangat baik. Sulit memahami mengapa orang memakai Docker Desktop
Sebaliknya mereka membuat Docker Swarm yang setengah matang dan tidak berjalan andal dengan semestinya, lalu cepat tersingkir oleh Kubernetes
Cara saya memakainya hanya untuk mengambil lingkungan build virtual milik seseorang demi membangun software beberapa tahun lalu
Di repositori ada frasa seperti “belum diimplementasikan”, “TODO”, dan “sedang dikerjakan”, dan rasanya menyenangkan melihat commit terakhirnya sudah bertahun-tahun lalu
Aku jadi merasa sedikit lebih tenang karena tidak kembali melihat TODO yang kusebar di kodeku. Bukan bermaksud merendahkan pembuatnya, hanya saja ini terasa menghibur
Kalau pada kode yang tidak dibayar, sukarela, dan hobi kita merasa terbebani harus melakukannya hanya karena kodenya dipublikasikan, coding jadi kurang menyenangkan, dan bisa membuat kita tidak memublikasikan kode yang tadinya akan kita buka
Kalau selalu ada ide berikutnya, maka secara definisi akan selalu ada TODO yang belum diselesaikan. Sebenarnya, keadaan normal semua proyek memang seharusnya seperti itu
Menetapkan batas cakupan yang jelas itu sepenuhnya wajar dan sering membantu. Dengan begitu, proyek tidak terasa selamanya “belum selesai” karena kita mengejar jalur sampingan
Mengejutkan lazydocker belum disebut sebagai alternatif yang sangat bagus untuk Docker Desktop. Bisa dipakai di Linux/macOS/Windows [1]
Ini UI terminal yang cukup kaya fitur, dan punya kelebihan bisa dijalankan lewat SSH
[1] https://github.com/jesseduffield/lazydocker
Setidaknya ini pertama kalinya aku melihat hal seperti itu. Aku juga penasaran apakah iklan semacam ini diperbolehkan oleh ketentuan layanan atau kebijakan penggunaan yang diizinkan GitHub
Aku penasaran kenapa Bocker begitu sering masuk halaman depan. Pada 2024, apakah Docker masih sekontroversial itu?
Aku tidak mengerti kenapa orang tidak mau mengakui bahwa Docker menghadirkan hal yang benar-benar berguna, terutama distribusi perangkat lunak dan “mudah dijalankan di mana saja”
Docker adalah gabungan teknologi kernel yang sudah ada sebelumnya. Namespace, cgroups, union file system, dan mungkin beberapa hal lainnya
Karena itu menarik, dan pada dasarnya ini kisah bergaya HN yang sempurna
Baru setelah mendemokannya ke beberapa orang, aku sadar mereka sebenarnya bisa saja memakai
/, atau aku bisa saja membawakan Docker untuk merekaAda semacam saudara dari ibu yang berbeda di https://bastillebsd.org/
Bastille mengelola FreeBSD jail dengan shell, menggunakan banyak struktur yang biasa terlihat di Docker. Dependensinya sangat sedikit, jadi aku lebih menyukainya dibanding perangkat lunak manajemen jail lain di BSD
Namun meski ini alat berbasis CLI/TUI, solusinya mendekati “paling berlebihan”. Belakangan ini aku sedang melalui tahap membuat dan mengelola jail hanya dengan konfigurasi bawaan FreeBSD, tetapi ini cuma tahap sementara
Aku hanya akan melakukannya sampai cukup tertanam di kepalaku bagaimana semuanya saling terhubung sehingga aku percaya diri untuk debugging; setelah itu, seperti orang waras, aku akan berhenti membentur-benturkan batu dan kembali ke alat tingkat lebih tinggi
Tapi aku butuh waktu agak lama untuk memahami kenapa namanya Bastille. La Bastille adalah benteng yang dibangun untuk mempertahankan Paris dari serangan Inggris selama Perang Seratus Tahun, lalu kemudian diubah menjadi penjara
Bagian yang berbunyi “sebagian besar distro tidak menyediakan util-linux versi yang cukup baru, jadi Anda mungkin harus mengambil sumbernya dari sini dan mengompilasinya sendiri” perlu diwaspadai
Prefiks instalasi default-nya adalah
/usr/bin, jadi proses instalasi bisa menimpa perintah mount yang ada dengan versi yang membutuhkan pustaka yang tidak ada. Akibatnya, pada boot berikutnya kernel akan memasang sistem berkas sebagai read-only/usr/local/binTidak bagus untuk dipakai sehari-hari, tetapi memberi gambaran tentang apa itu Docker dan bagaimana cara kerjanya
Di Linux, Docker pada dasarnya adalah chroot mewah
Fakta menarik: Docker dimulai dengan Bash, lalu berpindah ke Python, dan akhirnya menetap di Go
Selain itu, pada meetup Docker tahun 2013, seseorang menulis klon Docker dengan Bash. Orang-orang ingin belajar, dan semoga hal-hal seperti ini membantu