Một lập trình viên vừa tự viết container runtime cho vui và chia sẻ những điều bất ngờ về Docker, công cụ gần như không thể thiếu của công nghệ phần mềm hiện đại.

Container không phải máy ảo

Khác với máy ảo, container chỉ là một tiến trình bình thường chạy trên kernel của máy chủ, nhưng bị gắn thêm nhiều giới hạn. Không có một tính năng Linux nào gọi là "container". Thực tế đó là sự kết hợp của khoảng 5 tính năng kernel: namespace ẩn bớt những gì tiến trình nhìn thấy, cgroup giới hạn tài nguyên như CPU và bộ nhớ, cùng nhiều cơ chế cô lập mạng.

Một image Docker cũng chỉ là một thư mục. Docker tải thư mục đó về, rồi dùng chroot hoặc pivot_root để biến nó thành "thư mục gốc" của tiến trình. Hãy tưởng tượng bạn nhốt một người vào một căn phòng và nói với họ rằng đó là cả ngôi nhà.

Những điểm khó chịu bên trong

Runtime runc của Docker viết bằng Go, nhưng Go chạy đa luồng và không có lệnh fork đúng nghĩa, nên runc phải dùng một đoạn mã C chạy trước khi Go khởi động. Ngoài ra, Docker thường cần quyền root, khiến bảo mật container trở thành bài toán khó. Chế độ rootless đỡ hơn nhưng phải tự cài lại cả phần mạng trong userspace.

Bài học rút ra: tự viết lại một công cụ mình dùng hằng ngày là cách học rất hiệu quả, và đó cũng là tinh thần của cộng đồng startup và open source.