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

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.
- "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.
- "container_name" là tên của container chúng ta muốn.
- "/var/www" xác định thư mục làm việc trong container đang chạy.
- "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.
- "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)