- vừa được xem lúc

Thực chiến Laravel với Docker Compose

0 0 2

Người đăng: Nguyen Trung Giang

Theo Viblo Asia

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ập traefik 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:

Bình luận

Bài viết tương tự

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

1 1 555

- vừa được xem lúc

Phần 1: Giới thiệu về Kubernetes

Kubernetes là gì. Trang chủ: https://kubernetes.io/. Ai cần Kubernetes.

0 0 106

- vừa được xem lúc

Docker: Chưa biết gì đến biết dùng (Phần 1- Lịch sử)

1. Vì sao nên sử dụng. . .

0 0 109

- vừa được xem lúc

Docker - những kiến thức cơ bản phần 1

Giới thiệu. Nếu bạn đang làm ở một công ty công nghệ thông tin, chắc rằng bạn đã được nghe nói về Docker.

0 0 86

- vừa được xem lúc

Docker: Chưa biết gì đến biết dùng (Phần 2 - Dockerfile)

1. Mở đầu.

0 0 73

- vừa được xem lúc

Docker: Chưa biết gì đến biết dùng (Phần 3: Docker-compose)

1. Mở đầu. . .

0 0 135