Xem lại bài viết: Triển khai website PHP thuần, Apache2, MySQL với docker compose
Trong bài viết trước mình đã giới thiệu build một website PHP thuần, Apache2, MySql với docker. Trong bài viết này chúng ta cùng tìm hiểu cách cách build một website xây dựng bằng Laravel trên docker với máy chủ Nginx và MySQL.
Project được xây dựng hoàn chỉnh tại repository https://github.com/trannguyenhan/photo-gallery-laravel, các bạn ghé qua cho mình một star repo nha. Và để cho dễ hình dung mình sẽ giới thiệu cách cài đặt và triển khai thông qua repo này, mọi người clone về và làm theo nha.
Tạo file docker-compose.yml
Tạo file docker-compose.yml với 3 service app, nginx và mysql như sau:
version:'3.8'services:app:build:args:user: trannguyenhan
uid:1000context: .
dockerfile: Dockerfile
image: laravel-app
restart: unless-stopped
working_dir: /var/www/html/
volumes:- ./:/var/www/html/
networks:- photos
nginx:image: nginx:stable-alpine
restart: unless-stopped
ports:- 8005:80volumes:- ./:/var/www/html
- ./nginx/conf.d:/etc/nginx/conf.d/
networks:- photos
db:image: mysql
restart: unless-stopped
environment:MYSQL_DATABASE: photo_gallery_laravel
MYSQL_ROOT_PASSWORD: mysql12345
MYSQL_USER: trannguyenhan
MYSQL_PASSWORD: mysql12345
ports:-"9906:3306"volumes:- ./database/photo-gallery-laravel-database.sql:/docker-entrypoint-initdb.d/dump.sql
networks:- photos
#Docker Networksnetworks:photos:driver: bridge
- Phần
nginxvàmysqlchúng ta không cần cấu hình nhiều nên sẽ pull trực tiếpimagevà thêm vào 1 số tham số. - Còn service
appchạyphpcó nhiều thứ cần chạy và cài đặt nên sẽ viết ra một conDockerfileriêng để tiện cho việc cấu hình. - Chúng ta ánh xạ cổng
80của máy chủnginxtrong con docker ra phía ngoài cổng8005của máy gốc. - Ánh xạ thư mục project vào phía trong Document Root của
nginxthông qua câu lệnh:./:/var/www/html - Cuối cùng là giống với bài viết trước, chúng ta ánh xạ port của
mysqlmặc định là3306từ container trong docker ra ngoài máy gốc là9906, điều này giúp bạn có thể truy cập vào cơ sở dữ liệu của project từ ngoài máy gốc thông qua cổng9906.
Với máy chủ nginx chúng ta cần 1 file cấu hình máy chủ nginx nếu không thì cổng nó sẽ nhảy loạn xạ và app sẽ không chạy được, chúng ta tạo ra một thư mục nginx/conf.d và tạo một file laravel.conf có nội dung như sau:
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/html/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;
}
}
Cuối cùng, tạo file Dockerfile để cài đặt cho service app như sau:
FROM php:7.4-fpm# Arguments defined in docker-compose.ymlARG userARG uid# Install system dependenciesRUN apt-get update && apt-get install -y
git
curl
libpng-dev
libonig-dev
libxml2-dev
zip
unzip# Clear cacheRUN apt-get clean && rm -rf /var/lib/apt/lists/*# Install PHP extensionsRUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd# Get latest ComposerCOPY /usr/bin/composer /usr/bin/composer# Create system user to run Composer and Artisan CommandsRUN useradd -G www-data,root -u $uid -d /home/$user$userRUN mkdir -p /home/$user/.composer &&
chown -R $user:$user /home/$user# Set working directoryWORKDIR /var/wwwUSER$user
Chạy ứng dụng
Chúng ta cùng sang những bước cuối cùng để chạy ứng dụng, đầu tiên là tạo 1 file .env từ .env.example với câu lệnh:
cp .env.example .env
Thay đổi cấu hình của cơ sở dữ liệu giống với những biến môi trường của mysql docker đã được cấu hình trong file docker-compose.yml:
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306DB_DATABASE=photo_gallery_laravel
DB_USERNAME=trannguyenhan
DB_PASSWORD=mysql12345
Chạy ứng dụng với docker-compose:
docker-compose up -d
Cài đặt các phụ thuộc cho ứng dụng Laravel:
docker-compose exec app composerinstall
Tạo key cho ứng dụng Laravel:
docker-compose exec app php artisan key:generate
Truy cập vào http://localhost:8005/ để xem thành quả:

Nguồn: viblo.asia
