Mẹo Build Docker Images
Docker là một nền tảng ảo hóa cấp phép mã nguồn mở, giúp bạn xây dựng, triển khai và quản lý ứng dụng một cách linh hoạt và hiệu quả trên nhiều môi trường khác nhau. Với Docker, bạn có thể đóng gói tất cả các thành phần cần thiết của ứng dụng, bao gồm mã nguồn, thư viện, biến môi trường và cấu hình vào một container độc lập.
Tuy nhiên, việc build một ứng dụng gọn nhẹ cũng cần vài thủ thuật sau đây:
SỬ DỤNG OFFICIAL IMAGES
Với độ phổ biến của Docker như hiện nay thì rất nhiều hãng phần mềm đều có image riêng của mình. Việc sử dụng những official images giúp chúng ta:
- Dockerfile gọn gàng hơn
- Bản build của chúng ta ổn định hơn (Các hãng đã test trước khi release)
- Images build ra có dung lượng nhỏ hơn (Các hãng đã tối ưu trước)
TRÁNH SỬ DỤNG LATEST IMAGES
Khi các hãng phần mềm release version mới thì đều thêm tính năng mới và xoá tính năng cũ, vì vậy nếu chúng ta sử dụng images latest thì sẽ có khả năng hệ thống trở nên không còn ổn định mỗi khi build images.
CHỌN IMAGE ALPINE
Tôn chỉ của Alpine Linux là nhỏ, đơn giản và bảo mật, những hãng phần mềm cũng không quên cung cấp những image được build từ Alpine Linux. Các image Alpine cung cấp những tính năng cần thiết để hệ thống chúng ta chạy ổn định.
Điểm cần lưu lý khi dùng những image Alpine là thiếu thư viện. Cái này nằm ở tính nhỏ gọn của nó, các nhà sản xuất chỉ cung cấp những thư viện cần thiết nhất thôi.
Ngoài Apline ra thì Docker Images Slim hay Docker Cloud cũng là những lựa chọn tốt, tùy theo từng trường hợp.
TẬN DỤNG LAYER CACHING
Khi làm việc với Docker thì việc rebuild image xảy ra rất thường xuyên, từ việc xây dựng một images tối ưu hay cập nhật những thư viện không còn tồn tại, đến việc release sử dụng quy trình CI/CD. Để tránh mất thời gian do phải chạy lại toàn bộ file Dockerfile thì Docker cung cấp tính năng Layer Caching.
Khi tiến hành build image thì Docker sẽ kiểm tra bản build trước đó, nếu như layer không thay đổi gì cả thì Docker sẽ layer từ cache luôn mà không cần phải build lại. Khi có một layer thay đổi thì kể từ layer đó trở về sau thì Docker sẽ tiến hành build.
Với cách build trên chỉ cần có file thay đổi trong project thì lệnh composer install sẽ phải chạy lại.
Do 2 files composer.json và composer.lock ít thay đổi nên chúng ta có thể tận dụng việc install các packages từ những bản build trước.
Khi làm việc với layer thì ưu tiên những lệnh build ít thay đổi ở trên (cài packages, composer, node, …), những lệnh build thay đổi thường xuyên sẽ ở dưới.
GIẢM BỚT SỐ LƯỢNG LAYER
Để xác định dung lượng docker image thì ngoài những packages mà chúng ta cài đặt thì số lượng layer cũng làm tăng dung lượng của images, càng nhiều layer thì dung lượng image càng tăng. Có 3 câu lệnh mà sẽ tạo ra layer là RUN, COPY và ADD.
Lời khuyên là sử dụng && để gom các câu lệnh lại thành một, nhằm giảm bớt số layer.
Như ví dụ trên thì thay vì phải tạo ra 9 layer thì sử dụng && giúp giảm thiểu số lượng layer được tạo ra. Tưởng tượng với hệ thống phức tạp thì giảm số lượng layer sẽ giảm đáng kể dung lượng image.
Cái khuyết điểm của việc gom các câu lệnh chính là mất đi tính năng Layer Caching, chỉ cần có sự thay đổi nhỏ cũng phải build lại cho dù muốn hay không. Cho nên việc thêm hay bớt layer cũng nên cân nhắc và tính toán cẩn thận.
KẾT LUẬN
Có một image nhỏ gọn sẽ giúp việc triển khai hệ thống nhanh hơn, cải thiện thời gian khởi động hệ thống, giảm thiểu lỗ hổng bảo mật. Việc tối ưu Docker image cần chúng ta đầu tư thời gian và công sức nhiều hơn nhưng những lợi ích nó mang lại thì không có gì để bàn cãi.
Vũ Khắc Nguyễn Web Developer |