Series Dockerize Laravel Thực chiến #1: Kỷ nguyên vứt bỏ XAMPP & Khởi tạo dự án "Không rác"
1. Tại sao Laravel trong Docker lại đặc biệt?
Khác với Golang (chỉ cần build ra 1 file nhị phân) hay Node.js (dạy 1 container chạy npm start), để chạy một ứng dụng Laravel hoàn chỉnh, bạn cần một mô hình kiến trúc gồm nhiều lớp kết hợp với nhau (LEMP Stack):
- Nginx (Web Server): Đứng ngoài cùng, làm nhiệm vụ đón nhận các HTTP request từ người dùng (hoặc từ Load Balancer). Nginx không hiểu code PHP, nó chỉ phục vụ các file tĩnh (CSS, JS, hình ảnh).
- PHP-FPM (Bộ xử lý): Khi có một request đòi hỏi logic (như query database, kiểm tra phân quyền), Nginx sẽ ném request đó qua cho container PHP-FPM xử lý.
- MySQL/MariaDB (Database): Nơi lưu trữ dữ liệu.
- Redis (Cache/Queue): Dùng để xử lý các Job chạy ngầm hoặc tăng tốc độ hệ thống.
Chính vì cần nhiều thành phần giao tiếp với nhau, việc chia nhỏ chúng ra thành các container riêng biệt là bắt buộc để đảm bảo hiệu năng và dễ dàng mở rộng (scale) sau này.
2. Tuyệt kỹ Khởi tạo dự án không cần cài PHP
Bình thường, để tạo một project Laravel mới, bạn sẽ mở Terminal và gõ: composer create-project laravel/laravel my-project
Nhưng khoan đã! Việc gõ lệnh này đòi hỏi máy tính của bạn phải được cài sẵn PHP và Composer. Thế thì còn gọi gì là "Dockerize"? Chúng ta muốn một cái máy tính trắng tinh vẫn phải code được.
Giải pháp của những kỹ sư DevOps: Mượn một container Composer dùng một lần để tải code về.
docker run --rm \
-u "$(id -u):$(id -g)" \
-v $(pwd):/var/www/html \
-w /var/www/html \
composer:latest \
composer create-project --prefer-dist laravel/laravel afc-campaign-manager
Giải mã ma thuật của câu lệnh trên:
- --rm: Chạy xong việc (tải code) thì container Composer này tự động tự sát, không để lại rác trên máy.
- -v $(pwd):/var/www/html: Gắn thư mục hiện tại của bạn vào đường dẫn /var/www/html bên trong container.
- -u "(id -g)": Ép container chạy dưới quyền user hiện tại của bạn (cực kỳ quan trọng trên Linux để khi code tải về, bạn không bị lỗi Permission denied khi mở bằng VS Code).
- Đoạn cuối cùng chính là lệnh khởi tạo dự án quen thuộc. Ở đây, tôi đặt tên dự án là afc-campaign-manager.
Bạn đi pha một ly cà phê, quay lại sẽ thấy thư mục afc-campaign-manager với đầy đủ mã nguồn Laravel mới nhất hiện ra trên máy, mà bạn không hề phải cài một dòng PHP nào vào hệ điều hành gốc.
3. Tổ chức lại cấu trúc thư mục chuẩn DevOps
Bước tiếp theo, di chuyển vào thư mục dự án vừa tạo:
Bạn hãy mở Terminal (trên Linux/Mac hoặc Git Bash trên Windows) tại thư mục muốn chứa code, và gõ lệnh sau:
cd afc-campaign-manager
Để dự án gọn gàng và phân tách rõ ràng giữa "Mã nguồn" và "Hạ tầng", bạn đừng vứt bừa bãi các file cấu hình Docker ra thư mục gốc. Hãy tạo một thư mục riêng tên là docker để chứa mọi thứ liên quan đến môi trường:
mkdir docker
mkdir docker/nginx
mkdir docker/php
Cấu trúc thư mục của bạn lúc này sẽ trông như thế này:
afc-campaign-manager/
├── app/
├── bootstrap/
├── config/
├── docker/ <-- Nơi chứa "vũ khí" của chúng ta
│ ├── nginx/
│ │ └── default.conf <-- Cấu hình điều hướng của Web Server
│ └── php/
│ ├── Dockerfile <-- Bản vẽ tự động cài extension cho PHP
│ └── local.ini <-- Cấu hình tinh chỉnh PHP (upload size, memory limit)
├── public/
├── routes/
├── docker-compose.yml <-- "Bản giao hưởng" kết nối các container
└── ... (các file khác của Laravel)
Tổng kết Bài 1
Bạn đã thành công trong việc khởi tạo một nền tảng Laravel sạch sẽ và thiết lập được tư duy kiến trúc LEMP đa tầng. Phương pháp dùng container tạm thời để kéo code về không chỉ áp dụng cho Laravel mà còn cho bất kỳ Framework nào khác, giúp máy tính cá nhân của bạn luôn "trinh nguyên".
Mã nguồn đã có, thư mục đã lên khung. Ở Bài 2, chúng ta sẽ tự tay viết nội dung cho các file Dockerfile của PHP-FPM, tinh chỉnh Nginx để nó biết cách "bắt tay" với PHP, và dùng docker-compose để triệu hồi toàn bộ hệ thống lên chỉ bằng một cú gõ phím!
All rights reserved