Quay lại

Triển Khai Laravel PHP8.1-fpm, MySQL, Nginx Trong Docker Chuyên mục PHP và Laravel    2024-04-15    13 Lượt xem    11 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Triển Khai Laravel PHP8.1-fpm, MySQL, Nginx Trong Docker

Containerization là một hình thức nhẹ của ảo hóa mà đóng gói một ứng dụng và các phụ thuộc của nó, bao gồm các thư viện và môi trường runtime, vào một đơn vị duy nhất gọi là container. Các container rất dễ di chuyển, đảm bảo rằng các ứng dụng chạy một cách nhất quán trên các môi trường khác nhau, từ laptop của một developer đến một máy chủ production.

Tại sao chúng ta containerize Laravel, MySQL và Nginx?

Laravel là một framework PHP mạnh mẽ để xây dựng các ứng dụng web, trong khi MySQL đóng vai trò là một hệ thống cơ sở dữ liệu quan hệ phổ biến, và Nginx là một máy chủ web hiệu suất cao. Kết hợp các công nghệ này vào một ngăn xếp container hóa đơn giản mang lại nhiều lợi ích như cô lập, dễ di chuyển, hiệu suất và khả năng mở rộng.

Chúng ta sẽ containerize một ứng dụng Laravel chứa các thành phần sau:

1- Ứng dụng Laravel

2- Cơ sở dữ liệu MYSQL

3- Máy chủ web NGINX

Bước 01: Để tạo một dự án Laravel mới, bạn có thể sử dụng lệnh sau:

composer create-project --prefer-dist laravel/laravel blog

HOẶC để sao chép một dự án từ GitHub, bạn có thể sử dụng lệnh này:

git clone https://github.com/laravel/laravel.git blog

Bước 02: Tiếp theo, chúng ta cần di chuyển đến thư mục dự án của chúng ta và tạo một tệp mới có tên là "docker-compose.yml" và thêm các cấu hình sau vào đó.

Cấu hình này chạy một môi trường đa container bao gồm Php Laravel, MySQL và Nginx.

1- Cấu Hình Ứng Dụng

Service "app" trong file docker-compose là để xây dựng ứng dụng Laravel của chúng ta dựa trên từ Dockerfile nằm trong thư mục cùng cấp với các files của dự án và file docker compose.

  1. "image" Nếu image:s2sontech/php được chỉ định cùng với build, Docker Compose sẽ gán tên s2sontech/php cho image sau khi nó được xây dựng từ Dockerfile.
  2. "container_name" là tên của container chúng ta muốn.
  3. "/var/www" xác định thư mục làm việc trong container đang chạy.
  4. "volumes" gắn kết các files trong dự án từ máy host vào container tại thư mục /var/www.
  5. "networks" xác định mạng cho container.

2- Cấu hình Nginx

"webserver" sử dụng nginx image alpine và gán một tên cho container.

"ports" cổng là điều quan trọng để hiểu, đây là ánh xạ cổng mặc định 80 của nginx sang cổng máy chủ của chúng ta là 80.

"volumes" gắn kết các tệp máy chủ và cấu hình nginx vào container nginx

"networks" xác định mạng cho container nginx

3- Cấu hình Cơ sở dữ liệu MySQL

"db" sử dụng mysql image và xác định tên container của nó.

"ports" 3306 là cổng mặc định của mysql

"environment" đặt biến môi trường (tên người dùng mật khẩu) cho cơ sở dữ liệu mysql

"volumes" gắn kết máy chủ với container để lưu trữ dữ liệu có tính liên tục.

Lưu ý: Tất cả ba services này phải ở trong cùng một mạng để cho phép chúng giao tiếp với nhau.

version: '3.8'
services:
  
  #PHP
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: s2sontech/php
    container_name: app
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www
    volumes:
      - ./:/var/www
      - ./docker/php/local.ini:/usr/local/etc/php/conf.d/local.ini
    networks:
      - app-network

  #Nginx
  webserver:
    image: nginx:alpine
    container_name: webserver
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./:/var/www
      - ./docker/nginx/:/etc/nginx/conf.d/
    networks:
      - app-network

  #MySQL
  db:
    image: mysql:latest
    container_name: db
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_ROOT_PASSWORD: password
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    volumes:
      - dbdata:/var/lib/mysql/
      - ./docker/mysql/my.cnf:/etc/mysql/my.cnf
    networks:
      - app-network

#Networks
networks:
  app-network:
    driver: bridge
#Volumes
volumes:
  dbdata:
    driver: local

Bước 03: Tạo một "Dockerfile" mới với lệnh sau:

sudo nano Dockerfile​

Tên của file phải là "Dockerfile" mà không có bất kỳ phần mở rộng nào.

Thêm các cấu hình sau vào Dockerfile.

  • "FROM" sử dụng php8.1-fpm như là image base

  • "COPY" các file cần thiết vào container

  • "WORKDIR" đặt thư mục làm việc tới /var/www

  • "RUN" cài đặt các gói và composer cần thiết

  • "EXPOSE" mở ra cổng để lắng nghe

  • "CMD" xác định chạy php-fpm

FROM php:8.1-fpm

# Copy composer.lock and composer.json
COPY composer.lock composer.json /var/www/

# Set working directory
WORKDIR /var/www

# Install dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    libpng-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    locales \
    zip \
    jpegoptim optipng pngquant gifsicle \
    vim \
    unzip \
    git \
    curl \
    libonig-dev \
    libzip-dev \
    libgd-dev
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
#Mine

# Install extensions
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
RUN docker-php-ext-configure gd --with-external-gd
RUN docker-php-ext-install gd

# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www

# Copy existing application directory contents
COPY . /var/www

# Copy existing application directory permissions
COPY --chown=www:www . /var/www

# Change current user to www
USER www

# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]

Bước 04: Tạo một thư mục mới "docker/nginx" và tạo một tệp mới trong đó là "default.conf" cho các cấu hình nginx.

sudo mkdir docker
cd docker
sudo mkdir nginx
nano default.conf

Thêm các cấu hình nginx sau vào "default.conf"

server {
    listen 80;
    index index.php index.html;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/public;
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    location / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}

Bước 05: Tạo các file và thư mục sau:

cd docker
sudo mkdir php
cd php
nano local.ini

Thêm đoạn mã sau vào "local.ini"

upload_max_filesize=40M
post_max_size=40M

Bước 6: Cấu hình mysql/my.cnf

cd docker
sudo mkdir mysql
cd mysql
nano my.cnf

Bước 07: Bước cuối cùng là xây dựng image và run.

sudo docker-compose build sudo docker-compose up -d

Bây giờ chúng ta đã có các container php, laravel, nginx và mysql đang chạy, bạn có thể kiểm tra bằng cách sử dụng "docker ps". và có thể truy cập từ browser http://localhost

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday