介绍
持续集成 (CI) 和持续部署 (CD) 是当前软件开发中最热门的话题。为了实现 CI/CD 方面的软件架构,开发人员会使用容器。容器 是轻量级、虚拟化、可移植且软件定义的环境。在容器中,软件可以与物理宿主机上运行的其他软件隔离运行。本教程的重点是使用容器平台 Docker 来部署和运行 Web 应用程序。Docker 有助于简化 Web 服务器栈的设置过程。在本教程中,我们将使用 LEMP 栈来托管 Laravel 应用程序。
LEMP 栈结合了 Linux 作为操作系统、Nginx 作为 Web 服务器、MySQL 作为数据库,以及 PHP 语言用于脚本编写和动态处理。您可以参考我们的关于如何在 Ubuntu 上安装 and 配置 LEMP 栈的教程。Laravel 是用于开发 Web 应用程序的顶级 PHP 框架之一。
Docker 提供了一个名为 Docker Compose 的工具,用于定义 Docker 容器的设置过程。Docker Compose 允许开发人员在一个名为 docker-compose 的文件中定义其应用程序的基础设施、服务、数据卷、网络和任何依赖项。它可以通过其命令(如 docker container create、docker container run 等)管理多个 Docker 容器。
在本教程中,您将学习如何在 Docker 容器中部署带有 Nginx 和 MySQL 的 Laravel Web 应用程序。整个栈的配置将在 docker-compose 文件中定义,以及 PHP、MySQL 和 Nginx 的其他配置文件。让我们开始吧!
首先
- 由于这是一个动手实践教程,您应该已经安装了 Ubuntu 20.04 作为您的初始运行环境。您还应该有一个具有 sudo 特权的非 root 用户。这里有一个 逐步教程,可帮助您设置 Ubuntu 服务器.
- 。您需要安装 Docker。我们有一个关于如何在 Ubuntu 18.04 上安装和操作 Docker.
- 的教程。您需要按照官方 Docker 文档中的教程安装 Docker Compose。
步骤 1:下载 Laravel 并安装依赖项
第一步是从仓库中获取 Laravel 代码。在实际场景中,您的 Laravel 代码可能存在于某个仓库中,例如 GitHub、Bit Bucket、Gitlab 等。然而,为了本教程的目的,我们将从 GitHub 上的官方 Laravel 仓库克隆最新版本。该仓库带有一个 composer 文件,这是 PHP 的应用程序级依赖管理器。由于我们希望所有内容都在 Docker 容器内运行,我们将使用 Docker 的 composer 镜像来安装依赖项。这也有助于我们避免在实际宿主机上全局安装 composer。接下来,打开您的终端。
切换到您的用户主目录:
|
1 |
cd ~ |
输入以下命令将仓库克隆到名为 laravel-web 的目录中。您可以随意命名。在撰写本教程时,运行此命令会拉取 Laravel 版本 8。当您运行该命令时,可能会发现一个新版本:
|
1 |
git clone https://github.com/laravel/laravel.git laravel-web |
然后,进入您刚刚克隆仓库的目录:
|
1 |
cd ~/laravel-web |
输入以下命令,使用 Docker 的 composer 镜像:
|
1 |
docker run --rm -v $(pwd):/app composer install |
docker run 命令中的 -v 和 –rm 标志会创建一个临时容器,该容器在被删除之前将绑定挂载到当前目录。该命令将 ~/laravel-web 的内容复制到容器中,并确保由 composer 创建的 vendor 文件夹被复制回当前目录。
现在,您需要将 laravel-web 目录的所有权更改为非 root 用户。这将允许您在后续步骤中以非 root 用户身份操作应用程序代码,并在容器内运行进程。输入以下命令以更改所有权:
|
1 |
sudo chown -R $USER:$USER ~/laravel-web |
您的应用程序代码现在已就绪。该目录归非 root 用户所有,因此您可以继续在 docker-compose 文件中定义应用程序服务。
步骤 2:创建 Docker Compose 文件
Docker Compose 简化了构建和部署应用程序的过程。一旦定义了配置和服务,您就可以轻松地在任何安装了 Docker 和 Docker Compose 的主机上部署应用程序,而无需担心应用程序的依赖关系。最重要的是,您只需使用一个 Docker Compose 命令即可完成此操作,我们将在步骤 9.
在此步骤中,您将定义一个 Docker Compose 文件,其中包含部署 Laravel 应用程序所需的 Web 服务器、数据库和应用程序服务的配置。
Docker Compose 文件是 YAML 文件,以 .yml 扩展名保存。请注意,有效的 Docker Compose 文件需要正确的缩进。输入以下命令以使用 nano 创建并打开该文件进行编辑:
|
1 |
nano ~/laravel-web/docker-compose.yml |
接下来,您将在该文件中定义三个服务:app、webserver 和 db。db 部分定义了应用程序的数据库凭据,因此请务必选择一个强 mysql_root_password 并在该部分中进行替换。复制并粘贴以下代码:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
version: '2.0' services: #PHP 服务 app: build: context: . dockerfile: Dockerfile image: cloudsigma.com/php container_name: app restart: unless-stopped tty: true environment: SERVICE_NAME: app SERVICE_TAGS: dev working_dir: /var/www/html/ networks: - app-network #Nginx 服务 webserver: image: nginx:alpine container_name: webserver restart: unless-stopped tty: true ports: - "80:80" - "443:443" networks: - app-network #MySQL 服务 db: image: mysql:5.7.32 container_name: db restart: unless-stopped tty: true ports: - "3306:3306" environment: MYSQL_DATABASE: laravel_web MYSQL_ROOT_PASSWORD: replace_mysql_root_password SERVICE_TAGS: dev SERVICE_NAME: mysql networks: - app-network #Docker 网络 networks: app-network: driver: bridge |
以下是上述代码中服务定义的说明:
- app:定义 Laravel 应用程序并运行一个自定义 Docker 镜像 cloudsigma.com/php,我们将在步骤 4 中定义它。它还将容器中的 working_dir 设置为 /var/www/html。
- webserver:它从 Docker 拉取 nginx:alpine 镜像并公开端口 80 和 443.
- db:它从 Docker 拉取 mysql:5.7.32 镜像 并定义了一些环境变量。其中包括一个名为 laravel_web 的数据库(用于应用程序)以及数据库的 root 密码。您可以将该数据库重命名为您选择的名称。请记住将 MYSQL_ROOT_PASSWORD 属性替换为强密码。此服务还将主机上的 3306 端口映射到容器上的 3306 端口。
每个服务中的 container_name 属性定义了该服务对应容器的名称。如果您不定义该属性,Docker 会为每个容器选择一个随机名称。
networks 属性定义了一个 桥接网络,称为 app-network,它有助于容器之间的通信。桥接网络由软件网桥控制,该网桥仅允许同一网桥上的容器之间进行通信。网桥软件控制器安装的驱动程序可防止不同桥接网络上的容器直接相互通信。这确保了高度的安全性,因为只有相关的服务才能直接通信。您可以选择定义连接到相关功能的多个服务和网络。
步骤 3:如何持久化数据
您的 Web 应用程序将处理数据并将其提供给用户。在这一步中,我们将引导您为服务定义定义数据卷 (volumes) 和绑定挂载 (bind mounts),以持久化应用程序的数据。Docker 提供了令人惊叹的功能,例如 绑定挂载 和 数据卷,用于持久化数据和保存应用程序配置文件。我们将在使用 Docker 设置 Laravel 应用程序时使用它们。
出于各种原因,数据卷 (Volumes) 是首选,包括提供备份以及在容器生命周期之外持久化数据。绑定挂载 (Bind Mounts) 通常引用宿主机上的实际目录。当您创建数据卷时,会在 Docker 的存储目录中创建一个新目录,该目录由 Docker 管理。当您创建绑定挂载时,宿主机内的文件或目录会被挂载到容器中(通过其绝对路径引用)。这对于我们的 Web 应用程序至关重要,因为当您在宿主机上修改代码时,修改会立即在容器中生效。
使用绑定挂载时要小心。在 Docker 容器内运行的进程可以更改宿主机文件系统,并影响宿主机系统上运行的非 Docker 进程。虽然 Docker 挂载是一项强大的功能,但请注意这些安全影响。
话虽如此,让我们看看如何在我们的设置中使用这两个功能。首先,我们将定义一个用于持久化 MySQL 数据库的数据卷。在我们创建的 Docker Compose 文件中,在 db 服务下,添加一个 volumes 属性,如下面高亮显示所示:
|
1 2 3 4 5 6 7 8 |
#MySQL 服务 db: ... volumes: - dbdata:/var/lib/mysql/ networks: - app-network ... |
按照定义,数据卷 dbdata 将持久化 /var/lib/mysql 的内容。它有助于备份,并允许在不丢失数据的情况下重启服务。接下来,您应该在 Docker Compose 文件的末尾添加 volumes 定义,使其在各个服务之间可用。在文件底部输入以下代码片段:
|
1 2 3 4 |
#数据卷 volumes: dbdata: driver: local |
要连接到 MySQL 数据库,您必须提供凭据。为此,通过在 db 服务的 volumes 属性下添加以下高亮显示的代码片段来定义绑定挂载:
|
1 2 3 4 5 6 7 |
#MySQL 服务 db: ... volumes: - dbdata:/var/lib/mysql/ - ./mysql/my.cnf:/etc/mysql/my.cnf ... |
该代码将宿主机上的 ~/laravel-web/mysql/my.cnf 绑定到容器中的 /etc/mysql/my.cnf。绑定的文件是我们将创建的 MySQL 配置文件,具体在 步骤 7.
容器需要使用 Nginx 服务器来提供您的应用程序代码。因此,为此目的,我们将在 webserver 服务下定义两个绑定挂载(一个用于 Nginx 配置文件,一个用于应用程序代码)。在 webserver 服务下添加以下用于 volumes 定义的代码片段:
|
1 2 3 4 5 6 7 8 |
#Nginx 服务 webserver: ... volumes: - ./:/var/www/html/ - ./nginx/conf.d/:/etc/nginx/conf.d/ networks: - app-network |
这一行 – ./:/var/www/html 将 ~/laravel-web 目录中的应用程序代码绑定到容器内的 /var/www/html 目录。对于第二个绑定挂载,将在 ~/laravel-web/nginx/conf.d/ 创建一个 Nginx 配置文件。它将被挂载到容器内的 /etc/nginx/conf.d/。因此,您可以根据需要更新宿主机上的配置文件。我们将在步骤 6.
为了使代码中的更改自动反映在容器中,我们将应用程序代码绑定挂载到容器。这可以加快部署过程。因此,将以下突出显示的代码片段添加到 app 服务中:
|
1 2 3 4 5 6 7 8 |
#PHP 服务 app: ... volumes: - ./:/var/www/html/ - ./php/laravel.ini:/usr/local/etc/php/conf.d/laravel.ini networks: - app-network |
第二行绑定了一个 PHP 配置文件,我们将在步骤 5 中的 ~/laravel-web/php/laravel.ini 文件内创建,并将其绑定到容器内的 /usr/local/etc/php/conf.d/laravel.ini。
现在,您完整的 Docker Compose 文件应该如下所示:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
version: '2.0' services: #PHP 服务 app: build: context: . dockerfile: Dockerfile image: cloudsigma.com/php container_name: app restart: unless-stopped tty: true environment: SERVICE_NAME: app SERVICE_TAGS: dev working_dir: /var/www/html/ volumes: - ./:/var/www/html/ - ./php/laravel.ini:/usr/local/etc/php/conf.d/laravel.ini networks: - app-network #Nginx 服务 webserver: image: nginx:alpine container_name: webserver restart: unless-stopped tty: true ports: - "80:80" - "443:443" volumes: - ./:/var/www/html/ - ./nginx/conf.d/:/etc/nginx/conf.d/ networks: - app-network #MySQL 服务 db: image: mysql:5.7.32 container_name: db restart: unless-stopped tty: true ports: - "3306:3306" environment: MYSQL_DATABASE: laravel_web MYSQL_ROOT_PASSWORD: replace_mysql_root_password SERVICE_TAGS: dev SERVICE_NAME: mysql volumes: - dbdata:/var/lib/mysql/ - ./mysql/my.cnf:/etc/mysql/my.cnf networks: - app-network #Docker 网络 networks: app-network: driver: bridge #数据卷 volumes: dbdata: driver: local |
如果一切看起来正常,请按 Ctrl + O 保存文件。然后,按 Ctrl + X 退出编辑器。此时,您应该能够使用 Docker Compose 文件为您的应用程序构建自定义 Docker 镜像。
步骤 4:创建 Dockerfile
Dockerfile 包含 Docker 可用于构建自定义 Docker 镜像的指令。它还可以安装所需的软件并为您的应用程序配置必要的设置。它们指定了托管您应用程序代码的容器内部环境。您可以将创建的镜像推送到 docker hub 以便分享,或者将它们放在其他私有镜像仓库中。
我们将创建一个 Dockerfile,其中将指定构建 Laravel 应用程序镜像的指令。使用 nano 在 ~/laravel-web 目录中创建 Dockerfile:
|
1 |
nano ~/laravel-web/Dockerfile |
在打开的编辑器中,添加以下代码:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
FROM php:7.4-fpm # 将 composer.lock 和 composer.json 复制到工作目录 COPY composer.lock composer.json /var/www/html/ # 设置工作目录 WORKDIR /var/www/html/ # 安装操作系统软件的依赖项 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 \ libonig-dev \ curl # 清除缓存 RUN apt-get clean && rm -rf /var/lib/apt/lists/* # 安装 php 扩展 RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl RUN docker-php-ext-configure gd --with-freetype --with-jpeg RUN docker-php-ext-install gd # 安装 composer (php 包管理器) RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer # 将现有的应用程序目录内容复制到工作目录 COPY . /var/www/html # 将工作目录的权限分配给 www-data 用户 RUN chown -R www-data:www-data \ /var/www/html/storage \ /var/www/html/bootstrap/cache # 暴露端口 9000 并启动 php-fpm 服务器 (用于 FastCGI 进程管理器) EXPOSE 9000 CMD ["php-fpm"] |
Dockerfile 首先基于 php:7.4-fpm Docker 镜像创建一个镜像。这是一个基于 Debian 的镜像,安装了 PHP FastCGI 实现(PHP-FPM)。为了让 Laravel 正常运行,它需要其他可用的 php 扩展,如 mcrypt、pdo_mysql、mbstring 和 imagick,该脚本会安装这些扩展。然后它会安装 composer php 包管理器。容器将使用它来安装 Laravel php 依赖项。
您可以使用 RUN 指令在容器内定义安装、更新和配置设置等命令。它还分配用户权限。WORKDIR 指令指定工作目录,在本例中为 /var/www/html。该脚本运行 CHOWN 命令,将 /var/www/html 目录的权限分配给 www-data 用户。
在最终构建镜像之前,必须暴露一个端口,以允许访问容器内运行的应用程序。EXPOSE 命令为 php-fpm 服务器暴露一个端口 9000。要运行的最后一个命令是 CMD 指令。它运行 php-fpm 来启动服务器。
您现在可以按 Ctrl + O 保存文件。然后,按 Ctrl + X 退出编辑器。
第 5 步:配置 PHP
在此步骤中,我们将配置 php 服务以处理来自 Nginx 的传入请求。您将在 php 目录中创建一个 laravel.ini 文件。该文件将保存 PHP 配置。这就是您在容器中绑定挂载到 /usr/local/etc/php/conf.d/laravel.ini 的文件,位于 步骤 3。此文件中的配置将覆盖 PHP 启动时通常读取的默认 php.ini 文件。输入以下命令创建 php 目录:
|
1 |
mkdir ~/laravel-web/php |
通过输入以下命令,在 php 目录中创建并打开 laravel.ini 文件:
|
1 |
nano ~/laravel-web/php/laravel.ini |
默认的 php.ini 文件的上传限制设置为 2M。作为一个示例,我们将向您展示如何通过更改允许的上传限制值来调整和设置 php 配置,以防您需要上传更大的文件。在文件中输入以下代码行:
|
1 2 |
upload_max_filesize=80M post_max_size=80M |
这将设置上传限制,您可以上传总大小不超过 80MB 的文件。您可以在 laravel.ini 文件中添加其他 php 配置以覆盖默认的 php 配置。现在,保存并关闭文件。
步骤 6:配置 Nginx
在此步骤中,我们将配置 Nginx 以使用我们之前定义的 php 服务。它将使用 PHP-FPM 作为 FastCGI 服务器 来提供动态内容。FastCGI 服务器是一种允许交互式程序与 Web 服务器进行接口交互的软件。
正如我们在 步骤 3 的 docker-compose 文件中所定义的那样,我们将在 ~/laravel-web/nginx/conf.d/ 目录中创建 Nginx 配置文件 app.conf。首先,输入以下命令创建该目录:
|
1 |
mkdir -p ~/laravel-web/nginx/conf.d |
接下来,通过输入以下命令,使用 nano 创建并打开 app.conf 文件:
|
1 |
nano ~/laravel-web/nginx/conf.d/app.conf |
将以下 Nginx 配置代码添加到文件中:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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; } } |
Nginx 读取称为服务器块的配置文件,以根据 URL 了解应该向网站访问者提供哪个目录。要了解更多信息,请阅读我们关于设置服务器块的教程:在 Ubuntu 上安装 Nginx18.04。定义的指令具有以下用途:
- listen – 定义服务器将侦听传入请求的端口,通常是端口 80。
- error_log & access_log – 定义用于写入应用程序日志的文件。
- root – 定义 Web 根路径,即用于处理从互联网向服务器发起的任何请求的目录。
在 php 的 location 块中,fastcgi_pass 指令指定 app 服务正在侦听端口 9000 上的 TCP 套接字(这已在 Dockerfile 中定义)。这指示 PHP-FPM 服务器通过网络进行侦听,而不是在 Unix 套接字上。虽然 Unix 套接字在速度上可能比 TCP 套接字略有优势,但它缺少网络协议,因此会跳过网络栈。
对于主机位于同一台机器上的场景,Unix 套接字会更合适。然而,如果您的服务运行在不同的主机上,TCP 套接字具有连接分布式服务的优势。在我们的案例中,应用容器与我们的 Web 服务器容器运行在不同的主机上。因此,TCP 套接字最适合我们的配置。
您现在可以按 Ctrl + O 保存文件,然后按 Ctrl + X 退出编辑器。由于您在 Docker Compose 文件中添加了绑定挂载,在 nginx/conf.d/ 目录中所做的更改将自动反映在 Web 服务器容器中,该文件位于 步骤 3.
步骤 7:配置 MySQL
在配置好 Nginx 与 PHP 协同工作后,我们现在可以配置 MySQL 来存储并向 PHP 提供动态数据。我们已经设置了 Docker Compose 文件来安装 PHP 和 MySQL 通信所需的扩展。我们将在 mysql 文件夹中创建 MySQL 配置文件 my.cnf,它将被绑定挂载到 /etc/mysql/my.cnf,正如我们在 Docker Compose 的 db 服务部分中所定义的那样,该部分位于 步骤 3.
您可以随时对 my.cnf 文件进行 MySQL 配置设置和更改。它们应该会立即反映在容器内部。首先,输入以下命令创建目录:
|
1 |
mkdir ~/laravel-web/mysql |
接下来,输入以下命令创建并使用 nano 打开:
|
1 |
nano ~/laravel-web/mysql/my.cnf |
输入以下代码片段以启用查询日志并指定查询日志文件的位置:
|
1 2 3 |
[mysqld] general_log = 1 general_log_file = /var/lib/mysql/general.log |
通过将 general_log 属性定义为 1,您将允许通用日志。general_log_file 属性指定了日志文件的位置。按 Ctrl + O 保存文件,然后按 Ctrl + X 退出编辑器。
步骤 8:设置 Laravel 环境变量
至此,所有服务和配置设置均已完成。因此,我们应该能够部署我们的容器。然而,在我们的 Web 应用程序实际可用之前,还有一个重要的步骤必须完成——环境变量。Laravel 框架需要一个名为 .env 的文件,它用该文件来定义其环境。默认情况下,Laravel 附带了 .env.example,您可以将其复制到 .env,然后使用您的实际详细信息修改变量。输入以下命令复制文件:
|
1 |
cp .env.example .env |
复制完成后,使用 nano 打开文件进行修改:
|
1 |
nano .env |
以下是该文件可能外观的屏幕截图:

在文件中,下一步是根据我们目前所做的先前配置,修改 DB_CONNECTION 块下的变量。更新如下:
- DB_HOST 是 db 数据库容器。
- DB_DATABASE 是 laravel_web.
- DB_USERNAME 是数据库的用户名。选择一个您喜欢的名称,但为了本教程起见,我们使用 laraveldocker.
- DB_PASSWORD 是您上面的用户登录数据库将使用的强密码,因此请选择一个强密码。在 步骤 10 中,我们将使用您在此处选择的密码创建此用户。
更新这些值后,您的 DB_CONNECTION 现在应该如下所示:

保存并关闭文件。
步骤 9:运行 Docker 容器
在此阶段,您的所有服务和配置都已在 Docker Compose 文件中定义。只需一个命令即可启动所有容器、创建卷、连接网络以及设置和构建您的应用程序。在终端中输入以下命令:
|
1 |
docker-compose up -d |
当您首次运行 docker-compose up 命令时,它会下载所有必需的 Docker 镜像。如果您是在本地计算机上搭建基础设施,这可能需要一些时间。镜像下载完成后,Compose 会创建容器。-d 标志指示 Docker 在后台运行容器。如果过程成功完成,您应该会在终端中看到类似以下的内容:

在终端中输入以下命令以列出所有正在运行的容器:
|
1 |
docker ps |
它应该显示类似于下方屏幕截图的内容,其中包含有关 app、webserver 和 db 容器的详细信息:

- CONTAINER ID – 每个容器的唯一标识符。
- NAMES – 与每个容器关联的服务名称,如 Docker Compose 文件中所定义。(您可以使用容器 ID 或名称来访问容器)。
- IMAGE – 每个容器的镜像名称。
- STATUS – 它显示有关容器状态的信息(可以是已停止、正在运行或正在重启)。
- PORTS – 它显示容器暴露的端口。
Docker Compose 提供了一个名为 exec 的命令,您可以使用它在容器内运行终端命令或访问命令行。我们首先想在 app 容器(即运行 Laravel 应用程序的容器)内运行一些命令。
Docker 提供了一个用于访问容器命令行的命令。其语法如下:docker-compose exec container_name bash。要访问 app 容器的命令行,请输入以下命令:
|
1 |
docker-compose exec app bash |
进入容器的命令行后,您可以运行一些 Laravel Artisan 配置命令。输入以下命令以生成 laravel 密钥并将其保存到 .env 文件中:
|
1 |
php artisan key:generate |
设置好环境密钥后,您可以运行以下命令来缓存配置设置:
|
1 |
php artisan config:cache |
配置存储在容器内的 /var/www/html/bootstrap/cache/config.php 文件中。您可以按 Ctrl + D 退出容器终端。
要确认 Laravel 应用程序已部署并正在运行,请在浏览器中访问您服务器’的公网 IP (http://your_server_public_ip)。您应该会看到全新安装的 Laravel 的欢迎页面:

步骤 10:配置 MySQL 用户
在此步骤中,我们将为我们在 docker-compose 文件中指定的 MySQL 数据库 laravel_web 创建一个数据库用户。当您在Step 9中运行容器构建命令时,MySQL 已安装,但仅创建了一个默认的 root 管理账户,该账户恰好对数据库拥有无限权限。为了避免使用 root 用户,我们将创建一个专用用户 laraveldocker 供应用程序使用。这就是您在Step 8的环境变量中指定的用户。通过输入以下命令访问终端内的命令行:
|
1 |
docker-compose exec db bash |
进入容器后,输入以下命令登录 MySQL:
|
1 |
mysql -u root -p |
在密码提示中,输入您在Step 2.
中 docker-compose 文件的 db 服务中设置的密码。登录到 MySQL 提示符后,输入以下 SQL 命令检查是否可以看到您在 docker-compose 文件中指定的数据库:
|
1 |
show databases; |
您应该会看到 laravel_web 数据库,或者您为设置指定的任何其他名称:

接下来,我们为 laravel_web 数据库创建一个用户和密码。这必须与您在Step 8的 .env 文件中指定的详细信息相同。输入以下命令创建用户和密码,并授予该用户所有权限:
|
1 |
GRANT ALL ON laravel_web.* TO 'laraveldocker'@'%' IDENTIFIED BY 'your_strong_laravel_docker_password'; |
要使更改立即生效,请输入以下命令以刷新权限:
|
1 |
FLUSH PRIVILEGES; |
至此,MySQL 用户配置完成。输入 exit 并按回车键退出 MySQL 提示符。最后,按 Ctrl + D 退出 db 容器。
步骤 11:测试 Laravel 应用程序代码与 MySQL 数据库之间的通信
到这一步,一切运行良好。但是,我们想要确认 app 容器中的 Laravel 代码可以与 db 容器中的 MySQL 数据库进行通信。首先,通过输入以下命令访问 app 容器终端:
|
1 |
docker-compose exec app bash |
接下来是运行 Laravel 迁移 命令来创建表:
|
1 |
php artisan migrate |
当 Laravel 创建默认表时,您应该在终端中看到迁移过程:

接下来,我们将测试是否可以从 Laravel 访问数据库。Laravel 默认自带 Tinker,它允许您从命令行与整个应用程序进行交互,包括访问数据库、运行任务、eloquent ORM 等。我们可以使用 Tinker 来查看 migrations 表中的数据。输入以下命令以访问 Tinker:
|
1 |
php artisan tinker |
进入 Tinker 提示符后,您可以通过输入以下内容来列出由 migrate 命令创建的表:
|
1 |
\DB::select('show tables'); |
下面的屏幕截图显示了输出,即当前在 laravel_web 数据库中的表:

您可以通过指定表名来检索表中的数据。例如,您可以通过输入以下命令来检索 migrations 表中的数据:
|
1 |
\DB::table('migrations')->get(); |
该命令输出以下内容:

从上面的输出可以看出,您的 Laravel 应用程序配置良好,可以与数据库进行通信。您可以尝试更多命令,例如创建模型、运行任务等。您可以按 Ctrl + D 退出 Tinker 提示符。
结论
在本教程中,您在 Docker 容器中部署了一个 LEMP 栈的 Laravel 应用程序。您通过访问 Web 界面以及通过 Laravel Tinker 连接到数据库测试了该应用程序。您体验到了 Docker Compose 的强大功能。它允许您在一个文件中定义一组 Docker 容器,然后只需一个命令即可运行它们。
如果您想进一步熟悉容器,请查看我们的 教程,该教程向您展示了如何清理 Docker 资源——镜像、容器和数据卷 以及我们的 Kubernetes 工具的详细概述.
您还可以访问我们的博客,了解更多关于 Docker 以及持续集成和持续部署.
祝您编程愉快!
评论
暂无评论。发表第一条评论吧。