Link to original video by Better Stack
Docker Image BEST Practices - From 1.2GB to 10MB

Tóm tắt ngắn:
- Video hướng dẫn tối ưu kích thước hình ảnh Docker, giảm từ 1.2GB xuống còn 10MB.
- Các điểm chính bao gồm: lựa chọn hình ảnh cơ sở tối ưu (Alpine, Distroless), tận dụng tối đa bộ nhớ đệm lớp (layer caching) trong Dockerfile, sử dụng
.dockerignore
để loại bỏ các tập tin không cần thiết, hiểu cách hoạt động của các lớp (layer) trong Docker và áp dụng kỹ thuật xây dựng đa giai đoạn (multi-stage builds). Công nghệ được đề cập: Node.js, React, Alpine Linux, Distroless, Nginx. - Ứng dụng và tác động: Giảm chi phí lưu trữ, tăng tốc độ triển khai, cải thiện khả năng mở rộng và bảo mật. Đặc biệt hữu ích khi sử dụng Kubernetes.
- Các phương pháp được mô tả chi tiết: Viết Dockerfile hiệu quả, sử dụng
.dockerignore
, tối ưu hóa các lớp Docker, xây dựng đa giai đoạn.
Tóm tắt chi tiết:
Video được chia thành các phần chính sau:
Phần 1: Giới thiệu và lý do cần tối ưu hình ảnh Docker:
- Video bắt đầu bằng việc giới thiệu về việc giảm kích thước hình ảnh Docker từ 1.2GB xuống 10MB. Tác giả nhấn mạnh tầm quan trọng của việc này, không chỉ giảm chi phí lưu trữ mà còn ảnh hưởng đến thời gian triển khai, khả năng mở rộng và bảo mật, đặc biệt là khi sử dụng Kubernetes. "Every megabyte counts".
Phần 2: Chọn hình ảnh cơ sở tối ưu:
- Tác giả chỉ ra việc sử dụng
node:latest
(hoặc các hình ảnh tương tự nhưpython:latest
) là không hiệu quả, ví von như "dùng tàu chở hàng để gửi thư". - Giải pháp là sử dụng hình ảnh Alpine (
node:alpine
,python:alpine
), chỉ có 155MB, giảm kích thước xuống còn 250MB. Alpine được thiết kế tối ưu cho container, loại bỏ các thành phần không cần thiết. - Tác giả cũng đề cập đến Distroless images của Google, không có hệ điều hành, chỉ chứa ứng dụng và runtime, nhưng phức tạp hơn trong thiết lập.
Phần 3: Tận dụng bộ nhớ đệm lớp (Layer Caching):
- Tác giả minh họa vấn đề: thay đổi một dòng code nhỏ cũng dẫn đến việc xây dựng lại toàn bộ hình ảnh.
- Giải pháp là sắp xếp Dockerfile hợp lý, đặt các lệnh ít thay đổi (ví dụ:
COPY package.json
) lên trên, các lệnh thay đổi thường xuyên (ví dụ:COPY .
) xuống dưới. Điều này giúp tận dụng bộ nhớ đệm lớp, chỉ xây dựng lại các lớp đã thay đổi. Ba yếu tố làm mất hiệu lực bộ nhớ đệm: thay đổi file được copy, thay đổi lệnh Dockerfile, thay đổi lớp trước đó.
Phần 4: Loại bỏ các tập tin không cần thiết bằng .dockerignore
:
- Tác giả giải thích việc copy toàn bộ thư mục (bao gồm
node_modules
) vào hình ảnh là không cần thiết vìnode_modules
sẽ được cài đặt lại trong hình ảnh. - Sử dụng
.dockerignore
để loại bỏ các tập tin không cần thiết nhưnode_modules
, các tập tin tạm thời và thông tin bảo mật.
Phần 5: Hiểu về Layer Squashing và Xây dựng đa giai đoạn (Multi-stage builds):
- Tác giả giải thích rằng việc xóa file trong các lệnh
RUN
riêng biệt không làm giảm kích thước hình ảnh vì các lớp Docker là bất biến. - Giải pháp là nhóm các lệnh xóa file vào một lệnh
RUN
duy nhất để chỉ giữ lại trạng thái cuối cùng. - Tác giả giới thiệu kỹ thuật xây dựng đa giai đoạn: sử dụng một stage để build ứng dụng (Node.js, npm), và một stage khác (Nginx) để phục vụ file tĩnh, loại bỏ các thành phần không cần thiết trong hình ảnh cuối cùng.
Phần 6: Công cụ hỗ trợ:
- Giới thiệu hai công cụ:
dive
(khám phá các lớp trong hình ảnh) vàslim
(tối ưu hóa hình ảnh, giảm kích thước lên đến 30 lần).
Kết luận:
- Video kết thúc bằng việc đạt được mục tiêu giảm kích thước hình ảnh xuống còn 10MB bằng cách áp dụng các kỹ thuật đã đề cập. Tác giả khuyến khích người xem đăng ký kênh và chia sẻ ý kiến.