Docker for Backend & AI Engineers
Trang chủ / Module 6
🐘 Module 6 / 12 · 1 tuần

Docker cho PHP/Laravel

Kiến trúc php-fpm + nginx trong container, Composer, Xdebug, và Laravel Sail — áp dụng trực tiếp vào nền tảng bạn đã quen.

PHPLaravelNginx
📌 Vì sao module này quan trọng

Đây là module ứng dụng trực tiếp nhất vào công việc hiện tại của bạn — container hoá đúng cách một ứng dụng Laravel không chỉ giúp môi trường dev nhất quán giữa các thành viên team, mà còn là bước đệm quan trọng nếu bạn cần container hoá các service PHP hiện có song song với các service Python/AI mới đang xây (Module 7).

🎯 Mục tiêu học tập

  • Hiểu kiến trúc chuẩn: nginx (reverse proxy) + php-fpm (xử lý PHP) trong 2 container riêng biệt
  • Container hoá đúng cách việc cài Composer dependency
  • Cấu hình Xdebug hoạt động được từ trong container ra IDE trên máy host
  • Hiểu Laravel Sail là gì và quan hệ của nó với Docker Compose đã học ở Module 5

Kiến trúc chuẩn: Nginx + PHP-FPM

Khác với một ứng dụng Python/Node tự chạy web server tích hợp, PHP truyền thống cần php-fpm (FastCGI Process Manager — xử lý code PHP) đứng sau một web server (nginx) đóng vai trò nhận request HTTP và chuyển tiếp phần .php cho php-fpm xử lý. Mô hình container hoá chuẩn: 2 container riêng biệt trong cùng Docker Compose, chia sẻ code qua volume:

services:
  nginx:
    image: nginx:alpine
    ports:
      - "8000:80"
    volumes:
      - ./:/var/www/html
      - ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php

  php:
    build:
      context: .
      dockerfile: docker/php.Dockerfile
    volumes:
      - ./:/var/www/html

  db:
    image: mysql:8
    environment:
      - MYSQL_DATABASE=laravel
      - MYSQL_ROOT_PASSWORD=secret
# docker/nginx.conf (rút gọn) — chuyển tiếp .php sang php-fpm qua cổng nội bộ 9000
location ~ \.php$ {
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

Composer trong Dockerfile — áp dụng đúng thứ tự Cache (Module 2)

FROM php:8.3-fpm

RUN apt-get update && apt-get install -y \
        libzip-dev unzip git \
    && docker-php-ext-install pdo_mysql zip \
    && rm -rf /var/lib/apt/lists/*

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

WORKDIR /var/www/html

# Copy composer.json/lock TRƯỚC, cài dependency, rồi mới copy toàn bộ code
# — đúng nguyên tắc tối ưu cache đã học ở Module 2
COPY composer.json composer.lock ./
RUN composer install --no-scripts --no-autoloader --prefer-dist

COPY . .
RUN composer dump-autoload --optimize

Xdebug — Debug từ Container ra IDE trên Host

Cấu hình Xdebug trong container để IDE (VS Code/PhpStorm) trên máy host nhận được breakpoint — điểm mấu chốt là Xdebug bên trong container cần biết địa chỉ IP của máy host để gửi tín hiệu debug ra:

# docker/php.Dockerfile — thêm vào bản build cho môi trường dev
RUN pecl install xdebug && docker-php-ext-enable xdebug
# docker-compose.yml (chỉ cho môi trường dev)
services:
  php:
    environment:
      - XDEBUG_MODE=debug
      - XDEBUG_CONFIG=client_host=host.docker.internal

host.docker.internal là hostname đặc biệt Docker cung cấp sẵn để container gọi ngược về máy host — không cần biết IP thật của host (vốn có thể thay đổi giữa các máy dev khác nhau trong team).

Laravel Sail — Docker Compose đã được đóng gói sẵn cho Laravel

Laravel Sail thực chất là một docker-compose.yml đã được Laravel chuẩn bị sẵn (kèm image PHP tối ưu riêng cho Laravel) và một script CLI (./vendor/bin/sail) bọc quanh lệnh docker compose để gõ ngắn gọn hơn — hoàn toàn không phải công nghệ khác biệt so với những gì bạn vừa học ở Module 5, chỉ là một bộ cấu hình mẫu tiện dụng:

./vendor/bin/sail up -d      # tương đương docker compose up -d
./vendor/bin/sail artisan migrate
./vendor/bin/sail composer require some/package

Hiểu rõ Docker Compose trước (như bạn vừa học) giúp bạn tuỳ chỉnh Sail khi cần (thêm service, đổi cấu hình mạng, thêm healthcheck) thay vì bị giới hạn trong những gì Sail cung cấp sẵn — đây chính là giá trị của việc học nền tảng trước công cụ đóng gói.

🏋️ Bài tập thực hành

Container hoá 1 ứng dụng Laravel thật

Lấy 1 project Laravel có sẵn (hoặc tạo mới bằng composer create-project), viết Dockerfile cho php-fpm theo đúng thứ tự cache, cấu hình nginx làm reverse proxy, thêm MySQL với volume bền vững (Module 3). Cấu hình Xdebug và xác nhận đặt được breakpoint từ VS Code hoạt động. So sánh trải nghiệm với việc dùng Laravel Sail có sẵn cho cùng project.

📚 Tài nguyên học tập

✅ Tự đánh giá hoàn thành

  • Container hoá thành công 1 ứng dụng Laravel với nginx + php-fpm + MySQL
  • Composer dependency được cache đúng cách theo nguyên tắc Module 2
  • Cấu hình Xdebug hoạt động được từ container ra IDE trên host
  • Giải thích được Laravel Sail thực chất là gì, không phải công nghệ mới