如何在Ubuntu18.04上使用DockerCompose将Laravel应用程序容器化以进行开发

来自菜鸟教程
跳转至:导航、​搜索

介绍

对于 containerize 应用程序是指调整应用程序及其组件以便能够在称为 containers 的轻量级环境中运行它的过程。 此类环境是孤立的和一次性的,可用于开发、测试和部署应用程序到生产环境。

在本指南中,我们将使用 Docker ComposeLaravel 应用程序容器化以进行开发。 完成后,您将拥有一个运行在三个独立服务容器上的演示 Laravel 应用程序:

  • 运行 PHP7.4-FPM 的 app 服务;
  • 运行 MySQL 5.7 的 db 服务;
  • 一个 nginx 服务,它使用 app 服务在将 Laravel 应用程序提供给最终用户之前解析 PHP 代码。

为了简化开发过程并促进应用程序调试,我们将使用共享卷保持应用程序文件同步。 我们还将了解如何使用 docker-compose exec 命令在 app 容器上运行 ComposerArtisan

先决条件

  • 以具有 sudo 权限的非 root 用户身份访问 Ubuntu 18.04 本地计算机或开发服务器。 如果您使用的是远程服务器,建议安装活动防火墙。 要设置这些,请参阅我们的 Ubuntu 18.04 初始服务器设置指南。
  • 按照 如何在 Ubuntu 18.04 上安装和使用 Docker 的步骤 1 和 2 安装在您的服务器上的 Docker。
  • 按照 如何在 Ubuntu 18.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 附带了一个 example.env 文件,我们可以复制它来创建我们自己的文件:

cp .env.example .env

使用 nano 或您选择的文本编辑器打开此文件:

nano .env

travellist 演示应用程序中的当前 .env 文件包含使用本地 MySQL 数据库的设置,其中 127.0.0.1 作为数据库主机。 我们需要更新 DB_HOST 变量,使其指向我们将在 Docker 环境中创建的数据库服务。 在本指南中,我们将调用我们的数据库服务 db。 继续,将 DB_HOST 列出的值替换为数据库服务名称:

.env

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,然后按 YEnter 确认。

第 3 步 — 设置应用程序的 Dockerfile

尽管我们的 MySQL 和 Nginx 服务都将基于从 Docker Hub 获取的默认镜像,但我们仍然需要为应用程序容器构建自定义镜像。 我们将为此创建一个新的 Dockerfile。

我们的 travellist 镜像将基于 Docker Hub 的 php:7.4-fpm 官方 PHP 镜像。 在基本的 PHP-FPM 环境之上,我们将安装一些额外的 PHP 模块和 Composer 依赖管理工具。

我们还将创建一个新的系统用户; 这是在开发应用程序时执行 artisancomposer 命令所必需的。 uid 设置确保容器内的用户与运行 Docker 的主机上的系统用户具有相同的 uid。 这样,由这些命令创建的任何文件都将在具有正确权限的主机中复制。 这也意味着您将能够在主机中使用您选择的代码编辑器来开发在容器内运行的应用程序。

使用以下命令创建一个新的 Dockerfile:

nano Dockerfile

将以下内容复制到您的 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 可执行文件复制到我们自己的应用程序镜像来安装 Composer。

然后使用在 Dockerfile 开头声明的 useruid 参数创建和设置一个新的系统用户。 这些值将由 Docker Compose 在构建时注入。

最后,我们将默认工作目录设置为 /var/www 并更改为新创建的用户。 在应用程序容器上运行 composerartisan 命令时,这将确保您以普通用户身份连接,并且您位于正确的目录中。

第 4 步 — 设置 Nginx 配置和数据库转储文件

使用 Docker Compose 创建开发环境时,通常需要与服务容器共享配置或初始化文件,以便设置或引导这些服务。 这种做法有助于在开发应用程序时更改配置文件以微调您的环境。

我们现在将设置一个文件夹,其中包含将用于配置和初始化我们的服务容器的文件。

要设置 Nginx,我们将共享一个 travellist.conf 文件,该文件将配置应用程序的服务方式。 使用以下命令创建 docker-compose/nginx 文件夹:

mkdir -p docker-compose/nginx

在该目录中打开一个名为 travellist.conf 的新文件:

nano docker-compose/nginx/travellist.conf

将以下 Nginx 配置复制到该文件:

码头工人撰写/nginx/travellist.conf

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 使用端口 9000 上的 app 服务来处理 *.php 文件。

完成编辑后保存并关闭文件。

为了设置 MySQL 数据库,我们将共享一个数据库转储,该转储将在容器初始化时导入。 这是我们将在该容器上使用的 MySQL 5.7 映像 提供的功能。

docker-compose 文件夹中为您的 MySQL 初始化文件创建一个新文件夹:

mkdir docker-compose/mysql

打开一个新的 .sql 文件:

nano docker-compose/mysql/init_db.sql

以下 MySQL 转储基于我们在 Laravel on LEMP 指南 中设置的数据库。 它将创建一个名为 places 的新表。 然后,它将使用一组示例位置填充表。

将以下代码添加到文件中:

码头工人撰写/mysql/db_init.sql

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 表包含三个字段:idnamevisitedvisited 字段是一个标志,用于标识仍然 要去 的地方。 随意更改示例位置或包含新位置。 完成后保存并关闭文件。

我们已经完成了应用程序的 Dockerfile 和服务配置文件的设置。 接下来,我们将设置 Docker Compose 在创建服务时使用这些文件。

第 5 步 — 使用 Docker Compose 创建多容器环境

Docker Compose 使您能够为在 Docker 上运行的应用程序创建多容器环境。 它使用 服务定义 来构建具有多个容器的完全可定制的环境,这些容器可以共享网络和数据量。 这允许应用程序组件之间的无缝集成。

为了设置我们的服务定义,我们将创建一个名为 docker-compose.yml 的新文件。 通常,此文件位于应用程序文件夹的根目录,它定义了您的容器化环境,包括您将用于构建容器的基本映像,以及您的服务将如何交互。

我们将在 docker-compose.yml 文件中定义三个不同的服务:appdbnginx

app 服务将基于我们之前创建的 Dockerfile 构建一个名为 travellist 的映像。 此服务定义的容器将运行 php-fpm 服务器来解析 PHP 代码并将结果发送回 nginx 服务,该服务将在单独的容器上运行。 mysql 服务定义了一个运行 MySQL 5.7 服务器的容器。 我们的服务将共享一个名为 travellist桥接网络

应用程序文件将通过 bind mountsappnginx 服务上同步。 Bind mounts 在开发环境中很有用,因为它们允许在主机和容器之间进行高性能的双向同步。

在应用程序文件夹的根目录创建一个新的 docker-compose.yml 文件:

nano docker-compose.yml

典型的 docker-compose.yml 文件以版本定义开始,然后是 services 节点,在该节点下定义所有服务。 共享网络通常定义在该文件的底部。

首先,将此样板代码复制到您的 docker-compose.yml 文件中:

码头工人-compose.yml

version: "3.7"
services:


networks:
  travellist:
    driver: bridge

我们现在将编辑 services 节点以包含 appdbnginx 服务。

app 服务

app 服务将设置一个名为 travellist-app 的容器。 它基于与 docker-compose.yml 文件位于相同路径的 Dockerfile 构建新的 Docker 映像。 新图像将以名称 travellist 保存在本地。

即使作为应用程序的文档根位于 nginx 容器中,我们也需要应用程序文件在 app 容器内的某个位置,因此我们能够执行命令行任务使用 Laravel Artisan 工具。

services 节点下的 docker-compose.yml 文件中复制以下服务定义:

码头工人-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 获取指令。 将参数 useruid 注入 Dockerfile 以在构建时自定义用户创建命令。
  • image:将用于正在构建的映像的名称。
  • container_name:设置此服务的容器名称。
  • restart:总是重启,除非服务停止。
  • working_dir:将此服务的默认目录设置为 /var/www
  • volumes:创建一个共享卷,将当前目录的内容同步到容器内的/var/www。 请注意,这不是您的文档根目录,因为它将位于 nginx 容器中。
  • networks:设置此服务以使用名为 travellist 的网络。

db 服务

db 服务使用来自 Docker Hub 的预构建 MySQL 5.7 映像。 因为 Docker Compose 会自动加载与 docker-compose.yml 文件位于同一目录中的 .env 变量文件,因此我们可以从我们在上一步中创建的 Laravel .env 文件中获取我们的数据库设置.

services 节点中包含以下服务定义,就在 app 服务之后:

码头工人-compose.yml

  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镜像会自动导入容器内/docker-entrypoint-initdb.d目录下的.sql文件。
  • networks:设置此服务以使用名为 travellist 的网络。

nginx 服务

nginx 服务在轻量级 Linux 发行版 Alpine 之上使用预构建的 Nginx 映像。 它创建一个名为 travellist-nginx 的容器,并使用 ports 定义创建从主机系统上的端口 8000 到容器内的端口 80 的重定向.

services 节点中包含以下服务定义,就在 db 服务之后:

码头工人-compose.yml

  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 访问在容器内端口 80 上运行的 Web 服务器。
  • volumes:创建两个共享卷。 第一个会将当前目录中的内容同步到容器内的/var/www。 这样,当您对应用程序文件进行本地更改时,它们将迅速反映在容器内 Nginx 所服务的应用程序中。 第二卷将确保将位于 docker-compose/nginx/travellist.conf 的 Nginx 配置文件复制到容器的 Nginx 配置文件夹中。
  • networks:设置此服务以使用名为 travellist 的网络。

完成docker-compose.yml文件

这是我们完成的 docker-compose.yml 文件的样子:

码头工人-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   nginx -g daemon off;            Up      0.0.0.0:8000->80/tcp

您的环境现在已经启动并正在运行,但我们仍然需要执行几个命令来完成应用程序的设置。 您可以使用 docker-compose exec 命令在服务容器中执行命令,例如 ls -l 可以显示有关应用程序目录中文件的详细信息:

docker-compose exec app ls -l
Outputtotal 256
-rw-rw-r-- 1 sammy 1001    738 Jan 15 16:46 Dockerfile
-rw-rw-r-- 1 sammy 1001    101 Jan  7 08:05 README.md
drwxrwxr-x 6 sammy 1001   4096 Jan  7 08:05 app
-rwxr-xr-x 1 sammy 1001   1686 Jan  7 08:05 artisan
drwxrwxr-x 3 sammy 1001   4096 Jan  7 08:05 bootstrap
-rw-rw-r-- 1 sammy 1001   1501 Jan  7 08:05 composer.json
-rw-rw-r-- 1 sammy 1001 179071 Jan  7 08:05 composer.lock
drwxrwxr-x 2 sammy 1001   4096 Jan  7 08:05 config
drwxrwxr-x 5 sammy 1001   4096 Jan  7 08:05 database
drwxrwxr-x 4 sammy 1001   4096 Jan 15 16:46 docker-compose
-rw-rw-r-- 1 sammy 1001   1015 Jan 15 16:45 docker-compose.yml
-rw-rw-r-- 1 sammy 1001   1013 Jan  7 08:05 package.json
-rw-rw-r-- 1 sammy 1001   1405 Jan  7 08:05 phpunit.xml
drwxrwxr-x 2 sammy 1001   4096 Jan  7 08:05 public
-rw-rw-r-- 1 sammy 1001    273 Jan  7 08:05 readme.md
drwxrwxr-x 6 sammy 1001   4096 Jan  7 08:05 resources
drwxrwxr-x 2 sammy 1001   4096 Jan  7 08:05 routes
-rw-rw-r-- 1 sammy 1001    563 Jan  7 08:05 server.php
drwxrwxr-x 5 sammy 1001   4096 Jan  7 08:05 storage
drwxrwxr-x 4 sammy 1001   4096 Jan  7 08:05 tests
-rw-rw-r-- 1 sammy 1001    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

你会看到这样的页面:

您可以使用 logs 命令查看服务生成的日志:

docker-compose logs nginx
Attaching to travellist-nginx
travellist-nginx | 192.168.160.1 - - [23/Jan/2020:13:57:25 +0000] "GET / HTTP/1.1" 200 626 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"
travellist-nginx | 192.168.160.1 - - [23/Jan/2020:13:57:26 +0000] "GET /favicon.ico HTTP/1.1" 200 0 "http://localhost:8000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"
travellist-nginx | 192.168.160.1 - - [23/Jan/2020:13:57:42 +0000] "GET / HTTP/1.1" 200 626 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 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 服务器来进行开发和测试。 此外,您将使用可轻松复制和分发的一次性环境,这在开发应用程序以及转向生产环境时会很有帮助。