Tối ưu hóa Dockerfile cho Laravel: Build Nhanh, Image Nhẹ với PHP 8.3 & Alpine

,

・Published on:

Khi triển khai ứng dụng Laravel lên môi trường Production, ba yếu tố quan trọng nhất mà mọi DevOps hay Developer cần quan tâm là: Tốc độ Build, Dung lượng Image, và Hiệu năng Runtime.

Hôm nay, chúng ta sẽ cùng phân tích một mẫu Dockerfile được tối ưu hóa cực tốt sử dụng php:8.3-fpm-alpine. File cấu hình này không chỉ giúp giảm dung lượng image xuống mức tối thiểu mà còn tận dụng tối đa cơ chế caching của Docker để tăng tốc độ build.

Dockerfile mẫu

Dưới đây là nội dung file cấu hình chúng ta sẽ phân tích:

Dockerfile

FROM php:8.3-fpm-alpine

WORKDIR /work/

ARG TZ

RUN apk update && \
  apk add \
  tzdata \
  nginx \
  icu-dev \
  libzip-dev \
  oniguruma-dev \
  postgresql-dev && \
  cp /usr/share/zoneinfo/${TZ} /etc/localtime && \
  echo ${TZ} > /etc/timezone && \
  docker-php-ext-install intl pdo_pgsql pgsql mbstring zip bcmath

RUN rm -rf /var/cache/apk/*

COPY ./docker/php/prod/php.ini /usr/local/etc/php/php.ini
COPY ./src/composer.json ./src/composer.lock .

COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

RUN composer install --no-dev  --no-autoloader

COPY ./src .

RUN composer dump-autoload --optimize

COPY ./docker/php/prod/startup.sh /startup.sh
COPY ./docker/nginx/nginx.conf.production /etc/nginx/nginx.conf

RUN chmod +x /startup.sh
RUN chown -R www-data:www-data /work/tda-master/storage /work/tda-master/bootstrap/cache

EXPOSE 9000

CMD ["/startup.sh"]

Phân tích chiến lược tối ưu hóa

Dưới đây là các kỹ thuật “đắt giá” đã được áp dụng trong Dockerfile này:

1. Lựa chọn Base Image: Sức mạnh của Alpine Linux

Dòng đầu tiên FROM php:8.3-fpm-alpine là quyết định quan trọng nhất.

  • Tại sao lại là Alpine? Alpine Linux là một bản phân phối Linux siêu nhẹ (chỉ khoảng 5MB). So với bản Debian/Ubuntu thông thường (hơn 100MB), việc dùng Alpine giúp image cuối cùng nhỏ gọn hơn rất nhiều, giúp việc pull/push image diễn ra nhanh chóng.
  • PHP 8.3: Sử dụng phiên bản PHP mới nhất đảm bảo hiệu năng tốt nhất (JIT compiler) và các bản vá bảo mật.

2. Gom nhóm lệnh RUN để giảm Layers

Trong Docker, mỗi chỉ thị RUN, COPY, ADD sẽ tạo ra một layer mới. Dockerfile này đã rất khéo léo khi gom việc update, cài đặt thư viện (nginx, libzip…), cấu hình Timezone và cài đặt PHP Extension vào một lệnh RUN duy nhất.

Lợi ích: Việc này giúp giảm số lượng layer trung gian, làm cho image gọn gàng hơn.

3. Chiến thuật “Layer Caching” với Composer

Đây là phần tinh tế nhất của file này nhằm tăng tốc độ Build lại (Re-build):

  1. COPY composer.jsoncomposer.lock trước.
  2. Chạy composer install.
  3. Mới COPY ./src . (mã nguồn) vào sau.

Tại sao làm vậy?

Docker cache các layer dựa trên sự thay đổi của file.

  • Nếu bạn chỉ sửa code (logic PHP) mà không cài thêm thư viện mới, Docker sẽ tự động bỏ qua bước composer install (vì composer.lock không đổi) và lấy từ cache ra dùng ngay.
  • Điều này giúp giảm thời gian build từ vài phút xuống còn vài giây.

4. Multi-stage Copy cho Composer

Thay vì phải tải script cài đặt composer, xác thực hash, rồi cài đặt php cli để chạy setup… Dockerfile này dùng một kỹ thuật hiện đại:

Dockerfile

COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

Nó copy thẳng file thực thi composer từ image chính chủ của Composer sang image của chúng ta. Cực kỳ nhanh, sạch sẽ và an toàn.

5. Tối ưu hóa cho Production

File config cũng áp dụng các flag quan trọng cho môi trường production:

  • --no-dev: Không cài đặt các thư viện dev (như phpunit, faker…) -> Giảm dung lượng.
  • --no-autoloader (ở bước đầu) và dump-autoload --optimize (ở bước sau): Tạo ra class map tĩnh, giúp PHP load class nhanh hơn rất nhiều so với việc quét file system động.

6. Tích hợp Nginx (Sidecar pattern)

Dockerfile này cài đặt nginx ngay bên trong (apk add nginx). Điều này cho thấy container này có thể sẽ chạy cả PHP-FPM và Nginx cùng lúc (thông qua /startup.sh).

  • Ưu điểm: Triển khai đơn giản, 1 container là chạy được web server hoàn chỉnh, không cần cấu hình networking phức tạp giữa container nginx và container php.

Kết luận

Đây là một mẫu Dockerfile chuẩn mực cho các dự án Laravel hiện đại, ưu tiên tốc độ và hiệu quả tài nguyên. Việc kết hợp giữa Alpine Linux, Docker Layer CachingComposer Optimization tạo ra một môi trường Production mạnh mẽ và tin cậy.