Docker được triển khai bằng khoảng 100 dòng Bash: Bocker (2015)
(github.com/p8952)- Bocker là một dự án triển khai Docker bằng khoảng 100 dòng Bash, cung cấp quy trình tương tự Docker như pull image, run container, xem log, commit và xóa
- Để chạy cần btrfs-progs, curl, iproute2, iptables, libcgroup-tools, util-linux 2.25.2 trở lên, coreutils 7.5 trở lên; đồng thời cần hệ thống tệp btrfs dưới
/var/bockervà cấu hình mạngbridge0 - Ví dụ trong README cho thấy quy trình pull image
centos:7, chạy lệnh trong container, commit kết quảyum install -y wget, rồi kiểm tra/usr/bin/wgettrong lần chạy sau - Bocker chạy với quyền root và thay đổi interface mạng, bảng định tuyến, quy tắc tường lửa, nên được khuyến nghị chạy trong máy ảo; không có bảo đảm nào về khả năng không làm hỏng hệ thống
- Hiện đã triển khai
docker pull,images,ps,run,exec,logs,commit,rm/rmi, networking và quota dựa trên CGroups, nhưng data volume, data volume container và port forwarding vẫn chưa được triển khai
Mục đích và phạm vi của Bocker
- Bocker là dự án triển khai Docker bằng khoảng 100 dòng Bash
- README trình bày luồng lệnh tương tự Docker dựa trên Bash, bao gồm các chức năng như quản lý image, chạy container, xem log, commit thay đổi và giới hạn tài nguyên
Yêu cầu để chạy
- Các gói cần thiết để chạy như sau
-
btrfs-progs
- curl
- iproute2
- iptables
- libcgroup-tools
- util-linux 2.25.2 trở lên
- coreutils 7.5 trở lên
- Phần lớn bản phân phối không kèm util-linux đủ mới, nên có thể cần tải mã nguồn util-linux 2.25 và tự biên dịch
- Hệ thống cần có cấu hình sau
- Hệ thống tệp btrfs được mount dưới
/var/bocker - Network bridge tên
bridge0với IP10.0.0.1/24 - Bật IP forwarding tại
/proc/sys/net/ipv4/ip_forward - Cấu hình tường lửa để định tuyến traffic từ
bridge0ra interface vật lý - Có kèm Vagrantfile để dễ dàng tạo môi trường cần thiết
-
Lưu ý khi chạy
- Ngay cả khi đáp ứng các yêu cầu, Bocker vẫn được khuyến nghị chạy trong máy ảo
- Bocker chạy với quyền root và cần thay đổi các mục sau
- Interface mạng
- Bảng định tuyến
- Quy tắc tường lửa
- README nêu rõ không thể bảo đảm rằng Bocker sẽ không làm hỏng hệ thống
Luồng sử dụng ví dụ
- Khi lấy image
centos:7bằngbocker pull centos 7, một image ID nhưimg_42150sẽ được tạo bocker imageshiển thị image ID và nguồn- Ví dụ output:
img_42150,centos:7
- Ví dụ output:
bocker run img_42150 cat /etc/centos-releasein thông tin bản phát hành CentOS trong container- Ví dụ output:
CentOS Linux release 7.1.1503 (Core)
- Ví dụ output:
bocker pshiển thị container ID đã chạy và lệnhbocker logs ps_42045hiển thị log output của container đóbocker rm ps_42045xóa container- Khi chạy
bocker run img_42150 which wgetban đầu, kết quả cho thấy chưa cówget - Sau khi cài
wgetbằngbocker run img_42150 yum install -y wget, dùngbocker commit ps_42018 img_42150để phản ánh thay đổi vào image - Sau đó
bocker run img_42150 which wgetsẽ in ra/usr/bin/wget
Giới hạn tài nguyên và CGroups
- Ví dụ chạy Bocker cho thấy container được đặt dưới CGroups
- Trong
/proc/1/cgroupxuất hiện các mục nhưmemory:/ps_42152,cpuacct,cpu:/ps_42152
- Trong
- Ví dụ về CPU share và giới hạn bộ nhớ mặc định như sau
/sys/fs/cgroup/cpu/ps_42152/cpu.shares:512/sys/fs/cgroup/memory/ps_42152/memory.limit_in_bytes:512000000
- Có thể thay đổi giới hạn tài nguyên bằng biến môi trường
BOCKER_CPU_SHARE=1024BOCKER_MEM_LIMIT=1024
- Ví dụ sau khi thay đổi cho thấy các giá trị sau
- CPU shares:
1024 - memory limit:
1024000000
- CPU shares:
Tính năng đã triển khai và chưa triển khai
- Các tính năng hiện đã triển khai như sau
docker build†docker pulldocker imagesdocker psdocker rundocker execdocker logsdocker commitdocker rm/docker rmi-
Networking
- Hỗ trợ quota / CGroups
- †
bocker initcung cấp một triển khai rất hạn chế củadocker build - Các tính năng chưa được triển khai như sau
- Data Volume Containers
- Data Volumes
- Port Forwarding
Giấy phép
- Bocker là phần mềm tự do có thể được phân phối lại và sửa đổi theo các điều khoản của GNU General Public License
- Có thể chọn phiên bản giấy phép GPL v3 do Free Software Foundation công bố hoặc bất kỳ phiên bản nào về sau
- Chương trình được phân phối với hy vọng sẽ hữu ích, nhưng không có cả bảo đảm ngầm định về khả năng thương mại hóa hay sự phù hợp cho một mục đích cụ thể
1 bình luận
Ý kiến trên Hacker News
Tôi từng làm một thứ tương tự bằng proot, tên là Bag [1], và chắc tôi đã không mô tả nó là một lựa chọn thay thế Docker
Nó không liên quan đến cgroups, và giao diện dòng lệnh cũng khác Docker. Bối cảnh là tôi đã tạo một chuỗi proxy trông giống lưu lượng HTML thông thường để vượt qua kiểm duyệt Internet và kiểm tra gói tin sâu; nó cần chạy liên tục ở bất cứ đâu, nhưng tôi không muốn port nó thành ứng dụng native cho Android
Tôi muốn chạy nó trong Termux, nhưng lúc đó Termux không có JDK/JRE; nếu dùng proot để dựng môi trường Arch Linux thì có thể dùng JDK. Môi trường Arch bên trong Termux nhìn chung hữu ích hơn, và việc tạo rồi xóa các môi trường dùng một lần với cấu hình khác nhau, sau đó vào bằng proot để chỉ chạy một lệnh duy nhất, cũng dễ tự động hóa bằng script. Vì vậy tôi đặt tên là bag.sh, với ý nghĩa nó nhỏ hơn rất nhiều so với container vận tải
Thú vị là bag.sh vẫn còn roadmap/TODO chưa đụng tới suốt 5 năm. Vì viết trên màn hình di động và muốn xem mà không phải cuộn, nên phần lớn được căn dòng 40 cột
[1]: https://github.com/hkoosha/bag
Tôi tạo một Debian nhỏ trong /opt, chứa phần mềm cần thiết cùng các phụ thuộc như MySQL, và nó chạy khá ổn; nó được dùng cho đến khi công ty mà tôi làm thứ này cho họ bị mua lại vào khoảng năm 2016. Nói rộng hơn, tôi nghĩ tự triển khai một phiên bản thô sơ của một ứng dụng lớn là một trong những cách tốt nhất để học cách nó hoạt động bên trong
mkdir -p $(dirname "$2")Kết hợp với một bàn phím Bluetooth khoảng 10 inch, đủ gọn để nhét thoải mái vào túi trong áo khoác da, thì dù rời nhà không mang túi, bạn vẫn có thể ngồi ở một góc beer garden gần đó để viết code. Lạ là nó cũng khá năng suất; có lẽ vì so với laptop, ma sát để chuyển sang các thứ gây xao nhãng thường ngày cao hơn một chút, nên bạn sẽ nhấp một ngụm bia và tiếp tục nhìn chằm chằm vào code
Tôi thích những thứ như thế này. Từ lâu tôi đã thích những thứ làm bằng Bash tối giản
Có cả một proof of concept bộ cân bằng tải nội bộ cluster bằng Bash 40 dòng, được làm tại một hackathon do chúng tôi tổ chức khoảng 10 năm trước để quảng bá hạ tầng phân tán như Docker, Mesos: https://github.com/cell-os/metal-cell/blob/master/discovery/...
Có lẽ đã thất lạc rồi, nhưng tôi cũng từng có một công cụ chuyển tiếp colo-to-cloud dựa trên reverse SSH tunnel, có tính dư thừa và phân tán. Những bộ sưu tập kiểu này được tổng hợp rất tốt trên Shell Fu và các nơi tương tự: https://www.shell-fu.org/
Việc có thể tái triển khai phần lớn Docker đơn giản như thế này chính là vấn đề lớn nhất mà công ty Docker đã và vẫn đang đối mặt. Về cơ bản, nó gần với mã keo nối các tính năng của kernel lại với nhau
Nơi Docker thực sự tạo thêm giá trị không chỉ là Docker Hub, mà là Docker for Windows và Mac. Trải nghiệm tích hợp tốt hơn rất nhiều so với việc tự đụng vào VirtualBox và Vagrant để chạy Docker trên máy phát triển
Cá nhân tôi nghĩ phép màu thật sự của Docker là định dạng image Docker/OCI. Đó là cách xử lý caching và phân phối container image rất tốt, và vẫn là điểm cốt lõi phân biệt nó với VM “toàn phần” và workflow của VM
Trên Windows có thể dùng Docker trong WSL và nó chạy rất tốt. Thật khó hiểu vì sao lại dùng Docker Desktop
Thay vào đó họ làm Docker Swarm nửa vời, không hoạt động đáng tin cậy cho đúng, và nhanh chóng bị Kubernetes vượt qua
Cách tôi dùng chỉ là lấy môi trường build ảo của ai đó để build phần mềm vài năm trước
Trong kho có những cụm như “chưa được triển khai”, “TODO”, “đang làm”, mà nhìn commit cuối cùng đã từ vài năm trước thì thấy hay
Điều đó khiến tôi thấy nhẹ lòng hơn một chút về việc không quay lại xem các TODO mình rải rác trong code. Không phải muốn hạ thấp tác giả, chỉ là thấy được an ủi thôi
Với code không lương, tình nguyện, làm vì sở thích, nếu chỉ vì nó được công khai mà cảm thấy gánh nặng phải làm, thì việc lập trình sẽ kém vui hơn, và có thể khiến những code lẽ ra đã được công khai lại không được công khai nữa
Nếu lúc nào cũng có ý tưởng tiếp theo thì theo định nghĩa, cũng sẽ luôn còn TODO chưa hoàn thành. Thực ra trạng thái bình thường của mọi dự án nên là như vậy
Đặt ranh giới phạm vi rõ ràng là hoàn toàn ổn và thường hữu ích. Nhờ vậy sẽ không bị cảm giác dự án mãi mãi chưa “hoàn thành” vì cứ chạy theo các ngả rẽ
Thật ngạc nhiên là lazydocker vẫn chưa được nhắc đến như một lựa chọn thay thế tuyệt vời cho Docker Desktop. Dùng được trên Linux/macOS/Windows [1]
Đây là một giao diện terminal khá giàu tính năng, và còn có lợi thế là có thể chạy qua SSH
[1] https://github.com/jesseduffield/lazydocker
Ít nhất thì đây là lần đầu tôi thấy chuyện như vậy. Tôi cũng tò mò liệu kiểu quảng cáo này có được điều khoản dịch vụ hoặc chính sách sử dụng được phép của GitHub cho phép không
Tôi tò mò vì sao Bocker lại thường xuyên lên trang nhất như vậy. Đến năm 2024 mà Docker vẫn còn gây tranh cãi đến thế sao?
Tôi không hiểu vì sao mọi người không thừa nhận rằng Docker đã mang lại những thứ thực sự hữu ích, chủ yếu là phân phối phần mềm và “chạy dễ dàng ở mọi nơi”
Docker là sự kết hợp của các công nghệ kernel đã tồn tại sẵn. Namespace, cgroups, union file system, và có lẽ thêm vài thứ nữa
Vì thế nó thú vị, và về cơ bản là một câu chuyện đúng kiểu HN hoàn hảo
Chỉ sau khi demo cho vài người, tôi mới nhận ra rằng họ cũng có thể cứ dùng
/, hoặc lẽ ra tôi đã có thể đem Docker cho họMột người anh em khác mẹ là https://bastillebsd.org/
Bastille dùng shell để quản lý FreeBSD jail với nhiều cấu trúc kiểu như có thể thấy trong Docker. Phụ thuộc rất ít nên tôi thích nó hơn các phần mềm quản lý jail khác trên BSD
Tuy nhiên dù là công cụ dựa trên CLI/TUI, nó gần như là một giải pháp “quá mức tối đa”. Dạo này tôi đang đi qua các bước tạo và quản lý jail chỉ bằng cấu hình mặc định của FreeBSD, nhưng đây chỉ là giai đoạn tạm thời
Tôi chỉ làm vậy cho đến khi đủ khắc sâu trong đầu cách toàn bộ mọi thứ ăn khớp với nhau để tự tin debug; sau đó tôi định thôi cái trò gõ đá vào nhau như người nguyên thủy và quay lại dùng công cụ cấp cao hơn như một người biết điều
Nhưng tôi mất một lúc mới hiểu vì sao nó tên là Bastille. La Bastille là pháo đài được xây để bảo vệ Paris khỏi các cuộc tấn công của người Anh trong Chiến tranh Trăm năm, rồi sau này được chuyển thành nhà tù
Cần cẩn thận với đoạn “phần lớn distro không cung cấp phiên bản util-linux đủ mới, nên có lẽ bạn sẽ phải lấy mã nguồn ở đây và tự biên dịch”
Tiền tố cài đặt mặc định là
/usr/bin, nên quá trình cài đặt có thể ghi đè lệnh mount hiện có bằng một phiên bản đòi hỏi thư viện không tồn tại. Khi đó ở lần khởi động tiếp theo, kernel sẽ mount hệ thống tệp ở chế độ chỉ đọc/usr/local/binKhông tốt để dùng hằng ngày, nhưng giúp có cảm giác Docker là gì và hoạt động ra sao
Trên Linux, Docker về cơ bản là một chroot hào nhoáng
Sự thật thú vị: Docker bắt đầu bằng Bash, sau đó chuyển sang Python, rồi cuối cùng ổn định với Go
Ngoài ra, tại một meetup Docker năm 2013, có người đã viết một bản clone Docker bằng Bash. Mọi người muốn học, và hy vọng những thứ như thế này sẽ có ích