Hacker News
Docker thật kỳ lạ
Phần mềmLần đầu xuất hiện 800 điểm330 bình luận
Một lập trình viên tự viết một "container runtime" (phần mềm chạy container) để học hỏi. Qua đó, anh ấy chia sẻ nhiều điều kỳ lạ mà anh ấy thấy ở Docker.
Chuyện gì đã xảy ra?
Tác giả tự làm một container runtime cho vui. Dù mới bắt đầu, anh ấy thấy Docker có nhiều điều lạ. Bài viết kể lại những điều đó, từ cách container hoạt động đến việc Docker cần quyền root.
Container thật ra là gì?
Container không giống máy ảo. Container chỉ là một tiến trình (process) có thêm một số giới hạn. Nhân Linux vẫn đang chạy tiến trình đó, và bạn có thể tìm thấy nó trong thư mục /proc. Container cũng không phải là một tính năng riêng của Linux. Nó là sự kết hợp của 5 tính năng khác nhau của nhân Linux.
Những điều kỳ lạ về Docker
Namespace (không gian tên) giúp ẩn những gì máy chủ và container nhìn thấy. cgroups giới hạn lượng tài nguyên mà container được dùng. Image chỉ là một thư mục. Docker đặt thư mục đó ở một chỗ và dùng chroot hoặc pivot_root để biến nó thành thư mục gốc mới của tiến trình container. Runtime runc của Docker được viết bằng Go. Go không hợp lắm với việc này, vì Go chạy nhiều luồng (thread) ngay từ đầu. Go không có lệnh fork. runc phải chạy lại /proc/self/exe với một tham số đặc biệt để giả lập fork.
Docker cần quyền root
- Nhiều API của nhân Linux trước đây bắt buộc phải chạy bằng quyền root.
- Vì vậy, Docker daemon thường chạy với quyền root.
- Chế độ rootless đã tốt hơn, nhưng mạng vẫn là điểm khó nhất. Phải viết lại toàn bộ ngăn xếp mạng trong userspace.
Vì sao điều này quan trọng?
Hiểu cách Docker hoạt động giúp bạn dùng nó tốt hơn và an toàn hơn. Việc container chạy bằng quyền root cũng cho thấy bảo mật container là một việc rất khó. Tác giả nói rằng tự viết một công cụ bạn hay dùng là cách học rất hiệu quả.
Chú giải
- Docker
- Phần mềm giúp đóng gói và chạy ứng dụng trong các container.
- container
- Một môi trường cách ly để chạy ứng dụng, dùng chung nhân với máy chủ.
- runc
- Container runtime của Docker, dùng để tạo và chạy container.
- cgroups
- Tính năng của Linux dùng để giới hạn CPU, bộ nhớ và tài nguyên khác của container.
- chroot
- Lệnh của Linux đổi thư mục gốc mà một tiến trình nhìn thấy.