Trong bài viết trước, ta đã làm quen với Docker Compose và Traefik. Bây giờ là lúc “thực chiến” — triển khai một dự án Laravel đậm chất PHP trong container, kết nối với MySQL, routing qua Traefik. 🐳
📦 Mục tiêu của phần này
- Khởi tạo một dự án Laravel mới (hoặc dùng dự án có sẵn).
- Cấu hình
docker-compose.yml
gồm Laravel, MySQL. - Xem thành quả.
🛠️ 1. Khởi tạo dự án Laravel
- Để khởi tạo dự án bạn có thể tham khảo tại đây hoặc chạy:
cd laravel-docker
composer create-project laravel/laravel laravel-docker-demo
// mở vscode
code .
- Thêm file
docker-compose.yml
cùng thư mục với dự án Laravel.
Kết quả:
laravel-docker/
├── laravel-docker-demo/
├── docker-compose.yml
🐳 2. File docker-compose.yml
Để code ra được 1 file docker-compose.yml
chạy được thì chúng ta cần có:
- traefik: Đảm nhận việc điều phối routing tới các app laravel của chúng ta.
- laravel: Cấu hình của app.
- mysql: Cấu hình database.
Bắt đầu thôi nào 🏃
2.1 traefik
version: "3.8" services: traefik: image: traefik:v2.11 container_name: traefik command: - "--api.dashboard=true" - "--providers.docker=true" - "--entrypoints.web.address=:80" ports: - "80:80" volumes: - /var/run/docker.sock:/var/run/docker.sockk
- version: "3.8" – Chọn phiên bản cấu trúc Compose.
- image: Phiên bản traefik mà chúng ta sử dụng.
- command: cấu hình nhanh cho Traefik
--api.dashboard=true
: cho phép truy cậptraefik dashboard
--providers.docker=true
: Cho phép Traefik nhìn thấy các container Docker khác (để tự định tuyến).--entrypoints.web.address=:80
: Mở cổng 80 – như cổng chính ngôi nhà vậy 🏠️
- volumes: Traefik cần đọc
docker.sock
để "nghe ngóng" xem container vừa lên sóng, container vừa tắt.
2.2 laravel app
laravel: image: php:8.2-fpm working_dir: /var/www volumes: - ./laravel-docker-demo:/var/www labels: - "traefik.enable=true" - "traefik.http.routers.laravel.rule=Host(`localhost`)" - "traefik.http.routers.laravel.entrypoints=web" depends_on: - mysql command: > sh -c " apt-get update && apt-get install -y zip unzip git curl libonig-dev libxml2-dev libzip-dev && docker-php-ext-install pdo pdo_mysql mbstring zip exif pcntl && curl -sS https://getcomposer.org/installer | php && mv composer.phar /usr/local/bin/composer && composer install && php-fpm "
- image: Dùng image
php:8.2-fpm
. - working_dir: thư mục làm việc chính.
- volumes: Gắn thư mục code vào trong container.
- labels: Cấu hình để
Traefik
thấy được app của chúng ta -"à, thằng Laravel này khi gọi localhost thì đưa tao điều hướng tới nó nhé"
- depends_on: đợi
mysql
chạy xong mới bắt đầu - command:
- Cài Linux packages
- Bật PHP extensions
- Cài Composer
- Cài Laravel dependencies
- Và cuối cùng... chạy
php-fpm
để phục vụ web
2.3 mysql
mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: laravel MYSQL_USER: laravel MYSQL_PASSWORD: secret volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:
- image: Dùng luôn bản chính chủ MySQL 8.0.
- environment: Mấy dòng khai sinh ra database, user và password. Laravel sẽ dùng thông tin này để kết nối.
- volumes: Gắn ổ cứng riêng cho database. Có restart hay build lại thì data vẫn còn.
- Cuối cùng
volumes: mysql_data:
giống nhưổ đĩa ngoài
cho MySQL, giúp lưu dữ liệu của container khi bị dừng hoặc xóa.
🚀 Khởi chạy dự án
Cấu hình Laravel
Trong file .env
trong thư mục laravel-docker-demo
. Sửa các giá trị sau:
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secret
Thêm config để app của chúng ta có thể connect tới database mysql
Khởi chạy và test
docker-compose up --build
Sau khi dịch xong, mở browser truy cập: http://localhost
Nếu bạn bạn thấy kết quả như trên thì xin chúc mừng. Bạn đã tự build thành công dự án đầu tiên của mình với docker rồi 👏👏👏
dưới đây là file docker-compose.yml
hoàn chỉnh:
version: "3.8" services: traefik: image: traefik:v2.11 command: - "--api.dashboard=true" - "--providers.docker=true" - "--entrypoints.web.address=:80" ports: - "80:80" volumes: - /var/run/docker.sock:/var/run/docker.sock laravel: image: php:8.2-fpm working_dir: /var/www volumes: - ./myapp:/var/www labels: - "traefik.enable=true" - "traefik.http.routers.laravel.rule=Host(`localhost`)" - "traefik.http.routers.laravel.entrypoints=web" depends_on: - mysql command: > sh -c " apt-get update && apt-get install -y zip unzip git curl libonig-dev libxml2-dev libzip-dev && docker-php-ext-install pdo pdo_mysql mbstring zip exif pcntl && curl -sS https://getcomposer.org/installer | php && mv composer.phar /usr/local/bin/composer && composer install && php-fpm " mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: laravel MYSQL_USER: laravel MYSQL_PASSWORD: secret volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:
✅Kết luận
Việc dùng Docker Compose để triển khai Laravel giúss chúng ta:
- Loại bỏ rắc rối khi cài môi trường PHP.
- Triển khai nhênh, gọn, dễ scale.
- Kết hợp Traefik giúp routing linh hoạt và sau này dễ dàng thêm HTTPS, staging...
Tài liệu tham khảo: