0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Tối ưu hóa Docker Image: Giảm Kích Thước Để Triển Khai Nhanh Hơn

Đăng vào 1 tháng trước

• 4 phút đọc

Chủ đề:

Docker

Tối ưu hóa Docker Image: Giảm Kích Thước Để Triển Khai Nhanh Hơn

Vài tháng trước, trong quá trình triển khai một dự án quan trọng cho khách hàng, tôi đã gặp phải vấn đề nghiêm trọng: thời gian triển khai quá lâu. Nguyên nhân là do các Docker image có kích thước quá lớn, dẫn đến việc không chỉ gây khó khăn trong quá trình làm việc mà còn làm tăng thời gian ngừng hoạt động, điều này là không thể chấp nhận.

Bài Học Quan Trọng

Kinh nghiệm này đã dạy tôi rằng những thay đổi nhỏ có thể tạo ra tác động lớn. Nhờ tối ưu hóa Docker image, tôi đã giảm một nửa thời gian triển khai, giảm chi phí lưu trữ và cải thiện hiệu quả quy trình CI/CD tổng thể. Hôm nay, tôi sẽ chia sẻ các chiến lược mà tôi đã áp dụng để đạt được sự tối ưu hóa này. Hãy cùng theo dõi!

Tại Sao Phải Tối Ưu Hóa Docker Image?

Nếu bạn đã từng phải đối mặt với các vấn đề như build chậm chạp, thời gian triển khai lâu hoặc một registry chứa đầy các image quá khổ, thì bạn không đơn độc. Dưới đây là một số lý do tại sao việc giảm kích thước image là rất quan trọng:

  • Cải Thiện Tốc Độ Build: Chu kỳ phát triển nhanh hơn cho phép tập trung vào công việc quan trọng hơn.
  • Tiết Kiệm Lưu Trữ: Image nhỏ giúp tiết kiệm dung lượng ổ đĩa trong Docker registry và trên máy của bạn.
  • Triển Khai Nhanh Hơn: Triển khai các image nhỏ qua mạng diễn ra nhanh hơn nhiều.
  • Tăng Cường Bảo Mật: Ít thành phần hơn đồng nghĩa với ít lỗ hổng bảo mật hơn.

7 Chiến Lược Hiệu Quả Để Tối Ưu Hóa Docker Image

1. Chọn Base Image Tối Thiểu

Thay vì bắt đầu với các image lớn như ubuntu:latest, tôi đã chuyển sang sử dụng alpine. Chỉ với thay đổi này, kích thước image của tôi đã được giảm từ 800MB xuống dưới 30MB.

Ví dụ:

dockerfile Copy
FROM alpine:latest

2. Sử Dụng Multi-Stage Builds

Trong nhiều dự án, như ứng dụng React, có các dependency build (như Node.js và npm) chỉ cần thiết trong quá trình build. Bằng cách sử dụng multi-stage builds, tôi tách môi trường build khỏi môi trường runtime, từ đó giảm kích thước image đáng kể.

Ví dụ Multi-Stage Build cho Ứng Dụng React:

dockerfile Copy
# Giai đoạn Build
FROM node:16 AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build

# Giai đoạn Runtime
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]

3. Xóa Các File Không Cần Thiết

Trong quá trình debug, chúng tôi thường vô tình bao gồm các file tạm thời trong bản build. Để đảm bảo những file này không xuất hiện trong image, tôi thêm file .dockerignore:

Ví dụ về .dockerignore:

Copy
node_modules
*.log
.git

4. Kết Hợp và Tối Thiểu Các Layer

Mỗi lệnh trong Dockerfile (ví dụ: RUN, COPY) tạo ra một layer mới. Quá nhiều layer có thể làm tăng kích thước image. Kết hợp nhiều lệnh thành một câu lệnh RUN giúp giảm số lượng layer và tối ưu hóa image.

Ví dụ:

Thay vì:

dockerfile Copy
RUN apt-get update  
RUN apt-get install -y curl vim  
RUN apt-get clean  
RUN rm -rf /var/lib/apt/lists/*

Kết hợp thành:

dockerfile Copy
RUN apt-get update && apt-get install -y curl vim \  
    && apt-get clean && rm -rf /var/lib/apt/lists/*

5. Tránh Cài Đặt Các Dependency Không Cần Thiết

Ban đầu, Docker image của tôi có cài thêm các thư viện không cần thiết. Nhận ra điều này, tôi đã chỉ cài đặt những dependency thực sự cần thiết, giúp giữ cho image nhỏ và an toàn hơn.

6. Sử Dụng Docker-Slim

Một công cụ hữu ích trong quy trình tối ưu hóa của tôi là docker-slim. Nó tự động phân tích image và giảm kích thước bằng cách loại bỏ các phần không cần thiết mà không ảnh hưởng đến chức năng.

Lệnh để giảm kích thước image:

bash Copy
docker-slim build <tên-image>

7. Thường Xuyên Kiểm Tra và Loại Bỏ Image

Docker image tích lũy theo thời gian và các image không sử dụng có thể chiếm dụng dung lượng quý giá. Thường xuyên kiểm tra và loại bỏ các image không sử dụng giúp duy trì môi trường sạch sẽ.

Lệnh để loại bỏ image không sử dụng:

bash Copy
docker system prune -f

Lệnh để xóa tất cả các image không sử dụng:

bash Copy
docker image prune -a -f

Kết Luận

Việc tối ưu hóa Docker image có thể được xem là một nhiệm vụ nhỏ, nhưng lợi ích mang lại cho quy trình làm việc là rất lớn. Dù bạn làm việc một mình hay là một phần của đội nhóm, những chiến lược này có thể tạo ra sự khác biệt đáng kể.

Vậy bạn còn chần chừ gì nữa? Hãy nghiên cứu Dockerfile của bạn, bắt đầu tối ưu hóa và tận hưởng những lợi ích từ việc triển khai nhanh hơn và gọn nhẹ hơn.
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào