Docker for PHP:一个从头到尾的指南

你可能在过去的几年里看到过Docker的提及。本指南介绍了基础知识,以便您可以在本地开发环境中启动和运行Docker for PHP。

为何选择Docker?

在昏暗和遥远的过去,当开发人员想要更改生产代码时,他们可能已经SSH连接到服务器并手动更改了代码。 (SSH意味着Secure Shell,它是在不安全的网络上运行网络服务的一种方式。)当然,在PHP的良好测试和良好的构建管道方面几乎没有经验和指导。谢天谢地,这已经改变了。

如今,开发团队希望能够在类似生产的环境中测试代码。这样做可以让团队自信地部署代码。为此,本地开发环境需要与代码运行的生产环境相同(或尽可能接近)。

虚拟机是朝着这个方向迈出的一步。有了这些,开发人员可以在本地计算机上启动生产软件的版本。虚拟机工作正常,但它们很慢并且使用了大量系统资源。

Docker修复了这些问题以及更多问题。能够在项目之间建立隔离环境,轻松测试不同版本的代码,以及占用空间小的这些东西,这只是Docker赢得我心的原因之一。

Docker for PHP入门

首先,确保在本地系统上安装了Docker。我认为网站上的文档对于所有操作系统都是清晰的。

本教程您将需要的另一件事是名为composer的PHP包管理系统。

一些工具将为您提供Docker配置,而无需自己理解。我尝试了几种这样的工具,而且我的经验好坏参半。我喜欢控制构建中的所有内容,以确保只安装必要的工具。像大多数其他开发人员一样,我也想了解代码正在做什么,而不是依赖于“魔术”命令。因此,当我设置此配置时,我将尝试解释所发生的一切。

让我们使用一个简单的Laravel应用程序来启动和运行。但是,本指南适用于所有PHP软件和框架。

通过打开新终端并运行以下命令来安装空的Laravel项目:

作曲家创作项目laravel / laravel docker-tutorial

现在创建Docker配置所需的三个文件:

mkdir .docker#一个隐藏文件夹,用于保存大部分Docker配置。

触摸.docker / Dockerfile .docker / vhost.conf

touch docker-compose.yml#这必须在根目录下。

就是这样 – 三个文件和一个目录

如果您使用此设置与每个框架或应用程序准备,那么您将始终知道在哪里查看和检查什么。

让我们来看看每个文件如何为您的配置做出贡献。我们还将介绍一些关键的Docker命令。

编写Dockerfile

Dockerfile是一个文本文档,其中包含构建Docker镜像所需的指令。构建后,容器会运行这些映像的实例。几乎在每种情况下,您的图像都将构建在另一个场景之上。 Docker Hub有很多可供选择的图像。我喜欢使用官方PHP图像作为我的项目的基础。

在本教程中,我们使用Apache服务器:

来自php:7.3-apache

复制。 /应用

COPY .docker / vhost.conf /etc/apache2/sites-available/000-default.conf

RUN chown -R www-data:www-data / app && a2enmod rewrite

Dockerfile指令仅依赖于几个主要关键字。我在这里列出了其中三个。

  • 这里的FROM命令声明要使用的基本映像。我们使用的是php:7.3-apache,一个带有特定标签的官方PHP图像。在文档中,您可以看到可供选择的特定和通用标记。您越具体,不同环境之间的兼容性问题就越少。
  • 接下来,您可以将一些文件复制到图像中。您可能希望先将代码复制到/ app文件夹中,然后将vhost.conf文件复制到文件系统的正确部分。您可以将任何文件复制到相对于构建图像的上下文的图像中。
  • 然后,您可以运行chown命令,将应用程序文件的所有权更改为Apache Web用户。使用RUN关键字执行的命令会自动在根级别运行,因此您无需在sudo前添加它们。

编写vhost文件

这个文件中没有太多内容。我们将Web主机指向Laravel入口点并收集日志。

DocumentRoot / app / public

AllowOverride all

要求全部授予

ErrorLog ${APACHE_LOG_DIR} /error.log

CustomLog ${APACHE_LOG_DIR} /access.log组合在一起

日志文件通过管道传送到STDOUT,因此您可以在应用程序运行时实时查看它们。这对于在本地调试错误很方便。

堆栈的货物拖车

构建图像

Docker管理容器,Docker运行的每个容器都依赖于图像。该映像是一个构建工件,可以经过严格测试,并且对所有服务器都是相同的。这种测试和相同性使部署代码的质量和稳定性更加可靠。

要生成构建映像,请从项目根目录运行以下命令:

docker build -file .docker / Dockerfile

-t docker-tutorial。

文件标志显示Dockerfile的位置,-t标志用于标记图像。标记很有用,因此您可以跟踪系统中的图像并区分项目。它还简化了以后如何引用图像的过程。

最后的“。”定义了构建发生的上下文。此上下文对于构建过程中的COPY命令尤其重要。

运行服务器

现在,您可以使用此图像启动容器,最后查看您的应用程序。

docker run -rm -p 8080:80 docker-tutorial

如果您已经跟随,请导航到localhost:8080。您应该看到Laravel项目启动页面。

做得好您已经从头开始构建Dockerfile和容器。

命令中的-rm标志表示退出docker进程时将删除容器。 -p标志将localhost上的端口映射到docker容器内的端口。最后一个参数是您要构建的图像,由您之前添加的标记引用。

我们到了吗?

创建构建映像时,可以复制应用程序文件并使其成为工件的一部分。这些文件在构建后是静态的,在本地更改它们不会在docker镜像中更改它们。

在开发过程中,您可能希望在容器中更新文件。为此,请使用docker-compose。

编写docker-compose.yml文件

docker-compose文件编排了多个Docker容器的创建,并处理它们之间的网络连接。为每个作业安装一个容器是一种好习惯,因此通常有一个用于Web服务器的容器和一个用于数据库的容器。您可以在docker-compose文件中声明和协调这两者。

版本:'3'

服务:

搬运工教程:

建立:

背景:。

dockerfile:.docker / Dockerfile

图片:docker-tutorial

端口:

– 8080:80

顶部的版本声明告诉docker-compose您正在使用哪种配置格式。

此时,您可以开始声明服务。 Docker为每个服务旋转一个单独的容器。目前,您只有一个名为docker-tutorial的容器。其余配置应类似于命令行执行。

对于构建步骤,您可以提供上下文(在本例中为当前目录)。然后你可以指向正确的Dockerfile。您还拥有与之前相同的端口绑定。

从项目根目录运行:

码头工人组成

你已经设法让docker-compose为你带来前所未有的位置但您仍然无法访问本地文件系统。为此,您需要安装成交量并更改Dockerfile中的构建步骤。

服务:

搬运工教程:

成交量:

– 。:/ app

在Dockerfile中,不是将文件复制到映像中,而是创建/ app目录,然后

复制。 /应用

然后成为

运行mkdir / app

现在,运行你的docker-compose命令 – 但是,因为你已经更新了Dockerfile,你需要确保重建图像。通过将-build标志添加到docker-compose命令来执行此操作。

docker-compose up -build

当您访问localhost:8080上的站点时,它应该提供实时本地文件。您所做的任何更改都将立即在生产环境中可见。

计算机键盘特写镜头照片

可能的权限错误

在某些情况下,您可能会收到错误,因为Apache Web用户无法写入日志。如果发生这种情况,您需要更改存储和引导目录的权限,如下所示:

chmod -R o + rw bootstrap / storage /

之后一切都应该正常工作。

添加数据库

大多数应用程序都有一个持久存储数据库。让我们在您的设置中添加一个MySQL数据库。您需要对docker-compose.yml文件进行一些更改。

版本:'3'

服务:

搬运工教程:

链接:

– mysql

环境:

DB_HOST:mysql

DB_DATABASE:docker

DB_USERNAME:docker

DB_PASSWORD:docker

MySQL的:

image:mysql:5.7

端口:

– 13306:3306

环境:

MYSQL_DATABASE:docker

MYSQL_USER:docker

MYSQL_PASSWORD:docker

MYSQL_ROOT_PASSWORD:docker

你的docker-compose.yml文件有很多内容,但希望很明显发生了什么。

链接键是声明您希望docker-tutorial容器链接到的所有容器。在这种情况下,它只是MySQL服务器,但它可以是任何数量的其他服务。 Docker使用此声明处理容器之间的所有内部路由。

然后我们声明了一些环境变量。这些将否决在Laravel的.env文件中声明的任何变量。

第二个启动的服务是mysql。该图像是具有特定版本号的官方MySQL。

最后,您可以添加端口映射和环境变量。

运行命令

Docker容器已启动并运行最后要看的是运行命令。要在docker-tutorial容器中获取命令提示符,请尝试以下操作:

docker-compose exec docker-tutorial / bin / bash

这在/ var / www / html目录中提供了bash提示符,这是apache2 hosting的标准目录。如果您正在使用/ app,则可以更改目录并运行数据库迁移。

cd / app

php工匠迁移

嗯,哦您没有数据库驱动程序。为什么不?因为Laravel使用的驱动程序与标准的PHP安装程序略有不同。

完成之前的最后一个配置是更改Dockerfile以安装Laravel所需的PHP扩展。

更新Dockerfile

这些是让Docker环境正常运行的最终更改。 Laravel 5.8需要在服务器上安装许多PHP扩展。这是最终文件的样子:

来自php:7.3-apache

运行apt-get update

运行apt-get install -y libzip-dev libjpeg62-turbo-dev libpng-dev libfreetype6-dev

#安装扩展

运行docker-php-ext-install pdo_mysql mbstring zip exif pcntl

RUN docker-php-ext-configure gd -with-gd -with-freetype -dir = / usr / include / -with-jpeg-dir = / usr / include / -with-png-dir = / usr / include /

运行docker-php-ext-install gd

运行mkdir / app

COPY .docker / vhost.conf /etc/apache2/sites-available/000-default.conf

WORKDIR / app

RUN chown -R www-data:www-data / app && a2enmod rewrite

我们安装了一些必需的软件包,然后安装了PHP扩展。唯一的另一个区别是添加WORKDIR指令。现在当你启动一个bash提示符时,你将会在/ app目录中,而不必在执行任何PHP artisan命令之前去任何地方。

我们试一试:

docker-compose up -d -build

在这里,我们正在重建图像并旋转容器。 -d标志告诉Docker一旦它们启动并运行就要从容器中分离出来。

现在,让我们回到那些迁移。

docker-compose exec docker-tutorial / bin / bash

php工匠迁移

唷全部启动并运行

结束用于PHP的Docker

在本指南中,我们已经介绍了构建Docker镜像,运行容器以及使用docker-compose编排这些容器的过程。日志正在通过管道输送到STDOUT。因此,在生产中,您可以轻松地聚​​合,分析和处理日志。

Retrace是一个很好的服务来做到这一点。它提供应用程序性能数据,使您可以找到错误并提高性能。对于PHP,它提供了帮助提高代码质量的工具。 Retrace也经过优化,可支持Docker容器,提供出色的文档。

资讯来源:由0x资讯编译自STACKIFY,版权归作者Kevin Cunningham所有,未经许可,不得转载
你可能还喜欢