介绍
一个应用程序是指适应应用程序及其组件的过程,以便在称为容器的轻量级环境中运行(https://www.docker.com/resources/what-container)。
在本指南中,我们将使用 Docker Compose来容器化开发的 Laravel应用程序。
- 运行 PHP7.4-FPM 的
应用程序
服务; - 运行 MySQL 5.7 的
db
服务; - 使用
应用程序
的nginx
服务在向最终用户提供 Laravel 应用程序之前分析 PHP 代码。
为了简化开发过程并方便应用程序调试,我们将使用共享卷来保持应用程序文件同步,我们还将看到如何使用docker-compose exec
命令在app
容器上运行 Composer和 Artisan。
前提条件
- 访问 Ubuntu 22.04 本地机器或开发服务器作为具有 sudo 特权的非根用户。如果您正在使用远程服务器,建议安装一个活跃的防火墙。 要设置这些,请参阅我们的 Ubuntu 22.04 初始服务器设置指南。
- Docker 安装在您的服务器上,遵循 Ubuntu 22.04 上如何安装和使用 Docker 的步骤 1 和 2。
- Docker Compose 安装在您的服务器上,遵循 Ubuntu 22.04 上如何安装和使用 Docker Compose 的步骤 1.
步骤 1 – 获取 demo 应用程序
要开始,我们将从其 Github 存储库中获取Laravel演示应用程序。我们对‘tutorial-01’分支感兴趣,该分支包含我们在 本系列的第一个指南中创建的基本Laravel应用程序。
要获得与本教程兼容的应用程序代码,请下载版本 tutorial-1.0.1
到您的主目录:
1cd ~
2curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-1.0.1.zip -o travellist.zip
我们将需要unzip
命令来解包应用程序代码. 如果您尚未安装此套件,请现在这样做:
1sudo apt update
2sudo apt install unzip
现在,卸载应用程序的内容,并更名未包装的目录,以便更容易访问:
1unzip travellist.zip
2mv travellist-laravel-demo-tutorial-1.0.1 travellist-demo
导航到‘travellist-demo’目录:
1cd travellist-demo
在下一步,我们将创建一个 .env
配置文件来设置应用程序。
步骤 2 — 设置应用程序的 .env
文件
Laravel 配置文件位于应用程序根目录中的一个名为config
的目录中,此外,用于设置 环境依赖配置的.env 文件,例如凭证和任何可能在部署之间有所不同的信息。
<$>[warning] ** Warning** :环境配置文件包含有关您的服务器的敏感信息,包括数据库凭证和安全密钥。
.env 文件中的值将优先于位于 config
目录中的常规配置文件中设置的值。在新环境中的每个安装都需要一个定制的环境文件来定义数据库连接设置、调试选项、应用程序 URL 等内容,这些内容可能因应用程序所运行的环境而有所不同。
我们现在将创建一个新的 .env
文件来定制我们正在设置的开发环境的配置选项. Laravel 附带了一个例子.env
文件,我们可以复制以创建自己的:
1cp .env.example .env
使用nano
或您所选择的文本编辑器打开此文件:
1nano .env
来自travellist
演示应用程序的当前.env
文件包含使用本地MySQL数据库的设置,数据库主机为127.0.0.1
。我们需要更新DB_HOST
变量,以便它指向我们将在我们的Docker环境中创建的数据库服务。
1[label .env]
2APP_NAME=Travellist
3APP_ENV=dev
4APP_KEY=
5APP_DEBUG=true
6APP_URL=http://localhost:8000
7
8LOG_CHANNEL=stack
9
10DB_CONNECTION=mysql
11DB_HOST=db
12DB_PORT=3306
13DB_DATABASE=travellist
14DB_USERNAME=travellist_user
15DB_PASSWORD=password
16...
您可以随时更改数据库名称、用户名和密码,如果您愿意,这些变量将在稍后的一步中得到利用,我们将设置 docker-compose.yml
文件来配置我们的服务。
如果您使用了nano
,您可以通过按Ctrl+x
,然后按Y
和Enter
来确认。
步骤 3 – 设置应用程序的Dockerfile
虽然我们的 MySQL 和 Nginx 服务都将基于从 Docker Hub获取的默认图像,但我们仍然需要为应用程序容器构建一个自定义图像。
我们的 travellist 图像将基于Docker Hub的php:7.4-fpm(官方PHP图像)(https://hub.docker.com/_/php)。
我们还将创建一个新的系统用户;这需要在开发应用程序时执行工艺人
和作曲家
命令。uid
设置确保容器内的用户与您在运行 Docker 的主机上的系统用户具有相同的 uid。
创建一个新的 Dockerfile 与:
1nano Dockerfile
将以下内容复制到您的 Dockerfile:
1[label Dockerfile]
2FROM php:7.4-fpm
3
4# Arguments defined in docker-compose.yml
5ARG user
6ARG uid
7
8# Install system dependencies
9RUN apt-get update && apt-get install -y \
10 git \
11 curl \
12 libpng-dev \
13 libonig-dev \
14 libxml2-dev \
15 zip \
16 unzip
17
18# Clear cache
19RUN apt-get clean && rm -rf /var/lib/apt/lists/*
20
21# Install PHP extensions
22RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
23
24# Get latest Composer
25COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
26
27# Create system user to run Composer and Artisan Commands
28RUN useradd -G www-data,root -u $uid -d /home/$user $user
29RUN mkdir -p /home/$user/.composer && \
30 chown -R $user:$user /home/$user
31
32# Set working directory
33WORKDIR /var/www
34
35USER $user
不要忘记在完成后保存文件。
我们的Dockerfile从定义我们正在使用的基本图像开始: php:7.4-fpm
。
安装系统包和PHP扩展后,我们将Composer从最新的官方图像
(https://hub.docker.com/_/composer)复制到我们自己的应用程序图像。
然后使用在 Dockerfile 开始时声明的用户
和uid
参数创建和设置一个新的系统用户,这些值将在构建时被 Docker Compose 注入。
最后,我们将默认工作 dir 设置为 /var/www
,并更改为新创建的用户。这将确保您作为常规用户连接,并且在正确的目录中运行composer
和artisan
命令时在应用程序容器上。
步骤 4 — 设置 Nginx 配置和数据库漏洞文件
在使用 Docker Compose 创建开发环境时,通常需要与服务容器共享配置或初始化文件,以便设置或启动这些服务。
我们现在将设置一个包含文件的文件夹,用于配置和初始化我们的服务容器。
要设置 Nginx,我们将共享一个travellist.conf
文件,该文件将配置应用程序的服务方式。
1mkdir -p docker-compose/nginx
在该目录中打开名为 `travellist.conf’的新文件:
1nano docker-compose/nginx/travellist.conf
将以下 Nginx 配置复制到该文件:
1[label docker-compose/nginx/travellist.conf]
2
3server {
4 listen 80;
5 index index.php index.html;
6 error_log /var/log/nginx/error.log;
7 access_log /var/log/nginx/access.log;
8 root /var/www/public;
9 location ~ \.php$ {
10 try_files $uri =404;
11 fastcgi_split_path_info ^(.+\.php)(/.+)$;
12 fastcgi_pass app:9000;
13 fastcgi_index index.php;
14 include fastcgi_params;
15 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
16 fastcgi_param PATH_INFO $fastcgi_path_info;
17 }
18 location / {
19 try_files $uri $uri/ /index.php?$query_string;
20 gzip_static on;
21 }
22}
此文件会将 Nginx 配置为在端口80
上聆听并使用index.php
作为默认索引页面,将文档根设置为/var/www/public
,然后将 Nginx 配置为在端口9000
上使用app
服务来处理*.php
文件。
保存并关闭文件,当你完成编辑。
要设置 MySQL 数据库,我们将共享一个数据库卸载,该数据库将在容器初始化时被导入,这是由 MySQL 5.7 图像提供的功能,我们将在该容器上使用。
在docker-compose
文件夹中创建您的MySQL初始化文件的新文件夹:
1mkdir docker-compose/mysql
打开一个新的.sql 文件:
1nano docker-compose/mysql/init_db.sql
下面的 MySQL 漏洞是基于我们在我们的 Laravel on LEMP 指南中设置的数据库。它将创建一个名为位置
的新表。
将以下代码添加到文件中:
1[label docker-compose/mysql/db_init.sql]
2DROP TABLE IF EXISTS `places`;
3
4CREATE TABLE `places` (
5 `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
6 `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
7 `visited` tinyint(1) NOT NULL DEFAULT '0',
8 PRIMARY KEY (`id`)
9) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
10
11INSERT 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);
地点
表包含三个字段:id
,名称
和访问
字段。访问
字段是用于识别仍在去
的地点的旗帜。
我们已经完成了应用程序的Dockerfile和服务配置文件的设置,接下来,我们将设置Docker Compose来使用这些文件来创建我们的服务。
步骤 5 — 使用 Docker Compose 创建多容器环境
Docker Compose 允许您为在 Docker 上运行的应用程序创建多容器环境。它使用 service definitions 来构建具有多个容器的完全可自定义环境,可以共享网络和数据量。
为了设置我们的服务定义,我们将创建一个名为docker-compose.yml
的新文件,该文件通常位于应用程序文件夹的根部,它定义了您的集装箱环境,包括您将使用的基图像来构建您的集装箱,以及您的服务将如何相互作用。
我们将在我们的docker-compose.yml
文件中定义三个不同的服务:app
,db
和nginx
。
app
服务将建立一个名为travellist
的图像,基于我们之前创建的Dockerfile。该服务定义的容器将运行一个php-fpm
服务器来分析PHP代码,并将结果发送回nginx
服务,该服务将在一个单独的容器上运行。
应用程序文件将在应用程序
和nginx
服务上通过 bind mount 进行同步。
在应用程序文件夹的根部创建一个新的 docker-compose.yml
文件:
1nano docker-compose.yml
一个典型的 'dxd.yml' 文件始于版本定义,然后是'services' 节点,其中定义了所有服务. 共享网络通常在该文件底部定义。
要开始,请将此 boilerplate 代码复制到您的 docker-compose.yml
文件中:
1[label docker-compose.yml]
2version: "3.7"
3services:
4
5networks:
6 travellist:
7 driver: bridge
我们现在将编辑服务
节点,包括应用
、db
和nginx
服务。
app
服务
app
服务将设置一个名为travellist-app
的容器,它将基于位于docker-compose.yml
文件的同一路径的 Dockerfile构建一个新的 Docker 图像。
即使作为应用程序服务的文档根位于nginx
容器中,我们也需要应用程序文件在app
容器内某个地方,因此我们可以使用Laravel Artisan工具执行命令行任务。
在您的服务
节点下,在docker-compose.yml
文件中复制下面的服务定义:
1[label docker-compose.yml]
2 app:
3 build:
4 args:
5 user: sammy
6 uid: 1000
7 context: ./
8 dockerfile: Dockerfile
9 image: travellist
10 container_name: travellist-app
11 restart: unless-stopped
12 working_dir: /var/www/
13 volumes:
14 - ./:/var/www
15 networks:
16 - travellist
这些设置如下:
build
:此配置告知 Docker Compose为app
服务构建本地图像,使用指定的路径(背景)和 Dockerfile为说明。user
和uid
参数被注入到 Dockerfile,以便在构建时定制用户创建命令。image
:将用于构建图像的默认目录名称。container_name
:为此服务设置容器名称。restart
: 始终重新启动,除非服务停止。working_dir
: 将此服务的默认目录设置为/var/www
.volumes
: 创建将当前目录
DB
服务
由于 Docker Compose 会自动加载位于同一个目录中的 .env
变量文件作为 docker-compose.yml
文件,我们可以从我们在上一步创建的 Laravel .env
文件中获取我们的数据库设置。
在您的服务
节点中,在应用
服务之后,包括以下服务定义:
1[label docker-compose.yml]
2 db:
3 image: mysql:8.0
4 container_name: travellist-db
5 restart: unless-stopped
6 environment:
7 MYSQL_DATABASE: ${DB_DATABASE}
8 MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
9 MYSQL_PASSWORD: ${DB_PASSWORD}
10 MYSQL_USER: ${DB_USERNAME}
11 SERVICE_TAGS: dev
12 SERVICE_NAME: mysql
13 volumes:
14 - ./docker-compose/mysql:/docker-entrypoint-initdb.d
15 networks:
16 - travellist
这些设置如下:
在这种情况下,我们正在使用来自 Docker Hub 的 MySQL 5.7 图像。
container_name
: 设置此服务的容器名称:travellist-db
.restart
: 始终重启此服务,除非它被明确停止。environment
: 定义新容器中的环境变量。 我们正在使用从 Laravel.env 文件中获取的值来设置我们的 MySQL 服务,该服务将自动创建一个新的数据库和用户基于所提供的环境变量。
volumes: 创建一个卷,以共享一个
.sql 数据库垃圾,用于启动应用程序数据库。 MySQL 图像将自动导入 `
nginx
服务
该nginx
服务使用一个预先构建的 Nginx 图像在 Alpine上,一个轻量级的 Linux 发行版。它创建了一个名为travellist-nginx
的容器,并使用端口
定义创建一个重定向,从主机系统上的端口8000
到容器内部的端口80
。
在您的服务
节点中,在db
服务之后,包括以下服务定义:
1[label docker-compose.yml]
2 nginx:
3 image: nginx:1.17-alpine
4 container_name: travellist-nginx
5 restart: unless-stopped
6 ports:
7 - 8000:80
8 volumes:
9 - ./:/var/www
10 - ./docker-compose/nginx:/etc/nginx/conf.d
11 networks:
12 - travellist
这些设置如下:
在这种情况下,我们正在使用 Alpine Nginx 1.17 图像。
container_name
: 设置此服务的容器名称: travellist-nginx .restart
: 始终重新启动此服务,除非它被明确停止。port
: 设置一个端口重定向,允许通过端口8000
访问运行在容器内的端口 `80 上的 Web 服务器。volumes
: 创建 两个 共享卷。 第一个将当前目录的内容同步到/var/www
内容器内。 这样,当您对应用程序文件进行本地更改时,它们将迅速反映在应用程序中包含的
已完成 docker-compose.yml
文件
这就是我们完成的 docker-compose.yml
文件的样子:
1[label docker-compose.yml]
2version: "3.7"
3services:
4 app:
5 build:
6 args:
7 user: sammy
8 uid: 1000
9 context: ./
10 dockerfile: Dockerfile
11 image: travellist
12 container_name: travellist-app
13 restart: unless-stopped
14 working_dir: /var/www/
15 volumes:
16 - ./:/var/www
17 networks:
18 - travellist
19
20 db:
21 image: mysql:8.0
22 container_name: travellist-db
23 restart: unless-stopped
24 environment:
25 MYSQL_DATABASE: ${DB_DATABASE}
26 MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
27 MYSQL_PASSWORD: ${DB_PASSWORD}
28 MYSQL_USER: ${DB_USERNAME}
29 SERVICE_TAGS: dev
30 SERVICE_NAME: mysql
31 volumes:
32 - ./docker-compose/mysql:/docker-entrypoint-initdb.d
33 networks:
34 - travellist
35
36 nginx:
37 image: nginx:alpine
38 container_name: travellist-nginx
39 restart: unless-stopped
40 ports:
41 - 8000:80
42 volumes:
43 - ./:/var/www
44 - ./docker-compose/nginx:/etc/nginx/conf.d/
45 networks:
46 - travellist
47
48networks:
49 travellist:
50 driver: bridge
确保您完成后保存文件。
步骤 6 – 使用 Docker Compose 运行应用程序
我们现在将使用docker-compose
命令来构建应用程序图像并运行我们在设置中指定的服务。
使用以下命令构建app
图像:
1docker-compose build app
此命令可能需要几分钟才能完成,您将看到类似于此的输出:
1[secondary_label Output]
2Building app
3Sending build context to Docker daemon 377.3kB
4Step 1/11 : FROM php:7.4-fpm
5 ---> 8c08d993542f
6Step 2/11 : ARG user
7 ---> e3ce3af04d87
8Step 3/11 : ARG uid
9 ---> 30cb921ef7df
10Step 4/11 : RUN apt-get update && apt-get install -y git curl libpng-dev libonig-dev libxml2-dev zip unzip
11. . .
12 ---> b6dbc7a02e95
13Step 5/11 : RUN apt-get clean && rm -rf /var/lib/apt/lists/*
14 ---> 10ef9dde45ad
15. . .
16Step 6/11 : RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
17. . .
18 ---> 920e4f09ec75
19Step 7/11 : COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
20 ---> dbbcd44e44af
21Step 8/11 : RUN useradd -G www-data,root -u $uid -d /home/$user $user
22 ---> db98e899a69a
23Step 9/11 : RUN mkdir -p /home/$user/.composer && chown -R $user:$user /home/$user
24 ---> 5119e26ebfea
25Step 10/11 : WORKDIR /var/www
26 ---> 699c491611c0
27Step 11/11 : USER $user
28 ---> cf250fe8f1af
29Successfully built cf250fe8f1af
30Successfully tagged travellist:latest
当构建完成后,您可以使用以下方式在背景模式下运行环境:
1docker-compose up -d
1[secondary_label Output]
2Creating travellist-db ... done
3Creating travellist-app ... done
4Creating travellist-nginx ... done
这将使您的容器在背景中运行. 若要显示有关您的活跃服务状态的信息,请运行:
1docker-compose ps
你会看到这样的输出:
1[secondary_label Output]
2 Name Command State Ports
3-----------------------------------------------------------------------------------------------
4travellist-app docker-php-entrypoint php-fpm Up 9000/tcp
5travellist-db docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
6travellist-nginx nginx -g daemon off; Up 0.0.0.0:8000->80/tcp,:::8000->80/tcp
您的环境现在正在运行,但我们仍然需要执行几个命令才能完成设置应用程序. 您可以使用docker-compose exec
命令在服务容器中执行命令,例如ls -l
以显示应用程序目录中的文件的详细信息:
1docker-compose exec app ls -l
1[secondary_label Output]
2total 256
3-rw-r--r-- 1 sammy sammy 737 Apr 18 14:21 Dockerfile
4-rw-r--r-- 1 sammy sammy 101 Jan 7 2020 README.md
5drwxr-xr-x 6 sammy sammy 4096 Jan 7 2020 app
6-rwxr-xr-x 1 sammy sammy 1686 Jan 7 2020 artisan
7drwxr-xr-x 3 sammy sammy 4096 Jan 7 2020 bootstrap
8-rw-r--r-- 1 sammy sammy 1501 Jan 7 2020 composer.json
9-rw-r--r-- 1 sammy sammy 179071 Jan 7 2020 composer.lock
10drwxr-xr-x 2 sammy sammy 4096 Jan 7 2020 config
11drwxr-xr-x 5 sammy sammy 4096 Jan 7 2020 database
12drwxr-xr-x 4 sammy sammy 4096 Apr 18 14:22 docker-compose
13-rw-r--r-- 1 sammy sammy 1017 Apr 18 14:29 docker-compose.yml
14-rw-r--r-- 1 sammy sammy 1013 Jan 7 2020 package.json
15-rw-r--r-- 1 sammy sammy 1405 Jan 7 2020 phpunit.xml
16drwxr-xr-x 2 sammy sammy 4096 Jan 7 2020 public
17-rw-r--r-- 1 sammy sammy 273 Jan 7 2020 readme.md
18drwxr-xr-x 6 sammy sammy 4096 Jan 7 2020 resources
19drwxr-xr-x 2 sammy sammy 4096 Jan 7 2020 routes
20-rw-r--r-- 1 sammy sammy 563 Jan 7 2020 server.php
21drwxr-xr-x 5 sammy sammy 4096 Jan 7 2020 storage
22drwxr-xr-x 4 sammy sammy 4096 Jan 7 2020 tests
23-rw-r--r-- 1 sammy sammy 538 Jan 7 2020 webpack.mix.js
现在我们将运行composer install
来安装应用程序依赖:
1docker-compose exec app rm -rf vendor composer.lock
2docker-compose exec app composer install
你会看到这样的输出:
1[secondary_label Output]
2No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.
3. . .
4Lock file operations: 89 installs, 0 updates, 0 removals
5 - Locking doctrine/inflector (2.0.4)
6 - Locking doctrine/instantiator (1.4.1)
7 - Locking doctrine/lexer (1.2.3)
8 - Locking dragonmantank/cron-expression (v2.3.1)
9 - Locking egulias/email-validator (2.1.25)
10 - Locking facade/flare-client-php (1.9.1)
11 - Locking facade/ignition (1.18.1)
12 - Locking facade/ignition-contracts (1.0.2)
13 - Locking fideloper/proxy (4.4.1)
14 - Locking filp/whoops (2.14.5)
15. . .
16Writing lock file
17Installing dependencies from lock file (including require-dev)
18Package operations: 89 installs, 0 updates, 0 removals
19 - Downloading doctrine/inflector (2.0.4)
20 - Downloading doctrine/lexer (1.2.3)
21 - Downloading dragonmantank/cron-expression (v2.3.1)
22 - Downloading symfony/polyfill-php80 (v1.25.0)
23 - Downloading symfony/polyfill-php72 (v1.25.0)
24 - Downloading symfony/polyfill-mbstring (v1.25.0)
25 - Downloading symfony/var-dumper (v4.4.39)
26 - Downloading symfony/deprecation-contracts (v2.5.1)
27. . .
28Generating optimized autoload files
29> Illuminate\Foundation\ComposerScripts::postAutoloadDump
30> @php artisan package:discover --ansi
31Discovered Package: facade/ignition
32Discovered Package: fideloper/proxy
33Discovered Package: laravel/tinker
34Discovered Package: nesbot/carbon
35Discovered Package: nunomaduro/collision
36Package manifest generated successfully.
在测试应用程序之前,我们需要做的最后一件事是使用工匠
Laravel命令行工具生成一个独特的应用程序密钥,该密钥用于加密用户会话和其他敏感数据:
1docker-compose exec app php artisan key:generate
1[secondary_label Output]
2Application key set successfully.
现在,进入您的浏览器并访问您的服务器的域名或IP地址在端口 8000:
1http://server_domain_or_IP:8000
<$>[注意] 注意 :如果您在本地机器上运行此演示,请使用http://localhost:8000`从您的浏览器访问该应用程序。
你会看到这样的页面:
您可以使用日志
命令来检查您的服务生成的日志:
1docker-compose logs nginx
1Attaching to travellist-nginx
2. . .
3travellist-nginx | 172.24.9.1 - - [18/Apr/2022:14:49:16 +0000] "GET / HTTP/1.1" 200 627 "-" "curl/7.82.0"
4travellist-nginx | 172.24.9.1 - - [18/Apr/2022:14:51:27 +0000] "GET / HTTP/1.1" 200 627 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:89.0) Gecko/20100101 Firefox/89.0"
5travellist-nginx | 172.24.9.1 - - [18/Apr/2022:14:51:27 +0000] "GET /favicon.ico HTTP/1.1" 200 0 "http://localhost:8000/" "Mozilla/5.0 (X11; Linux x86_64; rv:89.0) Gecko/20100101 Firefox/89.0"
如果您想要暂停您的 Docker Compose 环境,同时保持所有服务的状态,请运行:
1docker-compose pause
1[secondary_label Output]
2Pausing travellist-db ... done
3Pausing travellist-nginx ... done
4Pausing travellist-app ... done
您可以继续使用您的服务:
1docker-compose unpause
1[secondary_label Output]
2Unpausing travellist-app ... done
3Unpausing travellist-nginx ... done
4Unpausing travellist-db ... done
若要关闭您的 Docker Compose 环境并删除所有容器、网络和卷,请运行:
1docker-compose down
1[secondary_label Output]
2Stopping travellist-nginx ... done
3Stopping travellist-db ... done
4Stopping travellist-app ... done
5Removing travellist-nginx ... done
6Removing travellist-db ... done
7Removing travellist-app ... done
8Removing network travellist-laravel-demo_travellist
若要查看所有 Docker Compose 命令,请查看 Docker Compose 命令行引用。
结论
在本指南中,我们使用 Docker Compose 设置了三个容器的 Docker 环境,以在 YAML 文件中定义我们的基础设施。
从现在开始,您可以在 Laravel 应用程序上工作,而无需安装和设置本地 Web 服务器进行开发和测试,此外,您还将使用可以轻松复制和分发的可一次性环境工作,这在开发应用程序时以及在转向生产环境时都很有帮助。