Dockerizing Laravel với Nginx MySQL và Docker Compose trên Ubuntu 18.04 LTS

theanh

Administrator
Nhân viên
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
  • Ubuntu 18.04
  • Quyền root
Những gì chúng ta sẽ làm:
  1. Cài đặt Docker và Docker Compose
  2. Tải xuống Laravel và cài đặt các Dependencies
  3. 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
  4. Xây dựng Laravel Project
  5. 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
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.
Mã:
sudo apt install docker.io -y
sudo apt install docker-compose -y
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.
Mã:
docker version
docker-compose version
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.
Mã:
usermod -a -G docker hakase
Sau đó, đăng nhập vào shell người dùng 'hakase' và chạy lệnh docker 'hello-world'.
Mã:
su - hakase
docker run 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.


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/
Bây giờ hãy chạy lệnh docker sau để cài đặt các phụ thuộc Laravel.
Mã:
docker run --rm -v $(pwd):/app composer install
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.
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
Chi tiết về dịch vụ container Laravel:
  • 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
Chi tiết cấu hình của dịch vụ container nginx:
  • 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
Lưu và đóng cấu hình.

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'.
Dưới đây là cấu hình 'docker-compose.yml' đã hoàn thành:
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; }}
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/'.
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
Dán cấu hình bên dưới.
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"]
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.

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
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.
Mã:
docker-compose ps
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.
Mã:
docker-compose images
netstat -plntu
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'.


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
Thay đổi cấu hình cơ sở dữ liệu như bên dưới.
Mã:
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laraveldb
DB_USERNAME=laravel
DB_PASSWORD=laravelpassworddb
Lưu và đóng.

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
Sau đó, di chuyển cơ sở dữ liệu bằng lệnh sau.
Mã:
docker-compose exec app php artisan migrate
Đả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.
 
Back
Bên trên