介绍
到containerize一个应用程序指的是适配的应用及其组件,以便能够在被称为轻量的环境中运行它的过程容器。此类环境是隔离的和一次性的,可用于开发、测试和将应用程序部署到生产中。
在本指南中,我们将使用Docker Compose将Laravel应用程序容器化以进行开发。完成后,您将拥有一个运行在三个独立服务容器上的演示 Laravel 应用程序:
- 一个
app
运行 PHP7.4-FPM的服务; db
运行 MySQL 5.7的服务;- 一个
nginx
使用该服务app
的服务服务于Laravel应用到最终用户之前解析PHP代码。
为了简化开发过程并促进应用程序调试,我们将使用共享卷保持应用程序文件同步。我们还将看到如何使用docker-compose exec
命令在容器上运行Composer和Artisanapp
。
先决条件
- 以具有 sudo 权限的非 root 用户身份访问 Ubuntu 20.04 本地计算机或开发服务器。如果您使用远程服务器,建议安装活动防火墙。要设置这些,请参阅我们的 Ubuntu 20.04 初始服务器设置指南。
- 按照如何在 Ubuntu 20.04 上安装和使用 Docker 的步骤 1 和 2 将 Docker 安装在您的服务器上。
- 按照如何在 Ubuntu 20.04 上安装和使用 Docker Compose 的步骤 1 在您的服务器上安装 Docker Compose。
步骤 1 — 获取演示应用程序
首先,我们将从其Github 存储库中获取演示 Laravel 应用程序。我们对tutorial-01
分支感兴趣,它包含我们在本系列的第一篇指南中创建的基本 Laravel 应用程序。
要获取与本教程兼容的应用程序代码,请使用以下命令将发行版下载tutorial-1.0.1
到您的主目录:
- cd ~
- curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-1.0.1.zip -o travellist.zip
我们将需要该unzip
命令来解压应用程序代码。如果你以前没有安装过这个包,现在安装:
- sudo apt update
- sudo apt install unzip
现在,解压缩应用程序的内容并重命名解压后的目录以便于访问:
- unzip travellist.zip
- mv travellist-laravel-demo-tutorial-1.0.1 travellist-demo
导航到travellist-demo
目录:
- cd travellist-demo
在下一步中,我们将创建一个.env
配置文件来设置应用程序。
第 2 步 – 设置应用程序的.env
文件
Laravel 配置文件位于config
应用程序根目录中名为的目录中。此外,.env
文件用于设置依赖于环境的配置,例如凭据和可能因部署而异的任何信息。此文件不包含在版本控制中。
警告:环境配置文件包含有关您的服务器的敏感信息,包括数据库凭据和安全密钥。因此,您永远不应公开共享此文件。
.env
文件中包含的值将优先于位于config
目录中的常规配置文件中设置的值。在新环境中的每个安装都需要一个定制的环境文件来定义诸如数据库连接设置、调试选项、应用程序 URL 等项目,这些项目可能因应用程序运行的环境而异。
我们现在将创建一个新.env
文件来自定义我们正在设置的开发环境的配置选项。Laravel 附带了一个示例.env
文件,我们可以复制它来创建我们自己的:
- cp .env.example .env
使用nano
或您选择的文本编辑器打开此文件:
- nano .env
演示应用程序中的当前.env
文件travellist
包含使用本地 MySQL 数据库的设置,127.0.0.1
作为数据库主机。我们需要更新DB_HOST
变量,使其指向我们将在 Docker 环境中创建的数据库服务。在本指南中,我们将调用我们的数据库服务db
。继续并用DB_HOST
数据库服务名称替换列出的值:
APP_NAME=Travellist
APP_ENV=dev
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost:8000
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=travellist
DB_USERNAME=travellist_user
DB_PASSWORD=password
...
如果您愿意,也可以随意更改数据库名称、用户名和密码。这些变量将在稍后的步骤中使用,我们将设置docker-compose.yml
文件来配置我们的服务。
完成编辑后保存文件。如果您使用了nano
,则可以通过按Ctrl+x
、Y
和Enter
来确认。
第 3 步 – 设置应用程序的 Dockerfile
尽管我们的 MySQL 和 Nginx 服务都将基于从Docker Hub获取的默认镜像,但我们仍然需要为应用程序容器构建自定义镜像。我们将为此创建一个新的 Dockerfile。
我们的travellist图像将基于来自 Docker Hub的php:7.4-fpm
官方 PHP 图像。在基本的 PHP-FPM 环境之上,我们将安装一些额外的 PHP 模块和Composer依赖项管理工具。
我们还将创建一个新的系统用户;这是在开发应用程序时执行artisan
和composer
命令所必需的。该uid
设置可确保容器内的用户与运行 Docker 的主机上的系统用户具有相同的 uid。这样,由这些命令创建的任何文件都会以正确的权限复制到主机中。这也意味着您将能够在主机中使用您选择的代码编辑器来开发在容器内运行的应用程序。
使用以下命令创建一个新的 Dockerfile:
- nano Dockerfile
将以下内容复制到您的 Dockerfile:
FROM php:7.4-fpm
# Arguments defined in docker-compose.yml
ARG user
ARG uid
# Install system dependencies
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
chown -R $user:$user /home/$user
# Set working directory
WORKDIR /var/www
USER $user
完成后不要忘记保存文件。
我们Dockerfile首先定义我们使用的是基本映像: php:7.4-fpm
。
安装系统包和 PHP 扩展后,我们通过将composer
可执行文件从其最新的官方映像复制到我们自己的应用程序映像来安装 Composer 。
然后使用在 Dockerfile 开头声明的user
和uid
参数创建和设置一个新的系统用户。这些值将在构建时由 Docker Compose 注入。
最后,我们将默认工作目录设置为/var/www
并更改为新创建的用户。这将确保您以普通用户身份连接,并且在应用程序容器上运行composer
和artisan
命令时,您位于正确的目录中。
步骤 4 — 设置 Nginx 配置和数据库转储文件
使用 Docker Compose 创建开发环境时,通常需要与服务容器共享配置或初始化文件,以便设置或引导这些服务。这种做法有助于在开发应用程序时更改配置文件以微调您的环境。
我们现在将设置一个文件夹,其中包含将用于配置和初始化我们的服务容器的文件。
为了设置 Nginx,我们将共享一个travellist.conf
文件,该文件将配置应用程序的服务方式。使用以下命令创建docker-compose/nginx
文件夹:
- mkdir -p docker-compose/nginx
打开travellist.conf
在该目录中命名的新文件:
- nano docker-compose/nginx/travellist.conf
将以下 Nginx 配置复制到该文件:
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/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 以侦听端口80
并index.php
用作默认索引页面。它将文档根设置为/var/www/public
,然后配置 Nginx 使用app
端口9000
上的服务来处理*.php
文件。
完成编辑后保存并关闭文件。
为了设置 MySQL 数据库,我们将共享一个将在容器初始化时导入的数据库转储。这是我们将在该容器上使用的MySQL 5.7 映像提供的功能。
在文件夹内为您的 MySQL 初始化文件创建一个新文件docker-compose
夹:
- mkdir docker-compose/mysql
打开一个新.sql
文件:
- nano docker-compose/mysql/init_db.sql
以下 MySQL 转储基于我们在Laravel on LEMP 指南中设置的数据库。它将创建一个名为 的新表places
。然后,它将用一组示例位置填充表。
将以下代码添加到文件中:
DROP TABLE IF EXISTS `places`;
CREATE TABLE `places` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`visited` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `places` (name, visited) VALUES ('Berlin',0),('Budapest',0),('Cincinnati',1),('Denver',0),('Helsinki',0),('Lisbon',0),('Moscow',1),('Nairobi',0),('Oslo',1),('Rio',0),('Tokyo',0);
该places
表包含三个字段:id
,name
,和visited
。该visited
字段是一个标志,用于标识尚未到达的地方。随意更改示例位置或包含新位置。完成后保存并关闭文件。
我们已经完成了应用程序的 Dockerfile 和服务配置文件的设置。接下来,我们将设置 Docker Compose 以在创建服务时使用这些文件。
步骤 5 — 使用 Docker Compose 创建多容器环境
Docker Compose 使您能够为在 Docker 上运行的应用程序创建多容器环境。它使用服务定义来构建具有多个容器的完全可定制的环境,这些容器可以共享网络和数据量。这允许应用程序组件之间的无缝集成。
为了设置我们的服务定义,我们将创建一个名为docker-compose.yml
. 通常,此文件位于应用程序文件夹的根目录下,它定义您的容器化环境,包括您将用于构建容器的基础镜像,以及您的服务将如何交互。
我们将在我们的定义三种不同的服务docker-compose.yml
文件:app
,db
,和nginx
。
该app
服务将travellist
基于我们之前创建的 Dockerfile构建一个名为 的映像。此服务定义的容器将运行php-fpm
服务器来解析 PHP 代码并将结果发送回nginx
服务,该服务将在单独的容器上运行。该mysql
服务定义了一个运行 MySQL 5.7 服务器的容器。我们的服务将共享一个名为的桥接网络travellist
。
应用程序文件将通过绑定安装在app
和nginx
服务上同步。绑定挂载在开发环境中很有用,因为它们允许主机和容器之间的高性能双向同步。
docker-compose.yml
在应用程序文件夹的根目录创建一个新文件:
- nano docker-compose.yml
典型的docker-compose.yml
文件以版本定义开头,然后是services
节点,在该节点下定义了所有服务。共享网络通常定义在该文件的底部。
首先,将此样板代码复制到您的docker-compose.yml
文件中:
version: "3.7"
services:
networks:
travellist:
driver: bridge
我们现在将编辑services
节点以包含app
,db
和nginx
服务。
该app
服务
该app
服务将设置一个名为 的容器travellist-app
。它基于与docker-compose.yml
文件位于同一路径的 Dockerfile 构建一个新的 Docker 镜像。新图像将以 名称保存在本地travellist
。
即使用作应用程序的文档根目录位于nginx
容器中,我们也需要app
容器内某处的应用程序文件,因此我们能够使用 Laravel Artisan 工具执行命令行任务。
将以下服务定义复制到您的services
节点下的docker-compose.yml
文件中:
app:
build:
args:
user: sammy
uid: 1000
context: ./
dockerfile: Dockerfile
image: travellist
container_name: travellist-app
restart: unless-stopped
working_dir: /var/www/
volumes:
- ./:/var/www
networks:
- travellist
这些设置执行以下操作:
build
:这个配置告诉 Docker Compose 为服务构建一个本地镜像app
,使用指定的路径(上下文)和 Dockerfile 作为指令。参数user
和uid
被注入到 Dockerfile 中以在构建时自定义用户创建命令。image
:将用于正在构建的映像的名称。container_name
:设置此服务的容器名称。restart
: 总是重启,除非服务停止。working_dir
: 将此服务的默认目录设置为/var/www
.volumes
:创建一个共享卷,将当前目录中的内容同步到/var/www
容器内部。请注意,这不是您的文档根目录,因为它将存在于nginx
容器中。networks
:设置此服务以使用名为travellist
.
该db
服务
该db
服务使用来自 Docker Hub的预构建MySQL 5.7 映像。因为 Docker Compose 会自动加载与.env
文件位于同一目录中的变量文件docker-compose.yml
,所以我们可以从.env
我们在上一步创建的 Laravel文件中获取我们的数据库设置。
在您的services
节点中包含以下服务定义,紧跟在app
服务之后:
db:
image: mysql:5.7
container_name: travellist-db
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
SERVICE_TAGS: dev
SERVICE_NAME: mysql
volumes:
- ./docker-compose/mysql:/docker-entrypoint-initdb.d
networks:
- travellist
这些设置执行以下操作:
image
:定义应用于此容器的 Docker 映像。在本例中,我们使用来自 Docker Hub 的 MySQL 5.7 映像。container_name
:设置此服务的容器名称:travellist-db
。restart
: 始终重新启动此服务,除非它被明确停止。environment
: 在新容器中定义环境变量。我们使用从 Laravel.env
文件中获得的值来设置我们的 MySQL 服务,它将根据提供的环境变量自动创建一个新的数据库和用户。volumes
:创建一个卷以共享.sql
将用于初始化应用程序数据库的数据库转储。MySQL 镜像会自动导入.sql
放置在/docker-entrypoint-initdb.d
容器内目录中的文件。networks
:设置此服务以使用名为travellist
.
该nginx
服务
该nginx
服务在轻量级 Linux 发行版Alpine之上使用预构建的Nginx 映像。它创建一个名为 的容器,并使用该定义创建从主机系统上的端口到容器内端口的重定向。travellist-nginx
ports
8000
80
在您的services
节点中包含以下服务定义,紧跟在db
服务之后:
nginx:
image: nginx:1.17-alpine
container_name: travellist-nginx
restart: unless-stopped
ports:
- 8000:80
volumes:
- ./:/var/www
- ./docker-compose/nginx:/etc/nginx/conf.d
networks:
- travellist
这些设置执行以下操作:
image
:定义应用于此容器的 Docker 映像。在本例中,我们使用的是 Alpine Nginx 1.17 镜像。container_name
:设置此服务的容器名称:travellist-nginx。restart
: 始终重新启动此服务,除非它被明确停止。ports
: 设置一个端口重定向,允许外部通过端口访问在容器内8000
端口上运行的 Web 服务器80
。volumes
:创建两个共享卷。第一个会将当前目录中的内容同步到/var/www
容器内部。这样,当您对应用程序文件进行本地更改时,它们将很快反映在容器内由 Nginx 提供服务的应用程序中。第二个卷将确保我们位于 的 Nginx 配置文件docker-compose/nginx/travellist.conf
被复制到容器的 Nginx 配置文件夹中。networks
:设置此服务以使用名为travellist
.
完成docker-compose.yml
文件
这是我们完成的docker-compose.yml
文件的样子:
version: "3.7"
services:
app:
build:
args:
user: sammy
uid: 1000
context: ./
dockerfile: Dockerfile
image: travellist
container_name: travellist-app
restart: unless-stopped
working_dir: /var/www/
volumes:
- ./:/var/www
networks:
- travellist
db:
image: mysql:5.7
container_name: travellist-db
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
SERVICE_TAGS: dev
SERVICE_NAME: mysql
volumes:
- ./docker-compose/mysql:/docker-entrypoint-initdb.d
networks:
- travellist
nginx:
image: nginx:alpine
container_name: travellist-nginx
restart: unless-stopped
ports:
- 8000:80
volumes:
- ./:/var/www
- ./docker-compose/nginx:/etc/nginx/conf.d/
networks:
- travellist
networks:
travellist:
driver: bridge
确保在完成后保存文件。
第 6 步 – 使用 Docker Compose 运行应用程序
我们现在将使用docker-compose
命令来构建应用程序映像并运行我们在设置中指定的服务。
app
使用以下命令构建映像:
- docker-compose build app
此命令可能需要几分钟才能完成。你会看到类似这样的输出:
OutputBuilding app
Step 1/11 : FROM php:7.4-fpm
---> fa37bd6db22a
Step 2/11 : ARG user
---> Running in f71eb33b7459
Removing intermediate container f71eb33b7459
---> 533c30216f34
Step 3/11 : ARG uid
---> Running in 60d2d2a84cda
Removing intermediate container 60d2d2a84cda
---> 497fbf904605
Step 4/11 : RUN apt-get update && apt-get install -y git curl libpng-dev libonig-dev ...
Step 7/11 : COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
---> e499f74896e3
Step 8/11 : RUN useradd -G www-data,root -u $uid -d /home/$user $user
---> Running in 232ef9c7dbd1
Removing intermediate container 232ef9c7dbd1
---> 870fa3220ffa
Step 9/11 : RUN mkdir -p /home/$user/.composer && chown -R $user:$user /home/$user
---> Running in 7ca8c0cb7f09
Removing intermediate container 7ca8c0cb7f09
---> 3d2ef9519a8e
Step 10/11 : WORKDIR /var/www
---> Running in 4a964f91edfa
Removing intermediate container 4a964f91edfa
---> 00ada639da21
Step 11/11 : USER $user
---> Running in 9f8e874fede9
Removing intermediate container 9f8e874fede9
---> fe176ff4702b
Successfully built fe176ff4702b
Successfully tagged travellist:latest
构建完成后,您可以在后台模式下运行环境:
- docker-compose up -d
OutputCreating travellist-db ... done
Creating travellist-app ... done
Creating travellist-nginx ... done
这将在后台运行您的容器。要显示有关活动服务状态的信息,请运行:
- docker-compose ps
你会看到这样的输出:
Output Name Command State Ports
--------------------------------------------------------------------------------
travellist-app docker-php-entrypoint php-fpm Up 9000/tcp
travellist-db docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
travellist-nginx /docker-entrypoint.sh ngin ... Up 0.0.0.0:8000->80/tcp
您的环境现已启动并运行,但我们仍需要执行几个命令来完成应用程序的设置。您可以使用该docker-compose exec
命令在服务容器中执行命令,例如ls -l
显示应用程序目录中文件的详细信息:
- docker-compose exec app ls -l
Outputtotal 260
-rw-rw-r-- 1 sammy sammy 737 Jun 9 11:19 Dockerfile
-rw-rw-r-- 1 sammy sammy 101 Jan 7 08:05 README.md
drwxrwxr-x 6 sammy sammy 4096 Jan 7 08:05 app
-rwxr-xr-x 1 sammy sammy 1686 Jan 7 08:05 artisan
drwxrwxr-x 3 sammy sammy 4096 Jan 7 08:05 bootstrap
-rw-rw-r-- 1 sammy sammy 1501 Jan 7 08:05 composer.json
-rw-rw-r-- 1 sammy sammy 179071 Jan 7 08:05 composer.lock
drwxrwxr-x 2 sammy sammy 4096 Jan 7 08:05 config
drwxrwxr-x 5 sammy sammy 4096 Jan 7 08:05 database
drwxrwxr-x 4 sammy sammy 4096 Jun 9 11:19 docker-compose
-rw-rw-r-- 1 sammy sammy 965 Jun 9 11:27 docker-compose.yml
-rw-rw-r-- 1 sammy sammy 1013 Jan 7 08:05 package.json
-rw-rw-r-- 1 sammy sammy 1405 Jan 7 08:05 phpunit.xml
drwxrwxr-x 2 sammy sammy 4096 Jan 7 08:05 public
-rw-rw-r-- 1 sammy sammy 273 Jan 7 08:05 readme.md
drwxrwxr-x 6 sammy sammy 4096 Jan 7 08:05 resources
drwxrwxr-x 2 sammy sammy 4096 Jan 7 08:05 routes
-rw-rw-r-- 1 sammy sammy 563 Jan 7 08:05 server.php
drwxrwxr-x 5 sammy sammy 4096 Jan 7 08:05 storage
drwxrwxr-x 4 sammy sammy 4096 Jan 7 08:05 tests
drwxrwxr-x 41 sammy sammy 4096 Jun 9 11:32 vendor
-rw-rw-r-- 1 sammy sammy 538 Jan 7 08:05 webpack.mix.js
我们现在将运行composer install
以安装应用程序依赖项:
- docker-compose exec app composer install
你会看到这样的输出:
OutputLoading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Package operations: 85 installs, 0 updates, 0 removals
- Installing doctrine/inflector (1.3.1): Downloading (100%)
- Installing doctrine/lexer (1.2.0): Downloading (100%)
- Installing dragonmantank/cron-expression (v2.3.0): Downloading (100%)
- Installing erusev/parsedown (1.7.4): Downloading (100%)
- Installing symfony/polyfill-ctype (v1.13.1): Downloading (100%)
- Installing phpoption/phpoption (1.7.2): Downloading (100%)
- Installing vlucas/phpdotenv (v3.6.0): Downloading (100%)
- Installing symfony/css-selector (v5.0.2): Downloading (100%)
…
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
在测试应用程序之前,我们需要做的最后一件事是使用artisan
Laravel 命令行工具生成唯一的应用程序密钥。此密钥用于加密用户会话和其他敏感数据:
- docker-compose exec app php artisan key:generate
OutputApplication key set successfully.
现在转到您的浏览器并在端口 8000 上访问您服务器的域名或 IP 地址:
http://server_domain_or_IP:8000
注意:如果您在本地机器上运行此演示,请使用http://localhost:8000
从浏览器访问该应用程序。
你会看到一个这样的页面:
您可以使用该logs
命令来检查您的服务生成的日志:
- docker-compose logs nginx
Attaching to travellist-nginx
…
travellist-nginx | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
travellist-nginx | /docker-entrypoint.sh: Configuration complete; ready for start up
travellist-nginx | 192.168.0.1 - - [09/Jun/2020:11:46:34 +0000] "GET / HTTP/1.1" 200 627 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
travellist-nginx | 192.168.0.1 - - [09/Jun/2020:11:46:35 +0000] "GET / HTTP/1.1" 200 627 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
如果要暂停 Docker Compose 环境同时保持其所有服务的状态,请运行:
- docker-compose pause
OutputPausing travellist-db ... done
Pausing travellist-nginx ... done
Pausing travellist-app ... done
然后,您可以通过以下方式恢复服务:
- docker-compose unpause
OutputUnpausing travellist-app ... done
Unpausing travellist-nginx ... done
Unpausing travellist-db ... done
要关闭 Docker Compose 环境并删除其所有容器、网络和卷,请运行:
- docker-compose down
OutputStopping travellist-nginx ... done
Stopping travellist-db ... done
Stopping travellist-app ... done
Removing travellist-nginx ... done
Removing travellist-db ... done
Removing travellist-app ... done
Removing network travellist-laravel-demo_travellist
有关所有 Docker Compose 命令的概述,请查看Docker Compose 命令行参考。
结论
在本指南中,我们使用 Docker Compose 设置了一个包含三个容器的 Docker 环境,以在 YAML 文件中定义我们的基础设施。
从现在开始,您可以在 Laravel 应用程序上工作,而无需安装和设置本地 Web 服务器来进行开发和测试。此外,您将使用可轻松复制和分发的一次性环境,这在开发应用程序以及转向生产环境时会很有帮助。