Hầu hết các lập trình viên “học” Docker bằng cách sao chép một Dockerfile từ Stack Overflow và coi như xong. Nhưng nếu bạn thực sự muốn hiểu về container, giới hạn của chúng, những đặc điểm kỳ lạ của chúng, và cách làm chủ chúng, bạn cần phải thực hành. Dưới đây là 5 dự án thực tế sẽ giúp bạn nâng cao kỹ năng Docker nhanh chóng.
Liệu chúng có phải là thứ bạn sẽ dùng hàng ngày? Không. Liệu chúng có thể giúp bạn trong một tình huống kỳ lạ nào đó trong 5 năm tới? Có thể, hoặc ít nhất đó là hy vọng của tôi.
1. Tạo Docker Image nhỏ nhất có thể mà không làm hỏng mọi thứ
Bạn đã có một dự án rồi. Có thể đó là một frontend Next.js hoặc một API Flask. Thử thách của bạn là: cắt giảm image càng nhiều càng tốt. Đừng chỉ thay đổi base image. Thực sự loại bỏ các tệp và lớp cho đến khi container ngừng hoạt động.
Sau đó, tìm hiểu lý do tại sao nó lại hỏng. Cố gắng khắc phục. Thử lại. Làm cho nó nhỏ hơn.
Bạn sẽ học được những gì ứng dụng của bạn thực sự cần, cách hoạt động của các lớp, và cách mà các phụ thuộc âm thầm len lỏi vào.
Bạn nên tìm hiểu các công cụ như docker history
hoặc dive
để xem thực sự bên trong có gì.
2. Cố gắng Dockerize một thứ không nên Dockerize
Chọn một thứ gì đó cảm giác sai sai. Spotify. Một IDE đồ họa. Môi trường desktop Linux đầy đủ của bạn. Thậm chí là Windows.
Thử container hóa nó. Phần lớn sẽ không thành công.
Đó là mục đích. Khi nó gãy, hãy tự hỏi tại sao. Liệu đó có phải là một giới hạn của Docker? Một vấn đề của kernel? Một phụ thuộc phần cứng? Một giả định về đầu ra đồ họa?
Bạn sẽ không hoàn toàn hiểu Docker cho đến khi thử làm điều gì đó kỳ quặc và chứng kiến nó sụp đổ.
3. Xây dựng một Base Image từ Scratch
Hầu hết mọi người viết Dockerfile như sau:
FROM node
FROM ubuntu
Bây giờ làm khác đi. Sử dụng như sau:
FROM scratch
Và tự xây dựng base image của riêng bạn để chạy ứng dụng.
Bạn sẽ tìm hiểu cách các tệp vào container. Bạn sẽ hiểu ứng dụng cần gì để chạy. Bạn sẽ thấy tại sao một số người dùng Alpine và một số người thì không. Bạn sẽ khám phá glibc là gì. Bạn sẽ hiểu cách CMD và ENTRYPOINT thực sự hoạt động.
Điều này không thực tế cho sản xuất nhưng cực kỳ hữu ích để hiểu cách các container hoạt động. (Vui lòng, vì tất cả những gì linh thiêng, chỉ sử dụng image bình thường trong sản xuất.)
4. Tham số hóa các Docker Builds của bạn
Các dự án mã nguồn mở thường công bố nhiều biến thể của Docker image. Một cái dựa trên Debian. Cái khác dựa trên Alpine. Một cái được tối ưu cho kích thước. Một cái khác dùng để debug. Một số hỗ trợ nhiều kiến trúc CPU.
Hãy thử xây dựng một cái gì đó tương tự. Học cách sử dụng build arguments. Học cách viết logic điều kiện trong Dockerfile. Học cách tạo ra nhiều kết quả từ một pipeline duy nhất.
Quan trọng nhất, tìm ra cách tránh phải viết lại logic nhàm chán ấy mãi.
5. Chơi trò “Nếu tôi chạy các đoạn mã không đáng tin cậy”
Hãy tưởng tượng bạn muốn chạy mã không tin cậy trong Docker containers. Một người dùng tải lên một script và backend của bạn thực thi nó. Bạn cần làm gì để bảo mật việc đó?
Hãy thử nó. Thực sự chạy mã không tin cậy trong một container và sau đó bắt đầu khóa mọi thứ lại.
Khám phá seccomp profiles. Đặt containers thành chỉ đọc. Sử dụng user namespaces. Giảm bớt khả năng. Cố gắng nâng cao quyền. Thử thoát khỏi sandbox của chính mình.
Đây là ranh giới nơi Docker kết thúc và việc sandboxing thực sự bắt đầu.
Dự án Bonus: Bỏ qua Docker CLI hoàn toàn
Docker chỉ là một frontend. Phía sau nó là các công cụ khác như BuildKit, containerd, và các đặc tả image.
Hãy thử bỏ qua Docker hoàn toàn.
Sử dụng buildctl trực tiếp. Tạo một OCI image thủ công. Đẩy nó lên một registry mà không sử dụng docker push. Đọc đặc tả OCI image và thử sao chép những gì Docker làm.
Làm điều này sẽ phá vỡ mô hình tư duy của bạn về Docker và thay thế nó bằng một cái chính xác hơn rất nhiều.
Danh sách này có đầy đủ không? Chắc chắn là không. Luôn luôn có nhiều điều để học, nhưng tôi hy vọng nó sẽ thúc đẩy bạn đào sâu hơn.
Hy vọng nó sẽ giúp ích kha khá cho các bạn!