Trong thế giới phát triển cloud-native, các image container vốn được kỳ vọng là những gói phần mềm gọn nhẹ, hiệu quả giúp hợp lý hóa việc triển khai. Nhưng một nghiên cứu điển hình gần đây từ nền tảng Sealos đã châm ngòi cho cuộc thảo luận sôi nổi khắp cộng đồng nhà phát triển, tiết lộ cách những hiểu lầm cơ bản về công nghệ container có thể dẫn đến tình trạng phình to bộ nhớ thảm khốc.
Sự cố bắt đầu khi các kỹ sư nền tảng nhận thấy các node phát triển của họ liên tục cạn kiệt dung lượng ổ đĩa, mặc dù được trang bị SSD dung lượng lên đến 270GB. Những gì họ phát hiện ra vừa gây sốc vừa mang tính giáo dục: một image container duy nhất đã phình lên đến 800GB thông qua một chuỗi sai sót kỹ thuật và sơ hở bảo mật hoàn hảo.
Giải Phẫu Thảm Họa Container
Trái tim của vấn đề là sự kết hợp giữa việc sử dụng container sai cách và các lỗ hổng bảo mật. Nền tảng này cho phép người dùng tạo image production bằng cách commit các container đang chạy — về cơ bản là chụp nhanh các môi trường sống. Cách tiếp cận này, dù tiện lợi, lại mở ra cánh cửa cho nhiều vấn đề.
Một container của người dùng đã bị tấn công brute-force SSH liên tục, khiến file /var/log/btmp phình lên đến 11GB với các nỗ lực đăng nhập thất bại. Thông thường, điều này chỉ đáng lo ngại nhưng vẫn có thể quản lý được. Tuy nhiên, container này đã tích lũy tới 272 lớp (layer) thông qua các thao tác commit lặp đi lặp lại. Mỗi lần người dùng commit một lớp mới, cơ chế copy-on-write của OverlayFS sẽ sao chép toàn bộ file log 11GB vào lớp mới, ngay cả khi chỉ có một dòng mới được thêm vào.
Nếu bạn nhất định phải làm theo cách đó, hãy thật sự chủ động về những gì bạn thực sự cần. Đừng chạy tiến trình SSH, đừng chạy cron, đừng chạy tiến trình SMTP, đừng chạy cả bộ tiến trình thường chạy trên một máy chủ Linux điển hình.
Phản ứng từ cộng đồng đã diễn ra nhanh chóng và đầy tính phê phán. Những người dùng container có kinh nghiệm ngay lập tức xác định vấn đề gốc rễ: việc sử dụng docker commit như một chiến lược xây dựng image chính thể hiện một sự hiểu lầm cơ bản về các phương pháp hay nhất cho container. Container được thiết kế để chạy các tiến trình đơn lẻ, không phải toàn bộ hệ điều hành với nhiều dịch vụ.
Phân Tích Nguyên Nhân Gốc Rễ:
- Vấn đề chính: Cơ chế Copy-on-Write khuếch đại file log 11GB qua 272 layer
 - Sơ hở bảo mật: SSH được mở không có giới hạn tốc độ hoặc fail2ban
 - Vấn đề quy trình: Sử dụng 
docker committhay vì build dựa trên Dockerfile - Thiếu biện pháp bảo vệ: Không có giới hạn số lượng layer hoặc giám sát kích thước image
 
Phản Ứng Từ Cộng Đồng Và Góc Nhìn Kỹ Thuật
Các diễn đàn nhà phát triển sôi sục với các phản ứng từ hoài nghi cho đến những lời chỉ trích mang tính xây dựng. Nhiều người tỏ ra sốc khi một công ty chuyên về nền tảng container lại gặp phải những vấn đề cơ bản đến vậy. Image với 272 lớp đã trở thành biểu tượng của việc sử dụng container sai cách, với các bình luận viên lưu ý rằng các bản build dựa trên Dockerfile đúng chuẩn hiếm khi vượt quá vài chục lớp.
Cuộc thảo luận tiết lộ những lo ngại sâu sắc hơn về việc đào tạo kiến thức container trong ngành. Như một bình luận viên nhận xét, Tự động hóa container trông có vẻ đơn giản nhưng các nhà phát triển có kinh nghiệm về hệ thống biết rõ sự phức tạp thực tế của hệ điều hành. Sự dễ dàng của công cụ container đã cho phép các nhà phát triển không có nền tảng quản trị hệ thống triển khai ứng dụng, nhưng đôi khi lại không hiểu các cơ chế cơ bản.
Các hàm ý về bảo mật cũng thu hút sự chú ý đáng kể. Dịch vụ SSH bị lộ mà không có giới hạn tốc độ hoặc bảo vệ fail2ban đại diện cho một sơ suất bảo mật cơ bản. Các thành viên cộng đồng đặt câu hỏi tại sao các image production lại chứa các artifacts phát triển, log và thông tin nhạy cảm tiềm ẩn từ các container đang chạy.
Kết Quả Giảm Kích Thước Image:
- Kích thước image ban đầu: 800GB
 - Kích thước image cuối cùng: 2.05GB
 - Tỷ lệ giảm: 99.7%
 - Số lượng layer ban đầu: 272 layer
 - Số lượng layer cuối cùng: 1 layer (sau thao tác squash)
 
Giải Pháp Và Hàm Ý Rộng Hơn
Cuối cùng, các kỹ sư Sealos đã giải quyết khủng hoảng bằng cách phát triển một công cụ tùy chỉnh có thể loại bỏ một cách có chọn lọc các file có vấn đề và gộp 272 lớp thành một lớp hiệu quả duy nhất. Kết quả thật ấn tượng: image 800GB đã thu nhỏ chỉ còn 2.05GB — giảm 99.7%.
Tuy nhiên, cuộc tranh luận trong cộng đồng vẫn tiếp tục về việc liệu điều này có giải quyết triệu chứng hơn là căn bệnh hay không. Nhiều người lập luận rằng giải pháp thực sự nằm ở giáo dục và quy trình làm việc phù hợp: sử dụng Dockerfile cho các bản build có thể tái tạo, tách biệt môi trường phát triển và production, và hiểu rằng container không phải là máy ảo.
Sự cố đã châm ngòi cho các cuộc trò chuyện rộng hơn về thiết kế nền tảng container. Các nền tảng có nên thực thi các phương pháp hay nhất, hay chiều theo sở thích của người dùng ngay cả khi chúng có vấn đề về mặt kỹ thuật? Nhà cung cấp nền tảng chịu trách nhiệm bao nhiêu trong việc giáo dục người dùng của họ về cách sử dụng container đúng đắn?
Trường hợp này trở thành một câu chuyện cảnh tỉnh cho toàn bộ hệ sinh thái container. Khi container trở thành phương pháp triển khai mặc định cho ứng dụng, việc hiểu kiến trúc và giới hạn của chúng ngày càng trở nên quan trọng. Cơn ác mộng image 800GB chứng minh rằng sự tiện lợi mà không có hiểu biết có thể dẫn đến những hậu quả không lường trước được.
Cộng đồng container vẫn chia rẽ về việc liệu chia sẻ những câu chuyện như vậy có giúp giáo dục người khác hay đơn giản là phơi bày những vấn đề cơ bản về năng lực. Nhưng một điều rõ ràng là: khi công nghệ container trưởng thành, các phương pháp thực hành của những người sử dụng nó cũng phải trưởng thành theo.
Tham khảo: REDUCE CONTAINER IMAGE SIZE
