如何在 Ubuntu v22.04 上使用 Docker Compose 运行 Laravel

Laravel 是最流行的 PHP 框架 。 有超过 72 万个网站 据BuiltWith 称,全球 在使用 Laravel。 Laravel 是一个固执己见的框架,它是模块化的、易于使用的,并且拥有一个 蓬勃发展的生态系统 。 在这篇文章中,您将学习如何在 Ubuntu 22.04 上使用 Docker Compose 运行 Laravel。

先决条件

  • 安装了 Docker 和 Docker Compose 的 Ubuntu v22.04。 在本教程中,我们将使用 Docker v20.10.20 和 Docker Compose v2.12.2

  • Docker 经验

  • 一些 Laravel 的先验知识会有所帮助

  • 的知识 之前任何有关Docker 多阶段构建 都会很有用

  • 了解 Apache 的工作原理及其与 PHP 的关系

什么是 Docker?

Docker 是一个开源平台,如何修复Windows 11中控制面板打不开的问题(8种方法)使软件工程师能够将其应用程序打包到称为容器的工件中,使它们易于交付,并避免在搜索查询中添加“在我的机器上运行”的问题。

那么,什么是容器? 容器是一种使用户能够将整个堆栈打包为工件的技术。 在这种情况下,整个堆栈指的是操作系统、具有任何依赖项的语言、应用程序代码及其依赖项。 因此,在每次部署中,您都会交付整个堆栈,而不仅仅是更改的五行代码。

容器已经存在很长时间了,如何修复Steam客户端WebHelper高CPU使用率(6种方法)但在 2014 年由 Docker 普及。

镜像是按照 开放容器倡议(OCI)标准 构建的,因此它们可以在任何地方运行。

带 Backpack 的 Laravel 应用示例

在本使用 Docker 和 Docker Compose 运行 Laravel 的指南中,我们将使用一个简单的 Laravel 应用程序。 如何在 Google Chrome 浏览器中阻止网站这个基本的 Laravel 应用程序将使用 MySQL 数据库,为了展示其工作原理,我们将使用流行的 Backpack Laravel 包,该包用于构建和自定义管理面板。

为了简单起见,因为 Laravel 已经附带了用户表和用户模型,我们将其与 Backpack 相连以查看和编辑用户。 这里需要注意的是,如果您编辑用户,该用户将无法登录,因为密码不会加密。 然而,这不是本教程关注的问题。 这篇文章的重点是在 Ubuntu v22.04 上使用 Docker 和 Docker Compose 运行带有 MySQL 的 Laravel 应用程序。

我们的应用程序的完整代码可以在此 GitHub 存储库 中找到。 它还包括 Dockerfile 和 docker-compose.yml 文件。

最终应用程序将列出访问时的用户 http://localhost:8082/admin/user登录后:

Laravel 风帆

Laravel 9.x 的默认 安装说明 Laravel Sail 附带 。 如何修复错误代码16:此请求被安全规则阻止Sail 是一款出色的产品,也是 Laravel 生态系统不可或缺的一部分。 其 GitHub 存储库指出,“Sail 为 Laravel 提供了由 Docker 驱动的本地开发体验,并且与 macOS、Windows (WSL2) 和 Linux 兼容。” 那么,我们为什么不使用它呢?

Sail 对于开发环境来说是一个很棒的工具,但它不适合类似生产的环境,因为:

  • Sail 太通用了,包括数据库、Redis 和 MeiliSearch 搜索等多种功能。 在生产中,这些依赖项被卸载到其他服务,例如 RDS 或开放搜索

  • Dockerfile 非常 适合开发环境。 它有xdebug、Node.js 16 和yarn。 它还具有 MySQL 和 Node.js 客户端,但这些东西增加了容器的膨胀和重量,使其对于类似生产的环境来说不切实际

  • Sail 不使用官方的 Docker 镜像,而是以 Ubuntu v22.04 为基础镜像拼接了一个 Docker 镜像,并根据需要添加了一些东西。 它看起来更像是虚拟机 (VM),而不是优化的 Docker 镜像

  • Sail没有像 Docker多阶段构建 如何在 Windows 11 上禁用 Windows Defender SmartScreen那样使用Docker的特性,这不仅可以减少镜像的大小,而且可以使Docker镜像针对某些环境进行很好的优化

This takes us to our next step, where you will clone the repository and understand the parts involved to run a Laravel app with Docker and Docker Compose.

Setting up Docker and Docker Compose

To get started, you can clone the repository with git clone [email protected]:geshan/laravel-backpack-demo.git. You can go into the folder with cd laravel-backpack-demo and look around the file structure:

It will look mostly like any other Laravel 9.x project, but you will find some other interesting files. First, there is the /db/init.sql file, which is used to load the MySQL Docker container with some user and migration data, in addition to the default Laravel database structure.

Then there are some Docker-specific configuration files in the /docker folder. As we will use the default PHP Docker image with Apache, an Apache config is there. Similarly, for better performance on production, the Opcache config file is also included. It will not be used, but it is there for reference.

Then, at the root of the project, there are three files that will form the basis of this tutorial. The docker-compose-sail.yml file is the default Docker Compose file that comes with the Laravel 9.x install for Sail. It has been renamed from docker-compose.yml to docker-compose-sail.yml so that we can use the docker-compose.yml file as the default one. After that, we have the Dockerfile that makes use of the multi-stage Docker build.

Dockerfile for Laravel

The Dockerfile to run Laravel 9.x (9.19 at the time of writing) on Ubuntu 22.04 following the multi-stage build looks like:

FROM composer:2.4 as build
COPY . /app/
RUN composer install --prefer-dist --no-dev --optimize-autoloader --no-interaction
​
FROM php:8.1-apache-buster as dev
​
ENV APP_ENV=dev
ENV APP_DEBUG=true
ENV COMPOSER_ALLOW_SUPERUSER=1
​
RUN apt-get update && apt-get install -y zip
RUN docker-php-ext-install pdo pdo_mysql
​
COPY . /var/www/html/
COPY --from=build /usr/bin/composer /usr/bin/composer
RUN composer install --prefer-dist --no-interaction
​
COPY docker/apache/000-default.conf /etc/apache2/sites-available/000-default.conf
COPY .env.dev /var/www/html/.env
​
RUN php artisan config:cache && \
    php artisan route:cache && \
    chmod 777 -R /var/www/html/storage/ && \
    chown -R www-data:www-data /var/www/ && \
    a2enmod rewrite
​
FROM php:8.1-apache-buster as production
​
ENV APP_ENV=production
ENV APP_DEBUG=false
​
RUN docker-php-ext-configure opcache --enable-opcache && \
    docker-php-ext-install pdo pdo_mysql
COPY docker/php/conf.d/opcache.ini /usr/local/etc/php/conf.d/opcache.ini
​
COPY --from=build /app /var/www/html
COPY docker/apache/000-default.conf /etc/apache2/sites-available/000-default.conf
COPY .env.prod /var/www/html/.env
​
RUN php artisan config:cache && \
    php artisan route:cache && \
    chmod 777 -R /var/www/html/storage/ && \
    chown -R www-data:www-data /var/www/ && \
    a2enmod rewrite

该 Dockerfile 从构建阶段开始,该阶段取自 PHP Composer 2.4 官方 Docker 镜像。 在此阶段,整个应用程序将复制到 /app文件夹内的图像,并且 Composer 安装在生产模式下运行,无需交互并留下开发依赖项。 那么至此,所有的非开发Composer包已经安装完毕了 vendor文件夹。

接下来,您可以看到 dev阶段。 这是将在 docker-compose.yml稍后也归档。 v8.1 Apache Docker 镜像开始 它从官方 PHP 。 它设置一些环境变量,例如 APP_ENV至 dev, APP_DEBUG为真,并且 COMPOSER_ALLOW_SUPERUSER作为 1。 这些变量是不言自明的。 然后它安装了 zip,这是安装其他软件包所必需的。

因为我们只在这个项目中使用 MySQL,所以它只安装 pdo和 pdo_mysqlPHP 扩展。 然后我们从构建阶段获取 compose 可执行文件。 这是使用多阶段 Docker 构建的另一个优点。 由于我们将使用此映像进行开发,因此我们安装所有依赖项,包括开发依赖项 composer install.

之后,我们将 Apache 配置文件复制到容器内的正确位置 /docker/apache/000-default.conf。 该文件的内容如下所示:

<VirtualHost *:80>
​
  ServerAdmin webmaster@localhost
  DocumentRoot /var/www/html/public/
​
  <Directory /var/www/>
    AllowOverride All
    Require all granted
  </Directory>
​
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined
​
</VirtualHost>

这是一个简单的 Apache 配置文件,用于在端口 80 上为网站提供服务 /var/www/html/public。 它还有一些有关虚拟主机日志的指令。 接下来我们复制 .env.dev文件为 .env容器上的文件。 该文件包含所有配置,例如 MySQL 数据库的凭据。

最后,我们运行常规的 Laravel artisan 命令来配置缓存、路由缓存并使存储可写。 然后确定用户 www:data具有正确的权限并启用重写 Apache 模块。 它应该可以工作,因为图像具有 apache2 前景 作为命令。

下一阶段是 production,这也是从官方开始的 php:8.1-apache图像。 它配置并启用 OPcache 以在生产中进行缓存。 OPcache 通过将预编译的脚本字节码存储在共享内存中来提高 PHP 性能,这使其非常适合生产用例。

然后安装 pdo和 pdo_mysql就像在开发阶段一样。 OPcache 配置也会被加载。 如果您对 OPcache 配置感兴趣,请查看 此文件 。 接下来,它从构建阶段复制整个应用程序,其中在执行时忽略开发依赖项 compose install.

相同的 Apache 配置也会在此 Docker 阶段加载,但是 .env.prod环境变量被复制到 /var/www/html/.env小路。 在实际的应用程序中,这一行将被省略,以支持以其他方式注入运行时环境变量,例如使用 Kubernetes 机密。 最后,使用相同的命令使 Apache 为我们的 Laravel 应用程序提供服务。 在下一节中,您将了解 Docker Compose 文件。

Docker 为 Laravel 撰写

上述 Docker 文件是使用 Docker Compose 文件定义构建和运行的。 您可以使用常规 Docker 命令构建和运行单个容器。 Docker Compose会派上用场。 当您想要运行多个容器并且不想输入带有多个参数的长命令时,

Docker Compose 文件是一个用于配置应用程序服务的 YAML 文件。 下面是运行 Laravel 应用程序的 Docker Compose 文件和所需的 MySQL 容器。 趣知笔记 - 分享有价值的教程!我们来剖析一下它的内容:

version: '3'
services:
  app:
    build:
      context: ./
      target: dev
    volumes:
      - .:/var/www/html
      - .env.dev:/var/www/html/.env
    ports:
      - "8082:80"
    environment:
      - APP_ENV=local
      - APP_DEBUG=true
    networks:
      - laravel
    depends_on:
      - mysql    
  mysql:
      image: 'mysql/mysql-server:8.0'
      environment:
        MYSQL_ROOT_HOST: "%"
        MYSQL_ROOT_PASSWORD: "root"
        MYSQL_USER: "laravel"
        MYSQL_PASSWORD: "FhgVoFuOrWspc3TgBIA2K4dZGuJTPwSYBoLnNckcaxy"
        MYSQL_DATABASE: "laravel"
        MYSQL_ALLOW_EMPTY_PASSWORD: 1
      ports:
        - 3906:3306
      volumes:
        - 'mysql8:/var/lib/mysql'
        - './db/init.sql:/docker-entrypoint-initdb.d/01init.sql'
      networks:
        - laravel
networks:
    laravel:
        driver: bridge
volumes:
    mysql8:
        driver: local

Docker Compose 文件从 版本 3 开始,趣知笔记网站地图它具有一组功能。 然后我们定义我们的服务。 第一个是 app服务,它将让 PHP 和 Apache 服务器在同一容器中运行。 为此,我们指示 Docker Compose Docker 文件与上下文位于同一目录中,并且目标(读取阶段)是 dev。 所以我们希望 Docker Compose 构建 devstage 来自我们在上一节中讨论的启用多阶段的 Dockerfile。

在这个 app服务,然后我们在卷部分指定要从本地计算机同步到容器的文件。 我们说我们希望当前目录中的所有文件都同步到 /var/www/html在容器中。 我们还指定 .env.dev本地文件需要同步 .env文件在同一路径下。

接下来,我们指定本地端口 8082映射到容器端口 80。在容器中的端口 80 上,Apache 服务器将运行。 之后我们添加两个环境变量 APP_ENV与价值 local和 APP_DEBUG与价值 true。 当我们使用此容器进行本地开发时,如果发生错误,这些错误将被设置为在浏览器上显示错误。

之后,我们指定应用程序服务的网络 laravel。 中的网络 Docker Compose 支持多个服务相互通信的方式。 在本例中,我们将使用 桥接网络 ,它允许使用同一桥接网络连接的容器之间进行通信。 因此,我们指定应用程序容器 depends_onMySQL 容器在文件中接下来定义。 它不是硬依赖,而是用于控制 启动和关闭的顺序 。

这 mysql文件中接下来定义服务。 它是 MySQL服务器镜像 MySQL提供的 。 对于本指南,我们使用版本 8.0。 这里定义了一些重要的环境变量,例如 ROOT_HOST、root 用户的密码以及另一个 MySQL 用户和密码。 数据库指定为 laravel.

主机上的端口 3906 映射到运行 MySQL 服务器的容器上的 3306。 为了在重新启动后保持数据持久性,名为 mysql8定义了,映射到MySQL的默认数据目录: /var/lib/mysql在容器上。 另一个重要的体积映射是 ./db/init.sql文件到入口点。 这样做是为了在第一次启动时,我们的虚拟用户数据将加载到空的 MySQL 服务器实例上。 接下来,网络定义为 laravel和 laravel网络设置为桥接网络。

最后但并非最不重要的一点是,名为 MySQL 服务器的卷 mysql8被标记为本地驱动程序。 这意味着 Docker 将管理数据的存储位置。 您可以通过运行以下命令了解有关卷的更多信息 docker volume ls命令。 您还可以了解其他有用的 Docker 命令 ,例如 Docker 映像、日志等。 在下一节中,您将了解 Docker ignore文件。

Don’t ignore the dockerignore file

类似于我们的方式 .gitignorefile 从 git 中排除某些文件,我们可以使用 .dockerignore文件以排除文件被复制到 Docker 映像和容器。 例如,下面是 .dockerignore文件。 本例中使用的

.git
.env

上面的文件指示 Docker 不要复制 .git文件夹和 .env文件放入容器中。 这不仅有助于保持容器较小,而且还有助于减轻任何 安全问题 。 接下来我们将在 Ubuntu 22.04 上构建并运行 Laravel 容器。

本地构建并运行

现在我们已经定义并描述了我们的 Dockerfile和 docker-compose.yml文件。 要构建图像,您可以运行以下命令:

docker compose build

它将在开始时显示以下输出:

它从 DockerHub 中提取所有需要的 Docker 镜像层来构建镜像。 在我的测试中,下载所有图层大约需要三分钟。 使用 BuildKit 由于我使用的是 Docker 20.10,因此它默认 。 它以以下输出结束:

此时,最好在本地获取 Composer 依赖项,因为它将与 Docker Compose 文件中的卷进行映射。 您可以通过运行以下命令来做到这一点:

docker run --rm --interactive --tty \
  --volume $PWD:/app \
  composer install

这会将所有依赖项拉到本地计算机上,稍后,当映射卷时,这些依赖项也将在容器上可用。 请记住,如果不使用 Docker Compose 或整个文件夹未映射为卷,则不需要这样做。 它将产生以下输出:

然后,要运行容器,我们可以执行:

docker compose up

Depending on your Docker and Docker Compose version, it can also be docker-compose up if you are using an older version of Docker Compose. It will yield the following result:

这将启动服务及其相关容器。 两个容器启动后,您可以在浏览器上检查该应用程序: http://localhost:8082,这将显示默认的 Laravel 页面:

我添加了一个 -除了 Documentation看看更新是如何工作的,它工作得很好。 要登录并查看用户,您可以导航到 http://localhost:8082/admin/login并使用 [email protected]作为用户和 testpass作为密码,然后点击 登录 :

这是可能的,无需运行任何 artisan migrate因为初始数据已随文件一起加载 ./db/init.sql,它有两个用户。 登录后点击 用户即可看到: 左侧的

你有它! Laravel 9.x 在 Ubuntu 22.04 上通过 Docker 和 Docker Compose 运行 MySQL。 除了易于设置之外,这个 Docker 镜像还具有生产阶段,比 Laravel Sail 优化得多。

结论

在本指南中,您了解了 Docker 是什么。 然后您了解了一个简单的 Laravel 9.x 应用程序,使用 Backpack 来向用户显示。 之后,我们向您介绍了 Docker 文件和 Docker Compose 文件,以便在 Ubuntu v22.04 上使用 Docker 运行此应用程序。 在这个过程中,你还了解了 dockerignore以及如何为 Laravel 构建和运行适用于本地开发并支持生产模式的 Docker 容器。

猜你喜欢

转载自blog.csdn.net/weixin_47967031/article/details/132805672