Hành Trình DevOps Tuần 13: Xây Dựng Docker Đa Giai Đoạn
Trong tuần thứ 13 của hành trình DevOps, tôi đã triển khai một ứng dụng Node.js lên AWS EC2 và so sánh giữa xây dựng Docker một giai đoạn và đa giai đoạn. Dưới đây là những gì tôi đã học được 👇
Giới thiệu
Việc tối ưu hóa kích thước hình ảnh Docker là một phần quan trọng trong quy trình DevOps. Kích thước nhỏ hơn không chỉ giúp giảm thời gian tải lên và tải xuống mà còn giúp tiết kiệm tài nguyên máy chủ và tăng cường bảo mật. Trong bài viết này, chúng ta sẽ khám phá sự khác biệt giữa Dockerfile đơn giản và Dockerfile đa giai đoạn.
Dockerfile Đơn Giản
Cấu trúc
- Sử dụng hình ảnh Node.js đầy đủ: Hình ảnh này bao gồm tất cả các công cụ xây dựng và phụ thuộc cần thiết cho ứng dụng.
- Kích thước cuối cùng: 1.2GB
dockerfile
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "app.js"]
Nhược điểm
- Kích thước lớn làm chậm quy trình CI/CD.
- Bao gồm nhiều gói OS không cần thiết, làm tăng nguy cơ bảo mật.
Dockerfile Đa Giai Đoạn
Cấu trúc
- Giai đoạn xây dựng: Biên dịch và chuẩn bị ứng dụng.
- Giai đoạn chạy: Chỉ sao chép những phần thiết yếu.
- Cơ sở: Hình ảnh distroless.
- Kích thước cuối cùng: 3MB 😍
dockerfile
# Giai đoạn xây dựng
FROM node:14 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# Giai đoạn chạy
FROM gcr.io/distroless/nodejs:14
WORKDIR /app
COPY --from=build /app/dist ./
CMD ["node", "app.js"]
Ưu điểm
- Kích thước nhỏ giúp đẩy và kéo nhanh hơn, làm cho quy trình CI/CD mượt mà hơn.
- Giảm sử dụng tài nguyên trên máy chủ.
- Bảo mật hơn vì không có các gói OS không cần thiết.
Tại Sao Điều Này Quan Trọng Trong DevOps
- Môi trường sản xuất cần hình ảnh nhẹ: Giúp tiết kiệm thời gian và tài nguyên.
- Quá trình CI/CD nhanh hơn: Hình ảnh nhỏ hơn giúp đẩy và kéo dễ dàng hơn.
- Giảm thiểu rủi ro bảo mật: Không có gói OS không cần thiết làm giảm bề mặt tấn công.
Thực Hành Tốt Nhất
- Sử dụng hình ảnh đa giai đoạn: Hãy luôn xem xét việc sử dụng Dockerfile đa giai đoạn để tối ưu hóa kích thước hình ảnh.
- Thường xuyên cập nhật hình ảnh: Hãy đảm bảo rằng bạn sử dụng các phiên bản mới nhất của các hình ảnh cơ sở để tận dụng các tính năng bảo mật và hiệu suất mới.
- Kiểm tra bảo mật: Sử dụng các công cụ kiểm tra bảo mật để phát hiện các lỗ hổng trong hình ảnh Docker của bạn.
Những Cạm Bẫy Thường Gặp
- Không tách biệt các giai đoạn: Nếu không phân chia rõ ràng giữa các giai đoạn xây dựng và chạy, bạn có thể gặp khó khăn trong việc tối ưu hóa hình ảnh.
- Sao chép tất cả tệp: Chỉ sao chép những tệp cần thiết vào giai đoạn chạy để giảm kích thước hình ảnh.
Mẹo Tối Ưu Hiệu Suất
- Xóa các tệp tạm thời: Đảm bảo rằng bạn xóa các tệp không cần thiết sau khi hoàn thành việc xây dựng.
- Sử dụng cache: Tận dụng cache trong Docker để tăng tốc độ xây dựng.
Giải Quyết Vấn Đề
- Hình ảnh quá lớn: Kiểm tra các giai đoạn xây dựng, đảm bảo không có tệp không cần thiết được sao chép.
- Lỗi khi triển khai: Xem lại các bước trong Dockerfile để đảm bảo không có sai sót trong cú pháp.
Kết Luận
Việc sử dụng Dockerfile đa giai đoạn là một cách hiệu quả để tối ưu hóa kích thước hình ảnh Docker, đồng thời cải thiện quy trình CI/CD của bạn. Hãy thử nghiệm với các hình ảnh của bạn và xem sự khác biệt mà nó mang lại.
🔗 Kiểm tra triển khai của tôi tại GitHub Repo
🌐 Xem thêm về tôi tại Trang web cá nhân
Câu Hỏi Thường Gặp (FAQ)
Docker là gì?
Docker là một nền tảng cho phép bạn phát triển, triển khai và chạy ứng dụng trong các container.
Hình ảnh Docker là gì?
Hình ảnh Docker là một tập hợp các tệp cần thiết để chạy một ứng dụng trong một container.
Multi-stage build là gì?
Multi-stage build là một kỹ thuật cho phép bạn sử dụng nhiều Dockerfile trong một quá trình xây dựng để tối ưu hóa kích thước hình ảnh cuối cùng.
Từ khóa: Docker, Xây dựng đa giai đoạn, Dockerfile Node.js, AWS EC2, Hình ảnh distroless, Thực tiễn tốt nhất DevOps, Tối ưu hóa hình ảnh Docker, Học DevOps.