本教程适用于以下操作系统版本

  • Ubuntu 22.04(Jammy Jellyfish)
  • Ubuntu 18.04(Bionic Beaver)

本页内容

  • 先决条件
  • 步骤 1 - 配置防火墙
  • 步骤 2 - 安装 SSL
  • 步骤 3 - 安装 Docker 和 Docker Compose
  • 步骤 4 - 下载 Laravel 并安装依赖
  • 步骤 5 - 创建 Docker Compose 文件
  • 步骤 6 - 创建 Dockerfile
  • 步骤 7 - 配置 PHP
  • 步骤 8 - 配置 Nginx
  • 步骤 9 - 配置 MySQL
  • 步骤 10 - 配置环境文件
  • 步骤 11 - 启动容器并完成 Laravel 安装
  • 步骤 12 - 配置 SSL 续期
  • 步骤 13 - 数据迁移与 Tinker 控制台
  • 结论

Laravel 是一个免费的开源 PHP 框架,提供了一系列工具和资源来构建现代化的 PHP 应用程序。凭借种类繁多的兼容包和扩展,Laravel 已广受欢迎,许多开发者将其作为首选框架。Laravel 提供了强大的数据库工具,包括名为 Eloquent 的 ORM(对象关系映射器)以及用于创建数据库迁移的内置机制。它自带一个名为 Artisan 的命令行工具,开发者可以通过它引导创建新的模型、控制器及其他应用程序组件,从而加速整体应用程序开发。

将应用程序容器化,是指调整和适配应用程序及其组件,使其能够运行在被称为容器的轻量级环境中。本指南将使用 Docker Compose 将 Laravel 应用程序容器化,用于开发。

我们将为 Laravel 应用程序创建三个 Docker 容器。

  • 运行 PHP 8.2-FPM 的 app 服务
  • 运行 MySQL 8.0 的 db 服务
  • 一个 nginx 服务,它使用 app 服务在将 Laravel 应用程序提供给用户之前解析 PHP 代码

我们还将使用 Let's Encrypt 为 Laravel 网站创建 SSL 证书。

先决条件

  • 一台运行 Ubuntu 22.04 的服务器。
  • 一个具有 sudo 权限的非 root 用户。
  • 一个指向你服务器的完全限定域名(FQDN)。在本教程中,我们将使用 example.com 作为域名。
  • 确保一切均已更新。 $ sudo apt update
  • 安装基础工具包。其中部分可能已安装。 $ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y

一台运行 Ubuntu 22.04 的服务器。

一个具有 sudo 权限的非 root 用户。

一个指向你服务器的完全限定域名(FQDN)。在本教程中,我们将使用 example.com 作为域名。

确保一切均已更新。

$ sudo apt update

安装基础工具包。其中部分可能已安装。

$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y

步骤 1 - 配置防火墙

第一步是配置防火墙。Ubuntu 默认自带 ufw(Uncomplicated Firewall,简单防火墙)。

检查防火墙是否正在运行。

$ sudo ufw status

你应该会看到如下输出。

Status: inactive

放行 SSH 端口,以免启用防火墙后中断当前连接。

$ sudo ufw allow OpenSSH

同时放行 HTTP 和 HTTPS 端口。

$ sudo ufw allow http
$ sudo ufw allow https

启用防火墙

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

再次检查防火墙状态。

$ sudo ufw status

你应该会看到类似的输出。

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)

步骤 2 - 安装 SSL

在继续之前,我们先为域名创建 SSL 证书。我们将其创建在 Docker 之外,因为这样更易于维护。随后我们会将证书同步到容器,容器会定期续期和刷新证书。

我们需要安装 Certbot 来生成 SSL 证书。你可以通过 Ubuntu 的软件仓库安装 Certbot,也可以使用 Snapd 工具获取最新版本。我们将使用 Snapd 版本。

Ubuntu 22.04 默认已安装 Snapd。运行以下命令,确保你的 Snapd 版本是最新的。确保你的 Snapd 版本是最新的。

$ sudo snap install core
$ sudo snap refresh core

安装 Certbot。

$ sudo snap install --classic certbot

使用以下命令,通过创建指向 /usr/bin 目录的符号链接,确保 Certbot 命令可以运行。

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

运行以下命令生成 SSL 证书。

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m 
[email protected]
 -d example.com

上述命令会将证书下载到服务器上的 /etc/letsencrypt/live/example.com 目录。

生成 Diffie-Hellman 组证书。

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

对流程进行一次干跑(dry run),检查 SSL 续期是否正常工作。

$ sudo certbot renew --dry-run

如果没有看到错误,说明一切就绪。你的证书将自动续期。

在设置好 Docker 并安装 Laravel 之后,需要修改续期流程。我们将在后续章节中介绍。

步骤 3 - 安装 Docker 和 Docker Compose

Ubuntu 22.04 自带较旧版本的 Docker。要安装最新版本,首先需要导入 Docker 的 GPG 密钥。

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

创建 Docker 仓库文件。

$ 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

更新系统仓库列表。

$ sudo apt update

安装最新版本的 Docker。

$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

验证其是否正在运行。

$ 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

默认情况下,Docker 需要 root 权限。如果你想避免每次运行 docker 命令都使用 sudo,可以将你的用户名加入 docker 组。

$ sudo usermod -aG docker $(whoami)

你需要注销服务器并以同一用户重新登录才能使此更改生效,或者使用以下命令。

$ su - ${USER}

确认你的用户已加入 Docker 组。

$ groups
navjot wheel docker

步骤 4 - 下载 Laravel 并安装依赖

第一步是下载最新版本的 Laravel 并安装依赖,包括 PHP 包管理器 Composer。

创建 Laravel 应用程序目录。

$ mkdir ~/laravel

切换到该目录。

$ cd ~/laravel

将最新的 Laravel 版本克隆到该目录。不要忘记命令末尾的 . ,它表示 Git 会将文件克隆到当前目录。

$ git clone https://github.com/laravel/laravel.git .

使用 Docker 的 Compose 镜像挂载 Laravel 项目所需的目录。这样可以避免全局安装 Composer。

$ docker run --rm -v $(pwd):/app composer install

上述命令会创建一个临时容器,它先绑定挂载到当前目录,随后被移除。它会将 Laravel 目录的内容复制到容器中,并确保 Composer 在容器内创建的 vendor 文件夹被复制回当前目录。

设置 Laravel 目录的权限,使其归当前登录的用户所有。

$ sudo chown -R $USER:$USER ~/laravel

步骤 5 - 创建 Docker Compose 文件

创建并打开 Docker Compose 文件以供编辑。

$ nano docker-compose.yml

在其中粘贴以下代码。这里我们定义了三个服务:app、webserver 和 db。请将 db 服务下的 MYSQL_ROOT_PASSWORD 替换为你自行设定的强密码。

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

按 Ctrl + X 保存文件,并在提示时输入 Y。

下面我们详细看一下各个服务。

  • app - 该服务定义了 Laravel 应用程序,并运行一个名为 howtoforge/app 的自定义 Docker 镜像。我们将在下一步创建此镜像。Laravel 在容器内的工作目录设置为 /var/www,它映射到宿主机上的当前目录。我们还挂载了一个 PHP 配置文件,该文件会被复制到 PHP 容器中。我们将在后续步骤中进行配置。
  • webserver - 该服务使用 Nginx Docker 镜像创建一个容器,并将 80 和 443 端口暴露给宿主机。我们还为 Nginx 日志、自定义配置、Laravel 应用程序目录和 SSL 证书绑定挂载了卷。
  • db - 该服务使用 MySQL Docker 镜像创建一个容器,并定义环境变量来设置数据库名称和 MySQL root 密码。你可以随意命名数据库,并将 MYSQL_ROOT_PASSWORD 替换为你自行设定的强密码。同时,设置 MySQL 用户名(MYSQL_USER_NAME)和密码(MYSQL_USER_PASSWORD),该用户将拥有你选择的数据库访问权限。该服务还将容器内的 3306 端口映射到宿主机的 3306 端口。我们也为自定义 MySQL 配置绑定挂载了卷,并为 MySQL 数据挂载了本地卷。这样你可以在不丢失数据的情况下重启 db 服务。

为了让各服务相互通信,我们创建了一个名为 app-network 的 Docker 网络。它被设置为桥接网络(bridge network)。它允许连接到该网络的容器彼此通信。桥接网络驱动会在宿主机上安装规则,使得不同桥接网络上的容器无法直接相互通信。

步骤 6 - 创建 Dockerfile

Dockerfile 用于创建自定义镜像。Laravel 没有标准镜像,因此我们需要定义一个 Dockerfile 来为 Laravel 创建自定义镜像。它包含根据你的应用需要安装软件包和配置 Linux 环境的命令。你也可以将自定义镜像发布到 Docker Hub 或任何私有 Docker 仓库。你可以从我们的 Dockerfile 教程中了解更多。

创建并打开 Dockerfile 以供编辑。

$ nano Dockerfile

在其中粘贴以下代码。

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"]

按 Ctrl + X 保存文件,并在提示时输入 Y。

我们来看一下这里发生了什么。首先,我们在 php:8.2-fpm Docker 镜像的基础上创建自定义镜像。这是一个基于 Debian 的镜像,已安装 PHP 8.2-FPM。Dockerfile 使用各种指令来执行操作:RUN 指令指定用于在容器内更新、安装和配置设置的命令,COPY 指令用于将文件复制到容器内,EXPOSE 指令用于暴露容器中的端口,CMD 指令用于运行命令。

首先,我们将 Composer 文件从宿主机上 Laravel 目录复制到容器内的 /var/www 目录。我们还将容器的工作目录设为 /var/www。接着,我们安装 Laravel 运行所需的各种前置条件和软件包,包括 PHP 扩展:mbstring、gd、exif、zip、pdo_mysql 和 pcntl。然后,我们安装 Composer 包管理器。

接下来,我们将 Laravel 目录中的所有文件复制到容器,并为 www-data 用户设置工作目录的权限。这是 PHP 在 Debian 平台上默认使用的用户。接着,我们对 Laravel 的 logs、sessions 和 views 目录设置正确的写入权限。

最后,我们为 PHP-FPM 服务暴露 9000 端口(供 Nginx 服务器使用),并运行 PHP 命令来启动容器。

步骤 7 - 配置 PHP

创建 PHP 目录。

$ mkdir ~/laravel/php

创建并打开 local.ini 文件以供编辑。

$ nano local.ini

在其中粘贴以下代码。

upload_max_filesize=40M
post_max_size=40M

按 Ctrl + X 保存文件,并在提示时输入 Y。这些指令设置了上传文件的最大尺寸。请根据你的需求修改该值。你可以放入任何 PHP 相关的配置来覆盖默认指令。

步骤 8 - 配置 Nginx

为站点配置创建 Nginx 目录。

$ mkdir ~/laravel/nginx/conf.d -p

我们需要创建一个 Nginx 配置文件,以使用 PHP-FPM 作为 FastCGI 服务器来提供 Laravel 服务。

创建并打开 app.conf 文件以供编辑。

$ nano ~/laravel/nginx/conf.d/app.conf

在其中粘贴以下代码。

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;
    }
}

按 Ctrl + X 保存文件,并在提示时输入 Y。

上述文件将 Nginx 配置为同时提供 Laravel 站点的 HTTP 和 HTTPS 版本,并自动将任何 HTTP 请求重定向到 HTTPS。请确保变量 client_max_body_size 的值与上一步中设置的上传大小一致。

在 PHP location 块中,fastcgi_pass 指令指定 app 服务正在 9000 端口的 TCP 套接字上监听。PHP-FPM 服务器也可以监听 Unix 套接字,这在性能上优于 TCP 套接字。但在本场景中服务运行在不同主机上时它无法工作,因为这里 app 容器与 webserver 容器运行在不同的主机上。

步骤 9 - 配置 MySQL

我们将配置 MySQL 以启用通用查询日志(general query log)并指定相应的日志文件。

创建 MySQL 目录。

$ mkdir ~/laravel/mysql

创建并打开 my.cnf 文件以供编辑。

$ nano ~/laravel/my.cnf

在其中粘贴以下代码。

[mysqld]
general_log = 1
general_log_file = /var/lib/mysql/general.log

按 Ctrl + X 保存文件,并在提示时输入 Y。

步骤 10 - 配置环境文件

既然我们已经创建并配置了所有服务,现在可以启动容器了。但在启动之前,我们需要配置 Laravel 的环境变量。Laravel 自带一个默认的环境文件 .env.example。

创建示例环境文件的副本。

$ cp .env.example .env

打开 .env 文件进行编辑。

$ nano .env

找到以 DB_CONNECTION 开头的代码块,并根据你的需求更新各变量的值。

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laraveluser
DB_PASSWORD=your_laravel_db_password

DB_HOST 的值应为 db 服务。DB_NAME、DB_USERNAME 和 DB_PASSWORD 将分别是你在步骤 4 的 Docker Compose 文件中选择的数据库名、用户名和密码。

按 Ctrl + X 保存文件,并在提示时输入 Y。

步骤 11 - 启动容器并完成 Laravel 安装

终于到了启动容器的时候。

$ docker compose up -d

该命令在首次运行时会拉取 Nginx、MySQL 镜像,并使用我们创建的 Dockerfile 创建 app 镜像。过程完成后,你可以使用以下命令检查容器的状态。

$ docker ps

你会看到类似的输出。

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

容器运行起来之后,就可以使用 docker compose exec 命令在容器内运行命令,来完成 Laravel 的安装。

生成应用程序密钥并将其复制到你的 .env 文件中,以保护用户会话并加密用户数据。

$ docker compose exec app php artisan key:generate

创建 Laravel 应用程序缓存。

$ docker compose exec app php artisan config:cache

该命令会将配置设置加载到 /var/www/bootstrap/cache/config.php 文件中。

在浏览器中访问 https://example.com,你将看到如下页面,表示 Laravel 安装成功。

在 Ubuntu 22.04 系统上使用 Docker 容器部署 Laravel 应用教程

步骤 12 - 配置 SSL 续期

既然 Laravel 站点已经运行,是时候重新审视 SSL 设置来配置续期了。为此,我们需要创建脚本,在续期开始前停止 webserver 服务,并在证书续期完成后重新启动该服务。Certbot 为此提供了两个钩子:pre_hook 和 post_hook。

创建 SSL 目录以存放脚本。

$ mkdir ~/laravel/ssl

创建 server-stop.sh 脚本。

$ sh -c 'printf "#!/bin/sh\ndocker stop webserver\n" > ~/laravel/ssl/server-stop.sh'

创建 server-start.sh 脚本。

$ sh -c 'printf "#!/bin/sh\ndocker start webserver\n" > ~/laravel/ssl/server-start.sh'

使脚本可执行。

$ chmod +x ~/laravel/ssl/server-*.sh

现在我们需要告诉 Certbot 使用这些脚本。打开 /etc/letsencrypt/renewal/example.com.conf 文件进行编辑。

$ sudo nano /etc/letsencrypt/renewal/example.com.conf

在文件末尾粘贴以下行。

pre_hook = /home/<username>/laravel/ssl/server-stop.sh
post_hook = /home/<username>/laravel/ssl/server-start.sh

按 Ctrl + X 保存文件,并在提示时输入 Y。

通过干跑测试证书续期流程。

$ sudo certbot renew --dry-run

你会看到类似的输出,确认续期成功。

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

你的 SSL 证书现在将自动续期,并由 Docker 容器用于为 Laravel 应用程序提供服务。

步骤 13 - 数据迁移与 Tinker 控制台

既然应用程序已经运行,你可以迁移数据并使用 tinker 命令进行试验。Tinker 是 Laravel 的 REPL(Read-Eval-Print Loop,读取-求值-输出循环)。tinker 命令会启动一个预加载了 Laravel 的 PsySH 控制台。PsySH 是一个 PHP 的运行时开发者控制台和交互式调试器。tinker 命令允许你在交互式 shell 中通过命令行与 Laravel 应用程序交互。

在容器上使用 artisan migrate 命令测试 MySQL 连接。它会在数据库中创建一个 migrations 表。

$ docker compose exec app php artisan migrate

你会看到以下输出。

 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

接下来,使用 tinker 命令启动 PsySH 控制台。

$ docker compose exec app php artisan tinker

你会看到以下提示符。

Psy Shell v0.11.10 (PHP 8.2.1 — cli) by Justin Hileman
>

通过在控制台提示符下运行以下命令,获取你刚刚迁移的数据,以测试 MySQL 连接。

> \DB::table('migrations')->get();

你会看到以下输出。

= 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,
      },
    ],
  }

输入 exit 退出控制台。

> exit
   INFO  Goodbye.

你可以使用 tinker 与数据库交互,并试验服务和模型。现在你可以开始使用 Laravel 进行进一步的开发。

结论

本教程到此结束,你已使用 Docker、MySQL 和 PHP 将 Laravel 应用程序容器化并完成了安装。你还在安全的域名上提供了该应用程序。如果你有任何问题,请在下方评论中留言。