Giới thiệu

Docker đã trở thành công cụ tiêu chuẩn để đóng gói và triển khai ứng dụng web. Bài viết này hướng dẫn cách đưa một dự án Laravel lên VPS bằng Docker, giúp bạn có môi trường đồng nhất, dễ bảo trì và mở rộng.

Chuẩn bị môi trường

Trước khi bắt đầu, bạn cần:

  • VPS chạy hệ điều hành Ubuntu 22.04 (hoặc phiên bản tương đương).
  • Quyền root hoặc sudo trên máy.
  • Mã nguồn Laravel đã sẵn sàng, bao gồm file composer.json.env.

Cài đặt Docker và Docker Compose

Thực hiện các lệnh sau để cài Docker Engine và Docker Compose:

sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo systemctl enable docker
sudo systemctl start docker

Sau khi cài, kiểm tra phiên bản:

docker --version
docker compose version

Xây dựng Dockerfile cho Laravel

Dockerfile sẽ định nghĩa môi trường PHP, các extension cần thiết và cài đặt Composer. Tạo file Dockerfile trong thư mục gốc dự án:

FROM php:8.2-fpm
WORKDIR /var/www
RUN apt-get update && apt-get install -y \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip \
    git
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
COPY --from=composer:2.7 /usr/bin/composer /usr/bin/composer
COPY . /var/www
RUN composer install --no-dev --optimize-autoloader
EXPOSE 9000

Tạo file docker-compose.yml

Docker Compose sẽ quản lý các container: PHP-FPM, Nginx và MySQL. Tạo file docker-compose.yml:

version: '3.8'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: laravel_app
    volumes:
      - .:/var/www
    networks:
      - laravel
    depends_on:
      - db
  web:
    image: nginx:stable-alpine
    container_name: nginx_web
    ports:
      - "80:80"
    volumes:
      - .:/var/www
      - ./nginx/conf.d:/etc/nginx/conf.d
    networks:
      - laravel
    depends_on:
      - app
  db:
    image: mysql:8.0
    container_name: mysql_db
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: laravel
      MYSQL_USER: laravel
      MYSQL_PASSWORD: secret
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - laravel
networks:
  laravel:
    driver: bridge
volumes:
  db_data:

Cấu hình Nginx

Tạo thư mục nginx/conf.d và thêm file default.conf:

server {
    listen 80;
    server_name localhost;
    root /var/www/public;
    index index.php index.html;
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location ~ \.php$ {
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Triển khai và kiểm tra

Chạy Docker Compose:

docker compose up -d --build

Sau khi các container khởi động, truy cập http://your_server_ip để xem trang Laravel mặc định. Đừng quên cập nhật .env để kết nối tới MySQL:

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secret

Xử lý lỗi thường gặp

  • Permission denied: Đảm bảo thư mục storagebootstrap/cache có quyền ghi cho người dùng www-data trong container.
  • Cannot connect to MySQL: Kiểm tra lại biến môi trường DB_HOST (phải là db – tên service trong docker-compose).
  • Missing PHP extensions: Thêm extension cần thiết vào Dockerfile và rebuild image.

Kết luận

Việc sử dụng Docker để Deploy Laravel trên VPS mang lại môi trường nhất quán, dễ mở rộng và giảm thiểu lỗi cấu hình. Nếu muốn nắm vững toàn bộ quy trình Deploy và các kiến thức nền tảng, bạn có thể Tham khảo khóa học "Deploy Web - Triển khai website lên môi trường Internet" tại đây.