6.1 Làm quen với tối ưu hoá images
Docker-images tuy nhỏ gọn, nhưng vẫn chiếm không gian lưu trữ. Vì vậy, việc giảm kích thước của chúng là một nhiệm vụ quan trọng, giúp cải thiện hiệu suất, tăng tốc độ tải và triển khai container, cũng như giảm chi phí lưu trữ. Bạn có thể tối ưu hoá image bằng cách cải thiện Dockerfile, vì nó có thể được tổ chức theo nhiều cách khác nhau. Trong bài giảng này, chúng ta sẽ xem xét một số chiến lược và nguyên tắc tốt nhất để tạo ra các Docker-image tối ưu và nhẹ.
Tại sao quan trọng giảm kích thước Docker-image?
- Tăng tốc độ triển khai: images nhỏ hơn sẽ nhanh hơn khi tải từ registry của Docker và triển khai vào container, điều này đặc biệt quan trọng trong hệ thống CI/CD tự động hoá.
- Sử dụng tài nguyên hiệu quả: images nhẹ ngốn ít dung lượng ổ cứng hơn, tiết kiệm tài nguyên mạng khi truyền tải và đảm bảo sử dụng hiệu quả hơn sức mạnh tính toán.
- An toàn: images nhỏ hơn thường chứa ít thành phần không cần thiết hơn, giảm nguy cơ tồn tại lỗ hổng bảo mật tiềm tàng.
- Đơn giản hoá việc cập nhật: cập nhật các images nhẹ diễn ra nhanh hơn và yêu cầu ít tài nguyên hơn, giúp đẩy nhanh quá trình hỗ trợ.
6.2 Chiến lược giảm kích thước Docker image
1. Sử dụng base image tối giản
Việc chọn base image ảnh hưởng trực tiếp đến kích thước Docker image cuối cùng. Sử dụng các base image tối giản như alpine
có thể giúp giảm kích thước đáng kể.
Ví dụ:
Thay thế image ubuntu
bằng alpine
:
# FROM ubuntu:20.04
FROM alpine:3.12
alpine
là một bản phân phối Linux siêu nhẹ, chỉ chiếm khoảng 5 MB, trong khi image ubuntu
có thể chiếm hàng trăm megabyte.
2. Giảm số lượng layer
Mỗi lệnh trong Dockerfile tạo ra một layer mới trong image. Kết hợp nhiều lệnh vào một lệnh RUN
giúp giảm số lượng layer, từ đó giảm kích thước tổng thể của image.
Ví dụ:
Trước khi tối ưu:
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y git
RUN rm -rf /var/lib/apt/lists/*
Sau khi tối ưu:
RUN apt-get update && apt-get install -y curl git && rm -rf /var/lib/apt/lists/*
Xóa cache của trình quản lý gói (rm -rf /var/lib/apt/lists/*)
cũng giúp giảm kích thước image bằng cách xóa các file tạm thời tạo ra trong quá trình cài đặt.
3. Xóa file tạm thời
Xóa các file tạm thời và dữ liệu không cần thiết sau khi cài đặt các gói giúp giữ image sạch và nhẹ.
Ví dụ:
RUN apt-get update && apt-get install -y curl git && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
4. Sử dụng .dockerignore
File .dockerignore
giúp loại trừ các file và thư mục không cần thiết khỏi context build, giúp giảm kích thước image và tăng tốc quá trình build.
Ví dụ .dockerignore
:
node_modules
dist
*.log
Dockerfile*
.dockerignore
5. Multi-stage builds
Multi-stage builds cho phép sử dụng nhiều image tạm thời để tạo ra một image nhẹ cuối cùng, chỉ chứa các file và dependency cần thiết.
Ví dụ:
# Giai đoạn build
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# Giai đoạn cuối cùng
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
Trong ví dụ này, giai đoạn đầu tiên tạo ra một build của ứng dụng, và giai đoạn cuối cùng chỉ sử dụng kết quả của build để giảm kích thước image cuối cùng.
6. Tối ưu hóa việc cài đặt package
Cài đặt chỉ các package cần thiết và sử dụng các tùy chọn của trình quản lý gói để cài đặt tối thiểu giúp giảm kích thước image.
Ví dụ:
Sử dụng tham số --no-install-recommends
với apt-get
:
RUN apt-get update && apt-get install -y --no-install-recommends curl git && \
rm -rf /var/lib/apt/lists/*
7. Nén và tối giản dữ liệu
Sử dụng các công cụ để nén và tối giản dữ liệu giúp giảm kích thước image.
Ví dụ:
Nén file văn bản và log:
RUN gzip /path/to/large/file.log
8. Xóa thư viện và dependency không dùng đến
Xóa các thư viện và dependency không được sử dụng sau khi cài đặt các gói cần thiết giúp giữ image nhẹ.
Ví dụ:
Cho ứng dụng Python:
RUN pip install --no-cache-dir -r requirements.txt
6.3 Ví dụ về Dockerfile được tối ưu hóa
Ví dụ 1: Dockerfile tối ưu hóa cho Node.js
FROM node:14-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
Ví dụ này sử dụng build đa giai đoạn. Đầu tiên ứng dụng được build trong giai đoạn trung gian, sau đó chỉ kết quả build được sao chép vào image cuối cùng dựa trên Nginx.
Ví dụ 2: Dockerfile tối ưu hóa cho Python
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
Trong ví dụ này, một image cơ bản nhẹ là python:3.9-slim
được sử dụng. Việc cài đặt các dependencies được đặt vào một bước riêng, cho phép sử dụng cache của Docker nếu file requirements.txt
không thay đổi.
GO TO FULL VERSION