Laravel là một framework PHP mã nguồn mở và miễn phí triển khai mô hình thiết kế MVC (Model-View-Controller). Laravel được thiết kế dễ sử dụng và cho phép các nhà phát triển tạo ra cả các ứng dụng đơn giản và phức tạp trong thời gian ngắn. Laravel được Taylor Otwell tạo ra vào năm 2011, như một nỗ lực cung cấp một giải pháp thay thế nâng cao cho framework CodeIgniter (CI). Vào năm 2011, Laravel đã phát hành phiên bản 1 và phiên bản 2, và phiên bản mới nhất 5.6 đi kèm với nhiều tính năng được cải tiến hơn như hỗ trợ Dòng lệnh (CLI) có tên là 'artisan', hỗ trợ cho các hệ thống cơ sở dữ liệu khác nhau, cải tiến Route, v.v.
Trong hướng dẫn này, chúng tôi sẽ chỉ cho bạn cách Dockerize dự án Laravel với PHP-FPM, cơ sở dữ liệu MySQL và máy chủ web Nginx bằng Docker Compose trên Ubuntu Server 18.04. Chúng ta sẽ tạo một docker image mới cho Laravel Project, sau đó tạo tập lệnh docker-compose.yml chứa một số dịch vụ bao gồm App/Laravel, máy chủ web Nginx và cơ sở dữ liệu MySQL.
Điều kiện tiên quyết
Trước khi đi xa hơn, chúng ta cần cập nhật kho lưu trữ trên hệ thống Ubuntu. Chỉ cần chạy lệnh sau.
Bây giờ hãy cài đặt các gói Docker và Docker Compose bằng lệnh apt bên dưới.
Các gói Docker và Docker Compose hiện đã được cài đặt trên hệ thống, hãy kiểm tra bằng các lệnh sau.
Kết quả là bạn sẽ nhận được phiên bản Docker và Docker Compose trên hệ thống.
Tiếp theo, chúng ta cần chỉ định người dùng không phải root vào nhóm docker để chạy vùng chứa Docker cho những người dùng không phải root.
Trong trường hợp này, chúng ta sẽ thêm người dùng có tên là 'hakase' vào nhóm docker bằng cách chạy lệnh sau.
Sau đó, đăng nhập vào shell người dùng 'hakase' và chạy lệnh docker 'hello-world'.
Bây giờ bạn sẽ thấy thông báo 'Hello World' từ Docker và quá trình cài đặt Docker đã hoàn tất.
Tải xuống dự án Laravel vào thư mục 'myapp' và vào đó.
Bây giờ hãy chạy lệnh docker sau để cài đặt các phụ thuộc Laravel.
Với lệnh trên, chúng ta sẽ chạy một vùng chứa docker tạm thời mới và gắn thư mục dự án 'myapp' vào thư mục '/app' trên vùng chứa. Container dựa trên hình ảnh docker 'composer' và chúng ta đang cài đặt các dependency của Laravel bằng lệnh 'composer' bên trong container tạm thời đó.
Sau khi cài đặt các dependency của Laravel hoàn tất, chúng ta phải thay đổi chủ sở hữu của thư mục 'myapp' thành người dùng của riêng mình bằng lệnh sudo bên dưới.
Dán tập lệnh docker compose vào đó.
Chi tiết về dịch vụ container Laravel:
Dán cấu hình sau sau dòng dịch vụ container 'app'.
Chi tiết cấu hình của dịch vụ container nginx:
Dán cấu hình sau vào sau dòng dịch vụ vùng chứa 'nginx'.
Lưu và đóng cấu hình.
Chi tiết dịch vụ container MySQL:
Chạy lệnh sau.
Lưu và đóng.
Sau đó, sao chép tệp chứng chỉ ssl của bạn vào thư mục 'nginx/ssl/'.
Chạy lệnh sau.
Dán cấu hình bên dưới.
Lưu và đóng cấu hình.
Và chúng ta đã sẵn sàng để xây dựng dự án Laravel 'myapp' và chạy các dịch vụ container mà chúng ta đã xác định.
Sau đó chạy lại lệnh sau.
Nó sẽ tải xuống tất cả các hình ảnh docker khi chúng ta cần và sau đó xây dựng các dịch vụ container dựa trên Cấu hình 'docker-compose.yml'.
Khi hoàn tất, hãy xác minh bằng lệnh docker-compose bên dưới.
Kết quả là, bạn sẽ thấy ba dịch vụ container đã hoạt động. 'Ứng dụng' đang chạy trên cổng mặc định '9000' PHP-FPM, dịch vụ 'nginx' nằm trên cổng HTTP và HTTPS và dịch vụ 'db' MySQL nằm trên cổng MySQL mặc định '3306'.
Sau đó, hãy xác minh lại tất cả hình ảnh docker có sẵn và các cổng mở trên hệ thống.
Bạn sẽ nhận được hình ảnh docker tùy chỉnh 'hakase-labs/laravel' trong danh sách và cổng HTTP và HTTPS ở trạng thái 'LISTEN'.
Sao chép ví dụ về tệp '.env' và chỉnh sửa bên trong vùng chứa.
Thay đổi cấu hình cơ sở dữ liệu như bên dưới.
Lưu và đóng.
Tiếp theo, tạo khóa ứng dụng Laravel và xóa cấu hình bộ đệm.
Sau đó, di chuyển cơ sở dữ liệu bằng lệnh sau.
Đảm bảo không có lỗi.
Bây giờ hãy mở trình duyệt web của bạn và nhập tên miền của dự án.
Bạn sẽ được chuyển hướng đến kết nối HTTPS an toàn và sẽ được hiển thị trang chủ Laravel mặc định như bên dưới.
Cuối cùng, dự án Dockerizing Laravel với máy chủ web Nginx và cơ sở dữ liệu MySQL đã hoàn thành thành công.
Trong hướng dẫn này, chúng tôi sẽ chỉ cho bạn cách Dockerize dự án Laravel với PHP-FPM, cơ sở dữ liệu MySQL và máy chủ web Nginx bằng Docker Compose trên Ubuntu Server 18.04. Chúng ta sẽ tạo một docker image mới cho Laravel Project, sau đó tạo tập lệnh docker-compose.yml chứa một số dịch vụ bao gồm App/Laravel, máy chủ web Nginx và cơ sở dữ liệu MySQL.
Điều kiện tiên quyết
- Ubuntu 18.04
- Quyền root
- Cài đặt Docker và Docker Compose
- Tải xuống Laravel và cài đặt các Dependencies
- Dockerizing Laravel Project
- Định nghĩa Laravel App Service
- Định nghĩa Nginx HTTP Service
- Định nghĩa MySQL Database Service
- Tạo Nginx Virtual Host cho Laravel
- Tạo Dockerfile cho Laravel App
- Xây dựng Laravel Project
- Sau khi cài đặt
Bước 1 - Cài đặt Docker và Docker Compose
Đầu tiên, chúng ta sẽ cài đặt các gói Docker và Docker Compose vào hệ thống Ubuntu. Và chúng ta sẽ sử dụng các gói Docker từ kho lưu trữ Ubuntu chính thức.Trước khi đi xa hơn, chúng ta cần cập nhật kho lưu trữ trên hệ thống Ubuntu. Chỉ cần chạy lệnh sau.
Mã:
sudo apt update
Mã:
sudo apt install docker.io -y
sudo apt install docker-compose -y
Mã:
docker version
docker-compose version
Tiếp theo, chúng ta cần chỉ định người dùng không phải root vào nhóm docker để chạy vùng chứa Docker cho những người dùng không phải root.
Trong trường hợp này, chúng ta sẽ thêm người dùng có tên là 'hakase' vào nhóm docker bằng cách chạy lệnh sau.
Mã:
usermod -a -G docker hakase
Mã:
su - hakase
docker run hello-world
Bước 2 - Tải xuống Laravel và cài đặt các phụ thuộc
Trong bước này, chúng ta sẽ tải xuống Laravel web-framework vào thư mục gốc 'hakase' rồi cài đặt các phụ thuộc Laravel bằng hình ảnh docker 'composer' của PHP. Vì vậy, hãy đảm bảo rằng bạn đã đăng nhập vào máy chủ với tư cách là người dùng không phải root.Tải xuống dự án Laravel vào thư mục 'myapp' và vào đó.
Mã:
git clone https://github.com/laravel/laravel.git myapp/
cd myapp/
Mã:
docker run --rm -v $(pwd):/app composer install
Sau khi cài đặt các dependency của Laravel hoàn tất, chúng ta phải thay đổi chủ sở hữu của thư mục 'myapp' thành người dùng của riêng mình bằng lệnh sudo bên dưới.
Mã:
sudo chown -R $USER:$USER ~/myapp
Bước 3 - Docker hóa dự án Laravel
Sau khi tải xuống Laravel và cài đặt các dependency của nó, chúng ta sẽ tạo một tập lệnh docker-compose.yml mới và tạo một Dockerfile mới cho dự án Laravel.
Mã:
cd myapp/
vim docker-compose.yml
- Định nghĩa ứng dụng Laravel Dịch vụ
Đầu tiên, chúng ta sẽ định nghĩa chính dự án Laravel và xây dựng hình ảnh docker cho dự án Laravel bằng Dockerfile.Dán tập lệnh docker compose vào đó.
Mã:
version: '3'
services:
#Laravel App
app:
build:
context: .
dockerfile: Dockerfile
image: hakase-labs/laravel
container_name: app
restart: except-stopped
tty: true
environment:
SERVICE_NAME: app
SERVICE_TAGS: dev
working_dir: /var/www/html
volumes:
- ./:/var/www/html
networks:
- mynet
- Dịch vụ container Laravel sẽ được đặt tên là 'app'. Nó dựa trên hình ảnh docker tùy chỉnh của chúng ta sẽ được tạo bằng 'Dockerfile' và hình ảnh mới sẽ được đặt tên là 'hakase-labs/laravel'.
- Chúng ta muốn gắn thư mục dự án 'myapp' vào '/var/www/html' bên trong dịch vụ container.
- Chúng ta đang sử dụng mạng docker tùy chỉnh cho thiết lập của mình, mạng sẽ được đặt tên là 'mynet'.
- Định nghĩa Dịch vụ HTTP Nginx
Bây giờ chúng ta sẽ định nghĩa dịch vụ container nginx.Dán cấu hình sau sau dòng dịch vụ container 'app'.
Mã:
#Dịch vụ Nginx
nginx:
image: nginx:alpine
container_name: nginx
restart: except-stopped
tty: true
ports:
- "80:80"
- "443:443"
volumes:
- ./:/var/www/html
- ./nginx/conf.d/:/etc/nginx/conf.d/
- ./nginx/ssl/:/etc/nginx/ssl/
networks:
- mynet
- Chúng tôi muốn tạo một container mới có tên 'nginx' dựa trên hình ảnh docker 'nginx:alpine'.
- Dịch vụ container sẽ mở các cổng HTTP và HTTPS.
- Container sẽ gắn ba ổ đĩa khác nhau. Thư mục dự án 'myapp' vào thư mục '/var/www/html', cấu hình máy chủ ảo nginx 'nginx/conf.d/' vào thư mục '/etc/nginx/conf.d' và gắn các tệp chứng chỉ 'nginx/ssl/' vào thư mục '/etc/nginx/ssl' trên vùng chứa.
- Dịch vụ vùng chứa sẽ sử dụng cùng một mạng có tên là 'mynet'.
- Định nghĩa Dịch vụ cơ sở dữ liệu MySQL
Và cuối cùng, chúng ta định nghĩa dịch vụ cơ sở dữ liệu MySQL.Dán cấu hình sau vào sau dòng dịch vụ vùng chứa 'nginx'.
Mã:
#Dịch vụ MySQL
db:
image: mysql:5.7
container_name: db
restart: except-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: laraveldb
MYSQL_USER: laravel
MYSQL_PASSWORD: laravelpassworddb
MYSQL_ROOT_PASSWORD: rootpasswordmysql
volumes:
- mysqldata:/var/lib/mysql/
networks:
- mynet
#Docker Networks
networks:
mynet:
driver: bridge
#Volumes
volumes:
mysqldata:
driver: local
Chi tiết dịch vụ container MySQL:
- Dịch vụ container MySQL sẽ được đặt tên là 'db', dựa trên hình ảnh docker 'mysql:5.7'.
- Dịch vụ 'db' sẽ mở cổng MySQL mặc định '3306'.
- Dự án Laravel sẽ sử dụng cơ sở dữ liệu, người dùng và mật khẩu dựa trên trên biến môi trường của dịch vụ 'db'.
- Dịch vụ 'db' của MySQL sẽ gắn kết ổ đĩa có tên 'mysqldata' và có cùng mạng 'mynet'.
- Và chúng tôi định nghĩa mạng tùy chỉnh 'mynet' bằng trình điều khiển 'bridge' và ổ đĩa 'mysqldata' sẽ sử dụng trình điều khiển 'local'.
Mã:
phiên bản: '3'dịch vụ: #Ứng dụng Laravel ứng dụng: xây dựng: ngữ cảnh: . dockerfile: Dockerfile image: hakase-labs/laravel container_name: app restart: except-stopped tty: true environment: SERVICE_NAME: app SERVICE_TAGS: dev working_dir: /var/www/html volumes: - ./:/var/www/html networks: - mynet #Nginx Service nginx: image: nginx:alpine container_name: nginx restart: except-stopped tty: true ports: - "80:80" - "443:443" volumes: - ./:/var/www/html - ./nginx/conf.d/:/etc/nginx/conf.d/ - ./nginx/ssl/:/etc/nginx/ssl/ networks: - mynet #MySQL Service db: image: mysql:5.7 container_name: db restart: except-stopped tty: true ports: - "3306:3306" environment: MYSQL_DATABASE: laraveldb MYSQL_USER: laravel MYSQL_PASSWORD: laravelpassworddb MYSQL_ROOT_PASSWORD: rootpasswordmysql volumes: - mysqldata:/var/lib/mysql/ networks: - mynet#Docker Networksnetworks: mynet: driver: bridge#Volumesvolumes: mysqldata: driver: local
- Tạo Nginx Virtual Host cho Laravel
Trong thư mục dự án 'myapp', hãy tạo một thư mục mới có tên 'nginx' sẽ chứa hai thư mục khác là 'conf.d' và 'ssl'. Sau đó, tạo cấu hình máy chủ ảo nginx mới 'laravel.conf' bên trong thư mục 'conf.d'.Chạy lệnh sau.
Mã:
mkdir -p nginx/{conf.d,ssl}
vim nginx/conf.d/laravel.conf
Mã:
server { lắng nghe 80; server_name laravel.hakase-labs.io; trả về 301 https://laravel.hakase-labs.io$request_uri;}server { lắng nghe 443 ssl http2; server_name laravel.hakase-labs.io; ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; # Tệp nhật ký để gỡ lỗi error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; # Thư mục gốc web Laravel root /var/www/html/public; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; gzip_static on; } # Nginx chuyển yêu cầu đến vị trí PHP-FPM ~ \.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; }}
Sau đó, sao chép tệp chứng chỉ ssl của bạn vào thư mục 'nginx/ssl/'.
Mã:
sudo cp /path/to/ssl/fullchain.pem nginx/ssl/
sudo cp /path/to/ssl/privkey.pem nginx/ssl/
- Tạo Dockerfile cho Ứng dụng Laravel
Tiếp theo, tạo Dockerfile mới cho dự án Laravel.Chạy lệnh sau.
Mã:
vim Dockerfile
Mã:
# Đặt ảnh chínhFROM php:7.2-fpm-alpine# Sao chép composer.lock và composer.jsonCOPY composer.lock composer.json /var/www/html/# Thiết lập thư mục làm việcWORKDIR /var/www/html# Cài đặt các phụ thuộc bổ sungRUN apk update && apk add --no-cache \ build-base shadow vim curl \ php7 \ php7-fpm \ php7-common \ php7-pdo \ php7-pdo_mysql \ php7-mysqli \ php7-mcrypt \ php7-mbstring \ php7-xml \ php7-openssl \ php7-json \ php7-phar \ php7-zip \ php7-gd \ php7-dom \ php7-session \ php7-zlib# Thêm và kích hoạt tiện ích mở rộng PHP-PDORUN docker-php-ext-install pdo pdo_mysqlRUN docker-php-ext-enable pdo_mysql# Cài đặt PHP ComposerRUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer# Xóa bộ nhớ đệmCHẠY rm -rf /var/cache/apk/*# Thêm UID '1000' vào www-dataCHẠY usermod -u 1000 www-data# Sao chép quyền thư mục ứng dụng hiện cóCOPY --chown=www-data:www-data . /var/www/html# Đổi người dùng hiện tại thành wwwUSER www-data# Mở cổng 9000 và khởi động máy chủ php-fpmMỞ 9000CMD ["php-fpm"]
Và chúng ta đã sẵn sàng để xây dựng dự án Laravel 'myapp' và chạy các dịch vụ container mà chúng ta đã xác định.
Bước 4 - Xây dựng Laravel với Nginx và Dịch vụ MySQL
Xây dựng hình ảnh docker tùy chỉnh cho dự án Laravel của chúng ta bằng lệnh sau.
Mã:
docker-compose build
Sau đó chạy lại lệnh sau.
Mã:
docker-compose up -d
Khi hoàn tất, hãy xác minh bằng lệnh docker-compose bên dưới.
Mã:
docker-compose ps
Sau đó, hãy xác minh lại tất cả hình ảnh docker có sẵn và các cổng mở trên hệ thống.
Mã:
docker-compose images
netstat -plntu
Bước 5 - Hậu cài đặt Laravel
Cho đến giai đoạn này, dự án Laravel đã hoạt động như một vùng chứa Docker. Và bây giờ chúng ta sẽ tạo một tệp '.env' mới, tạo khóa và di chuyển dữ liệu Laravel bằng dòng lệnh Laravel 'artisan'.Sao chép ví dụ về tệp '.env' và chỉnh sửa bên trong vùng chứa.
Mã:
cp .env.example .env
docker-compose exec app vim .env
Mã:
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laraveldb
DB_USERNAME=laravel
DB_PASSWORD=laravelpassworddb
Tiếp theo, tạo khóa ứng dụng Laravel và xóa cấu hình bộ đệm.
Mã:
docker-compose exec app php artisan key:generate
docker-compose exec app php artisan config:cache
Mã:
docker-compose exec app php artisan migrate
Bây giờ hãy mở trình duyệt web của bạn và nhập tên miền của dự án.
Bạn sẽ được chuyển hướng đến kết nối HTTPS an toàn và sẽ được hiển thị trang chủ Laravel mặc định như bên dưới.
Cuối cùng, dự án Dockerizing Laravel với máy chủ web Nginx và cơ sở dữ liệu MySQL đã hoàn thành thành công.