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.
Đâ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
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
-
Laravel — Sail documentationTài liệu chính thức Laravel SailDocs
-
Docker Official Images — phpImage PHP chính thức trên Docker HubHub
-
Xdebug — Docker/container setupHướng dẫn chính thức cấu hình Xdebug step debuggingDocs
✅ 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