Cách cài đặt Laravel với Docker trên Ubuntu 22.04

theanh

Administrator
Nhân viên
Laravel là một framework PHP miễn phí và mã nguồn mở cung cấp một bộ công cụ và tài nguyên để xây dựng các ứng dụng PHP hiện đại. Với nhiều gói và tiện ích mở rộng tương thích, Laravel đã trở nên phổ biến, với nhiều nhà phát triển áp dụng nó làm framework lựa chọn của họ. Laravel cung cấp các công cụ cơ sở dữ liệu mạnh mẽ bao gồm ORM (Object Relational Mapper) được gọi là Eloquent và các cơ chế tích hợp để tạo các bản di chuyển cơ sở dữ liệu. Nó đi kèm với một công cụ dòng lệnh Artisan mà các nhà phát triển có thể sử dụng để khởi động các mô hình, bộ điều khiển và các thành phần ứng dụng khác mới, giúp tăng tốc quá trình phát triển ứng dụng nói chung.

Việc chứa một ứng dụng có nghĩa là quá trình điều chỉnh một ứng dụng và các thành phần của nó để có thể chạy ứng dụng đó trong các môi trường nhẹ được gọi là container. Hướng dẫn này sẽ sử dụng Docker Compose để chứa một ứng dụng Laravel để phát triển.

Chúng tôi sẽ tạo ba vùng chứa Docker cho ứng dụng Laravel của mình.
  • Một dịch vụ app chạy PHP 8.2-FPM
  • Một dịch vụ db chạy MySQL 8.0
  • Một nginx dịch vụ sử dụng dịch vụ app để phân tích cú pháp mã PHP trước khi phục vụ ứng dụng Laravel cho người dùng
Chúng tôi cũng sẽ tạo chứng chỉ SSL cho trang web Laravel của mình bằng Let's Encrypt.

Điều kiện tiên quyết​


  • Một máy chủ chạy Ubuntu 22.04.

  • Người dùng không phải root có quyền sudo.

  • Tên miền đủ điều kiện (FQDN) trỏ đến máy chủ của bạn. Đối với mục đích của chúng tôi, chúng tôi sẽ sử dụng example.com làm tên miền.

  • Đảm bảo mọi thứ đều được cập nhật.
Mã:
$ sudo apt update
[*]
Cài đặt các gói tiện ích cơ bản. Một số trong số chúng có thể đã được cài đặt.
Mã:
$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y

Bước 1 - Cấu hình Tường lửa​

Bước đầu tiên là cấu hình tường lửa. Ubuntu mặc định có ufw (Uncomplicated Firewall).

Kiểm tra xem tường lửa có đang chạy không.
Mã:
$ sudo ufw status
Bạn sẽ nhận được thông báo sau đầu ra.
Mã:
Status: inactive
Cho phép cổng SSH để tường lửa không làm gián đoạn kết nối hiện tại khi bật nó.
Mã:
$ sudo ufw allow OpenSSH
Cho phép các cổng HTTP và HTTPS như tốt.
Mã:
$ sudo ufw allow http
$ sudo ufw allow https
Bật Tường lửa
Mã:
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
Kiểm tra trạng thái của tường lửa một lần nữa.
Mã:
$ sudo ufw status
Bạn sẽ thấy kết quả tương tự.
Mã:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)

Bước 2 - Cài đặt SSL​

Trước khi tiếp tục, trước tiên chúng ta hãy tạo chứng chỉ SSL cho tên miền của mình. Chúng ta sẽ tạo chứng chỉ này bên ngoài Docker vì nó dễ bảo trì. Sau đó, chúng tôi sẽ đồng bộ hóa các chứng chỉ với container, container này sẽ được gia hạn và làm mới thường xuyên.

Chúng ta cần cài đặt Certbot để tạo chứng chỉ SSL. Bạn có thể cài đặt Certbot bằng kho lưu trữ của Ubuntu hoặc tải phiên bản mới nhất bằng công cụ Snapd. Chúng ta sẽ sử dụng phiên bản Snapd.

Ubuntu 22.04 đi kèm với Snapd được cài đặt theo mặc định. Chạy các lệnh sau để đảm bảo phiên bản Snapd của bạn được cập nhật. Đảm bảo rằng phiên bản Snapd của bạn được cập nhật.
Mã:
$ sudo snap install core
$ sudo snap refresh core
Cài đặt Certbot.
Mã:
$ sudo snap install --classic certbot
Sử dụng lệnh sau để đảm bảo rằng lệnh Certbot chạy bằng cách tạo liên kết tượng trưng đến /usr/bin thư mục.
Mã:
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Chạy lệnh sau để tạo SSL Chứng chỉ.
Mã:
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [emailprotected] -d example.com
Lệnh trên sẽ tải chứng chỉ xuống thư mục /etc/letsencrypt/live/example.com trên máy chủ của bạn.

Tạo chứng chỉ nhóm Diffie-Hellman.
Mã:
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Thực hiện chạy thử quy trình để kiểm tra xem quá trình gia hạn SSL có hoạt động tốt không.
Mã:
$ sudo certbot renew --dry-run
Nếu không thấy lỗi, bạn đã hoàn tất. Chứng chỉ của bạn sẽ tự động gia hạn.

Sau khi thiết lập Docker và cài đặt Laravel, quy trình gia hạn sẽ cần được sửa đổi. Chúng tôi sẽ đề cập đến vấn đề này trong phần sau.

Bước 3 - Cài đặt Docker và Docker Compose​

Ubuntu 22.04 đi kèm với phiên bản Docker cũ hơn. Để cài đặt phiên bản mới nhất, trước tiên, hãy nhập khóa GPG của Docker.
Mã:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
Tạo tệp kho lưu trữ Docker.
Mã:
$ echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Cập nhật kho lưu trữ hệ thống danh sách.
Mã:
$ sudo apt update
Cài đặt phiên bản Docker mới nhất.
Mã:
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Xác minh rằng đó là đang chạy.
Mã:
$ sudo systemctl status docker
? docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2023-01-14 10:41:35 UTC; 2min 1s ago
TriggeredBy: ? docker.socket Docs: https://docs.docker.com Main PID: 2054 (dockerd) Tasks: 52 Memory: 22.5M CPU: 248ms CGroup: /system.slice/docker.service ?? 2054 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Theo mặc định, Docker yêu cầu quyền root. Nếu bạn muốn tránh sử dụng sudo mỗi khi bạn chạy lệnh docker, hãy thêm tên người dùng của bạn vào docker nhóm.
Mã:
$ sudo usermod -aG docker $(whoami)
Bạn sẽ cần phải đăng xuất khỏi máy chủ và đăng nhập lại với cùng một người dùng để kích hoạt thay đổi này hoặc sử dụng lệnh sau lệnh.
Mã:
$ su - ${USER}
Xác nhận rằng người dùng của bạn đã được thêm vào nhóm Docker.
Mã:
$ groups
navjot wheel docker

Bước 4 - Tải xuống Laravel và Cài đặt các Phụ thuộc​

Bước đầu tiên là tải xuống phiên bản Laravel mới nhất và cài đặt các phụ thuộc, bao gồm Composer, gói PHP quản lý.

Tạo thư mục ứng dụng Laravel.
Mã:
$ mkdir ~/laravel
Chuyển đến thư mục.
Mã:
$ cd ~/laravel
Sao chép bản phát hành Laravel mới nhất vào thư mục. Đừng quên . ở cuối lệnh, nghĩa là Git sẽ sao chép các tệp vào thư mục hiện tại.
Mã:
$ git clone https://github.com/laravel/laravel.git .
Sử dụng ảnh Compose của Docker để gắn các thư mục bạn cần cho dự án Laravel của mình. Điều này giúp tránh nhu cầu cài đặt Composer trên toàn cầu.
Mã:
$ docker run --rm -v $(pwd):/app composer install
Lệnh trên tạo một vùng chứa tạm thời được gắn kết với thư mục hiện tại của bạn trước khi bị xóa. Nó sao chép nội dung của thư mục Laravel của bạn vào vùng chứa và đảm bảo rằng thư mục vendor mà Composer tạo bên trong vùng chứa được sao chép trở lại thư mục hiện tại.

Đặt quyền cho thư mục Laravel để nó thuộc sở hữu của người dùng hiện đang đăng nhập.
Mã:
$ sudo chown -R $USER:$USER ~/laravel

Bước 5 - Tạo Tệp Docker Compose​

Tạo và mở tệp Docker compose để chỉnh sửa.
Mã:
$ nano docker-compose.yml
Dán mã sau vào đó. Tại đây, chúng tôi định nghĩa ba dịch vụ: app, webserverdb. Thay thế MYSQL_ROOT_PASSWORD trong dịch vụ db bằng mật khẩu mạnh mà bạn chọn.
Mã:
services: app: build: context: . dockerfile: Dockerfile image: howtoforge/app container_name: app restart: unless-stopped tty: true environment: SERVICE_NAME: app SERVICE_TAGS: dev working_dir: /var/www volumes: - ./:/var/www - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini networks: - app-network webserver: container_name: webserver image: nginx:alpine restart: unless-stopped tty: true ports: - 80:80 - 443:443 volumes: - ./:/var/www - ./nginx/conf.d:/etc/nginx/conf.d - ./nginx/logs:/var/log/nginx - /etc/ssl/certs/dhparam.pem:/etc/ssl/certs/dhparam.pem - /etc/letsencrypt:/etc/letsencrypt logging: options: max-size: "10m" max-file: "3" networks: - app-network db: image: mysql:latest container_name: db restart: unless-stopped tty: true ports: - "3306:3306" environment: MYSQL_DATABASE: laravel MYSQL_ROOT_PASSWORD: MYSQL_ROOT_PASSWORD MYSQL_USER: laraveluser MYSQL_PASSWORD: password SERVICE_TAGS: dev SERVICE_NAME: mysql volumes: - dbdata:/var/lib/mysql - ./mysql/my.cnf:/etc/mysql/my.cnf networks: - app-network
volumes: dbdata: driver: local
networks: app-network: driver: bridge
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Chúng ta hãy xem xét chi tiết các dịch vụ.
  • app - Dịch vụ này định nghĩa ứng dụng Laravel và chạy hình ảnh Docker của khách hàng có tên howtoforge/app. Chúng ta sẽ tạo hình ảnh này ở bước tiếp theo. Thư mục làm việc cho Laravel bên trong container được đặt tại /var/www được ánh xạ tới thư mục hiện tại trên máy chủ. Chúng ta cũng gắn một tệp cấu hình PHP được sao chép vào container PHP. Chúng tôi sẽ cấu hình điều này ở bước sau.
  • webserver - Dịch vụ này tạo một vùng chứa bằng cách sử dụng hình ảnh Nginx Docker và hiển thị các cổng 80 và 443 cho máy chủ. Chúng tôi cũng bind-mount volumes cho nhật ký Nginx, cấu hình tùy chỉnh, thư mục ứng dụng Laravel và chứng chỉ SSL.
  • db - Dịch vụ này tạo một vùng chứa bằng cách sử dụng hình ảnh MySQL Docker và định nghĩa các biến môi trường thiết lập tên cơ sở dữ liệu và mật khẩu gốc MySQL. Bạn có thể đặt tên cho cơ sở dữ liệu theo ý muốn và thay thế MYSQL_ROOT_PASSWORD bằng mật khẩu mạnh mà bạn chọn. Ngoài ra, hãy đặt tên người dùng MySQL (MYSQL_USER_NAME) và mật khẩu (MYSQL_USER_PASSWORD) để có thể truy cập vào cơ sở dữ liệu bạn đã chọn. Dịch vụ này cũng ánh xạ cổng 3306 từ container đến cổng 3306 trên máy chủ. Chúng tôi cũng bind-mount volume cho cấu hình MySQL tùy chỉnh và một volume cục bộ cho dữ liệu MySQL. Điều này cho phép bạn khởi động lại dịch vụ db mà không làm mất dữ liệu.
Để các dịch vụ giao tiếp với nhau, chúng tôi đã tạo một mạng Docker có tên là app-network . Nó được thiết lập như một mạng cầu nối. Nó cho phép các container được kết nối với nó giao tiếp với nhau. Trình điều khiển mạng cầu nối cài đặt các quy tắc trong máy chủ để các container trên các mạng cầu nối khác nhau không thể giao tiếp trực tiếp với nhau.

Bước 6 - Tạo Dockerfile​

Dockerfile được sử dụng để tạo hình ảnh tùy chỉnh. Không có hình ảnh chuẩn nào cho Laravel, đó là lý do tại sao chúng ta cần định nghĩa Dockerfile để tạo hình ảnh tùy chỉnh cho Laravel. Nó chứa các lệnh để cài đặt các gói và cấu hình môi trường Linux tùy thuộc vào nhu cầu ứng dụng của bạn. Bạn cũng có thể xuất bản hình ảnh tùy chỉnh của mình lên Docker Hub hoặc bất kỳ sổ đăng ký Docker riêng tư nào.Bạn có thể tìm hiểu thêm trong Hướng dẫn Dockerfile.

Tạo và mở Dockerfile để chỉnh sửa.
Mã:
$ nano Dockerfile
Dán mã sau vào đó.
Mã:
FROM php:8.2-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 \ libzip-dev \ unzip \ git \ curl \ libonig-dev
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install extensions
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
RUN docker-php-ext-configure gd --enable-gd --with-freetype --with-jpeg
RUN docker-php-ext-install gd
# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Copy existing application directory contents to the working directory
COPY . /var/www
# Assign permissions of the working directory to the www-data user
RUN chown -R www-data:www-data \ /var/www/storage \ /var/www/bootstrap/cache
# Assign writing permissions to logs and framework directories
RUN chmod 775 storage/logs \ /var/www/storage/framework/sessions \ /var/www/storage/framework/views
# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Chúng ta hãy xem điều gì đang xảy ra ở đây. Đầu tiên, chúng ta tạo hình ảnh tùy chỉnh của mình trên hình ảnh Docker php:8.2-fpm. Đây là hình ảnh dựa trên Debian có cài đặt PHP 8.2-FPM. Dockerfile sử dụng nhiều chỉ thị khác nhau để thực hiện các hoạt động, chỉ thị RUN chỉ định các lệnh để cập nhật, cài đặt và cấu hình các thiết lập bên trong vùng chứa, chỉ thị COPY để sao chép các tệp vào vùng chứa, EXPOSE chỉ thị để hiển thị một cổng trong vùng chứa và CMD chỉ thị để chạy lệnh.

Đầu tiên, chúng ta sao chép các tệp Composer từ thư mục Laravel trên máy chủ bên trong vùng chứa vào /var/www thư mục. Chúng tôi cũng đặt thư mục làm việc cho container thành /var/www. Sau đó, chúng tôi cài đặt nhiều điều kiện tiên quyết và gói cần thiết để Laravel hoạt động bao gồm các tiện ích mở rộng PHP như mbstring, gd, exif, zip, pdo_mysql và pcntl. Sau đó, chúng tôi cài đặt trình quản lý gói Composer.

Tiếp theo, chúng tôi sao chép tất cả các tệp từ thư mục Laravel vào vùng chứa và thiết lập quyền trên thư mục làm việc cho người dùng www-data. Đây là người dùng mà PHP sử dụng theo mặc định trên nền tảng Debian. Tiếp theo, chúng ta thiết lập quyền ghi chính xác cho các thư mục nhật ký, phiên và chế độ xem của Laravel.

Cuối cùng, chúng ta mở cổng 9000 cho dịch vụ PHP-FPM sẽ được máy chủ Nginx sử dụng và chạy lệnh PHP để khởi động vùng chứa.

Bước 7 - Cấu hình PHP​

Tạo thư mục PHP.
Mã:
$ mkdir ~/laravel/php
Tạo và mở local.ini tệp để chỉnh sửa.
Mã:
$ nano local.ini
Dán mã sau vào nó.
Mã:
upload_max_filesize=40M
post_max_size=40M
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc. Các lệnh này đặt kích thước tải lên tối đa cho các tệp đã tải lên. Thay đổi giá trị theo yêu cầu của bạn. Bạn có thể đặt bất kỳ cấu hình cụ thể nào của PHP để ghi đè lên các chỉ thị mặc định.

Bước 8 - Cấu hình Nginx​

Tạo thư mục Nginx để cấu hình trang web.
Mã:
$ mkdir ~/laravel/nginx/conf.d -p
Chúng ta cần tạo tệp cấu hình Nginx để sử dụng PHP-FPM làm máy chủ FastCGI để phục vụ Laravel.

Tạo và mở Tệp app.conf để chỉnh sửa.
Mã:
$ nano ~/laravel/nginx/conf.d/app.conf
Dán mã sau vào đó.
Mã:
server { # Redirect any http requests to https listen 80; listen [::]:80; server_name example.com; return 301 https://$host$request_uri;
}
server { listen 443 ssl http2; listen [::]:443 ssl http2; index index.php index.html; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; root /var/www/public; client_max_body_size 40m; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; ssl_ecdh_curve secp384r1; ssl_dhparam /etc/ssl/certs/dhparam.pem; # OCSP stapling ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; 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; }
}
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Tệp trên cấu hình Nginx để phục vụ cả phiên bản HTTP và HTTPS của trang Laravel và tự động chuyển hướng mọi yêu cầu HTTP sang HTTPS. Đảm bảo giá trị của biến client_max_body_size khớp với kích thước tải lên được đặt ở bước trước.

Trong khối vị trí PHP, chỉ thị fastcgi_pass chỉ định rằng Dịch vụ app đang lắng nghe trên một socket TCP ở cổng 9000. Máy chủ PHP-FPM cũng có thể lắng nghe trên một socket Unix có lợi thế hơn so với socket TCP. Nhưng nó không hoạt động nếu các dịch vụ đang chạy trên các máy chủ khác nhau, đây là trường hợp ở đây vì vùng chứa app đang chạy trên một máy chủ khác với vùng chứa webserver của bạn.

Bước 9 - Cấu hình MySQL​

Chúng tôi sẽ cấu hình MySQL để bật nhật ký truy vấn chung và chỉ định nhật ký tương ứng tệp.

Tạo thư mục MySQL.
Mã:
$ mkdir ~/laravel/mysql
Tạo và mở tệp my.cnf cho chỉnh sửa.
Mã:
$ nano ~/laravel/my.cnf
Dán mã sau vào đó.
Mã:
[mysqld]
general_log = 1
general_log_file = /var/lib/mysql/general.log
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Bước 10 - Thiết lập Môi trường Tệp​

Bây giờ chúng ta đã tạo và cấu hình tất cả các dịch vụ, đã đến lúc khởi động các container. Nhưng trước khi thực hiện, chúng ta cần cấu hình các biến môi trường cho Laravel. Laravel đi kèm với một tệp môi trường mặc định, .env.example.

Tạo một bản sao của tệp môi trường ví dụ.
Mã:
$ cp .env.example .env
Mở .env tệp để chỉnh sửa.
Mã:
$ nano .env
Tìm khối bắt đầu bằng DB_CONNECTION và cập nhật các giá trị của các biến theo yêu cầu của bạn.
Mã:
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laraveluser
DB_PASSWORD=your_laravel_db_password
Giá trị của DB_HOST sẽ là dịch vụ db. DB_NAME, DB_USERNAMEDB_PASSWORD sẽ là tên cơ sở dữ liệu, tên người dùng và mật khẩu mà bạn đã chọn ở bước 4 trong tệp Docker compose.

Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Bước 11 - Khởi động Container và hoàn tất cài đặt Laravel​

Cuối cùng cũng đến lúc khởi động container.
Mã:
$ docker compose up -d
Lệnh này khi chạy lần đầu tiên sẽ kéo Nginx, MySQL hình ảnh và sẽ tạo hình ảnh app bằng cách sử dụng Dockerfile mà chúng tôi đã tạo. Sau khi quá trình hoàn tất, bạn có thể kiểm tra trạng thái của các container bằng lệnh sau.
Mã:
$ docker ps
Bạn sẽ thấy kết quả tương tự.
Mã:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a57be976c0fa mysql:latest "docker-entrypoint.s…" 6 hours ago Up 6 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp db
85e515c4a404 howtoforge/app "docker-php-entrypoi…" 6 hours ago Up 6 hours 9000/tcp app
8418bbc83bd3 nginx:alpine "/docker-entrypoint.…" 6 hours ago Up 6 hours 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp webserver
Sau khi các container chạy, đã đến lúc hoàn tất cài đặt Laravel bằng lệnh docker compose exec để chạy lệnh bên trong container.

Tạo khóa ứng dụng và sao chép vào Tệp .env để bảo mật phiên người dùng và mã hóa dữ liệu người dùng.
Mã:
$ docker compose exec app php artisan key:generate
Tạo ứng dụng Laravel bộ nhớ đệm.
Mã:
$ docker compose exec app php artisan config:cache
Lệnh này sẽ tải các thiết lập cấu hình vào tệp /var/www/bootstrap/cache/config.php.

Truy cập https://example.com trong trình duyệt của bạn và bạn sẽ thấy trang sau ngụ ý cài đặt thành công Laravel.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22389%22%3E%3C/svg%3E

Bước 12 - Cấu hình gia hạn SSL​

Bây giờ trang Laravel đã hoạt động, đã đến lúc xem lại Thiết lập SSL để cấu hình gia hạn. Đối với điều này, chúng ta sẽ cần tạo các tập lệnh để dừng dịch vụ webserver trước khi bắt đầu gia hạn và bắt đầu lại dịch vụ sau khi chứng chỉ được gia hạn. Certbot cung cấp hai hook, pre_hookpost_hook cho mục đích này.

Tạo thư mục SSL để lưu trữ tập lệnh.
Mã:
$ mkdir ~/laravel/ssl
Tạo server-stop.sh script.
Mã:
$ sh -c 'printf "#!/bin/sh\ndocker stop webserver\n" > ~/laravel/ssl/server-stop.sh'
Tạo script server-start.sh.
Mã:
$ sh -c 'printf "#!/bin/sh\ndocker start webserver\n" > ~/laravel/ssl/server-start.sh'
Tạo tập lệnh có thể thực thi.
Mã:
$ chmod +x ~/laravel/ssl/server-*.sh
Bây giờ chúng ta cần yêu cầu Certbot sử dụng các tập lệnh này. Mở tệp /etc/letsencrypt/renewal/example.com.conf để chỉnh sửa.
Mã:
$ sudo nano /etc/letsencrypt/renewal/example.com.conf
Dán các dòng sau vào cuối tập tin.
Mã:
pre_hook = /home//laravel/ssl/server-stop.sh
post_hook = /home//laravel/ssl/server-start.sh
Lưu tập tin bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Kiểm tra quy trình gia hạn Chứng chỉ bằng cách chạy thử.
Mã:
$ sudo certbot renew --dry-run
Bạn sẽ nhận được kết quả tương tự xác nhận thành công.
Mã:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/example.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Account registered.
Hook 'pre-hook' ran with output: webserver
Simulating renewal of an existing certificate for example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded: /etc/letsencrypt/live/example.com/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Hook 'post-hook' ran with output: webserver
Chứng chỉ SSL của bạn hiện sẽ được tự động gia hạn và được vùng chứa Docker sử dụng để phục vụ ứng dụng Laravel của bạn.

Bước 13 - Di chuyển dữ liệu và Tinker Console​

Bây giờ ứng dụng đang chạy, bạn có thể di chuyển dữ liệu của mình và thử nghiệm với Lệnh tinker. Tinker là REPL (Vòng lặp Đọc-Đánh giá-In) dành cho Laravel. Lệnh tinker khởi tạo bảng điều khiển PsySH với Laravel được tải sẵn. PsySH là một bảng điều khiển dành cho nhà phát triển thời gian chạy và một trình gỡ lỗi tương tác cho PHP. Lệnh tinker cho phép bạn tương tác với ứng dụng Laravel từ dòng lệnh trong một shell tương tác.

Kiểm tra kết nối MySQL bằng lệnh artisan migrate trên container. Nó sẽ tạo một bảng migrations trong cơ sở dữ liệu.
Mã:
$ docker compose exec app php artisan migrate
Bạn sẽ nhận được kết quả sau.
Mã:
INFO Preparing database. Creating migration table .............................................................................................. 32ms DONE INFO Running migrations. 2014_10_12_000000_create_users_table .................................................................................. 184ms DONE 2014_10_12_100000_create_password_resets_table ......................................................................... 259ms DONE 2019_08_19_000000_create_failed_jobs_table ............................................................................ 102ms DONE 2019_12_14_000001_create_personal_access_tokens_table .................................................................. 46ms DONE
Tiếp theo, khởi động bảng điều khiển PsySH bằng cách sử dụng tinker lệnh.
Mã:
$ docker compose exec app php artisan tinker
Bạn sẽ nhận được thông tin sau nhắc nhở.
Mã:
Psy Shell v0.11.10 (PHP 8.2.1 — cli) by Justin Hileman
>
Kiểm tra kết nối MySQL bằng cách lấy dữ liệu bạn vừa di chuyển bằng cách chạy lệnh sau tại dấu nhắc bảng điều khiển.
Mã:
> \DB::table('migrations')->get();
Bạn sẽ nhận được thông báo sau đầu ra.
Mã:
= Illuminate\Support\Collection {#3670 all: [ {#3679 +"id": 1, +"migration": "2014_10_12_000000_create_users_table", +"batch": 1, }, {#3681 +"id": 2, +"migration": "2014_10_12_100000_create_password_resets_table", +"batch": 1, }, {#3682 +"id": 3, +"migration": "2019_08_19_000000_create_failed_jobs_table", +"batch": 1, }, {#3683 +"id": 4, +"migration": "2019_12_14_000001_create_personal_access_tokens_table", +"batch": 1, }, ], }
Nhập exit để thoát khỏi console.
Mã:
> exit INFO Goodbye.
Bạn có thể sử dụng tinker để tương tác với cơ sở dữ liệu của bạn và thử nghiệm với các dịch vụ và mô hình. Bây giờ bạn có thể bắt đầu sử dụng Laravel để phát triển thêm.

Kết luận​

Đây là phần kết thúc hướng dẫn của chúng tôi, nơi bạn đã chứa và cài đặt ứng dụng Laravel bằng Docker, MySQL và PHP. Bạn cũng đã phục vụ ứng dụng trên một tên miền an toàn. Nếu bạn có bất kỳ câu hỏi nào, hãy đăng chúng trong phần bình luận bên dưới.
 
Back
Bên trên