Làm thế nào để giảm dung lượng của Docker image?
This post hasn't been updated for 3 years
Giới thiệu
Trong quá trình tìm hiểu Docker thì mình nhận thấy đa số image mà mình build được đều có dung lượng khá lớn. Để đủ các thành phần cho dự án thì kiểu gì cũng sẽ có ít nhất từ 1GB trở lên.
Vì sao lại cần giảm dung lượng?
Nhưng vì sao lại cần giảm dung lượng, khi mà với điều kiện hiện tại dung lượng và ổ nhớ lại khá là rẻ?
- Theo mình hiểu thì giảm dung lượng image Docker build được là cách tiếp cận tốt nhất
- Cài đặt và giữ những phần không cần thiết ở trong image có thể làm tăng độ phức tạp và khả năng tạo ra lỗ hổng ở trong dự án
- Khi bạn upload/download image, hoặc chạy container thì nó sẽ khá là tốn thời gian
Làm thế nào để giảm dung lượng?
Sau đây mình xin chia sẻ một số phương pháp mình tìm được để giảm dung lượng Docker image sau khi build.
Sử dụng base image có dung lượng nhỏ hơn
Docker base image là một image cơ bản mà bạn có thể thêm những thành phần cần thiết để build image của bạn. Sẽ có rất nhiều base image khác nhau, mỗi base image sử dụng một OS khác nhau. Đây là thành phần đóng vai trò chủ yếu trong việc giảm dung lượng của Docker image mà bạn build.
Ví dụ như thay vì sử dụng những base image có OS là Ubuntu thì bạn có thể sử dụng base image dựa trên Alpine, một phiên bản Linux đơn giản đã loại bỏ một số thành phần như bash, curl để giảm dung lượng image. Ubuntu có dung lượng là 188MB, trong khi đó Alpine chỉ có 5MB.
Sử dụng file .dockerignore
Loại bỏ những file không cần thiết có thể giúp giảm dung lượng image của bạn. Và đây là tác dụng của file .dockerignore
.
Giống như cách hoạt động của file .gitignore
, bạn có thể viết ra những file/folder cần loại bỏ sau quá trình build như: git files, vendor/node_modules folder,...
Sử dụng chức năng Multi-Stage Build của Docker
Về chức năng này mình vẫn còn đang tìm hiểu nên chưa đủ độ hiểu biết để chia sẻ với các bạn. Nhưng theo mình hiểu thì multi-stage build sẽ chia Dockerfile ra nhiều stage, và truyền các artifacts? từ stage này sang stage khác. Bằng cách này thì sau khi build image của bạn chỉ có artifact cần thiết mà không có những thành phần thừa khác.
Tránh thêm những layer không cần thiết
Khi sử dụng directive RUN
, bạn có thể gộp chung lại những command tương tự với nhau. Ví dụ như thay vì:
RUN npm install
RUN npm run dev
Thì bạn có thể viết như sau để gộp 2 layer lại với nhau:
RUN npm install && npm run dev
Hoặc như sau thay vì 3 dòng RUN riêng biệt:
RUN apt-get install -y \
package-1 \
package-2 \
package-3
Tránh những package và dependency không cần thiết
Khi cài đặt những package cho dự án, bạn có thể sử dụng option --no-install-recommends
để tránh cài đặt những package mà về cơ bản là không cần thiết cho package mà bạn cài nhưng lại được recommend nên cài.
Dọn dẹp sau khi cài package
Bạn có thể sử dụng lệnh rm -rf /var/lib/apt/lists/*
hoặc yum clean all
sau khi cài các package để dọn dẹp.
Sử dụng trang web fromlatest.io
Có một công cụ mà mình đã sử dụng thử đó là trang web fromlatest.io
, khi bạn đưa nội dung file Dockerfile vào đây nó sẽ giúp bạn đưa ra những step cần thiết nhằm tối ưu hóa image của bạn.
Tổng kết
Tham khảo:
All Rights Reserved