Laravel + Docker:我们的成功经验

图片

这篇文章是关于什么的


本文将讨论我们使用Docker快速配置可扩展的dev环境进行Web开发的经验。 我将简要讨论我们面临的任务以及解决这些问题所选择的工具。 本文标记有教程图标,因为您会在其中找到有关部署环境的说明。 与类似的文章(文章末尾的链接)相比,技术细节更少,示例更多。

我们面临什么任务?


碰巧一个新的开发人员连接到一个现有的团队。 这样他就可以开始执行任务(换句话说,编写代码并检查他的工作),而这不足以获取源代码。 您需要一个包含Web服务器,php编译器和数据库的环境。 这是最小设置。 根据项目的不同,环境可能包括:

  • NoSQL
  • 队列服务器
  • 全文搜索引擎;
  • 缓存解决方案;
  • 选择器;
  • 有用的开发人员工具

所有这些都必须在开发人员本地安装,并且与其他团队成员的版本相同。 这里有困难:

  1. 安装后,需要进行配置;
  2. 该软件已经安装,但版本不同。
  3. 很久了

开发人员在不同平台(Windows,Linux,OS X)上工作的事实使事情变得更加复杂。

为了解决这个问题,选择了Docker。 也许主要原因是它很容易适合现有的基础架构。 它在Linux上以及在该OS上的大多数开发人员都可以很好地工作。

另类

Laravel提供了自己的解决方案来组织称为Homestead的本地环境。 这是Vagrant的一组配置和脚本,借助于这些配置文件和脚本,必要的软件已部署在VirtualBox虚拟机中。 但是Homestead的描述不在本文讨论范围之内。

拉拉多克项目


最初,该项目专门用于在Docker上启动Laravel,这在其名称中得到了体现。 但是随着php社区的流行,Laradock开始支持其他php项目:Symfony,CodeIgniter,WordPress,Drupal。 该项目非常受欢迎,得到了积极的支持和开发:

图片

Laradock是一组预配置的独立Docker映像,您可以根据项目的要求安装它们。 有据可查,非常易于使用。 要启动组件,我们只需列出它们:

docker-compose up apache2 php-fpm mysql phpmyadmin 



 docker-compose up nginx php-fpm mariadb adminer 

注意 :无需显式指定php-fpm,因为当php-fpm容器Web服务器启动时,容器会自动启动。

该存储库有48个以上的容器,其中包括:

  • 数据库 :MySQL,MariaDB,Percona,MongoDB,MSSQL,PostgreSQL
  • 数据库管理 :PhpMyAdmin,管理员,PgAdmin
  • Web服务器 :nginx,Apache2,Caddy
  • PHP编译器 :PHP FPM,HHVM
  • 杂项 :硒,詹金斯,ElasticSearch,Kibana,Gitlab,Mailhog,MailDev,Laravel Echo,Phalcon
  • 工具 :PHP CLI,Composer,Git,Linuxbrew,Node,V8JS,Gulp,SQLite,xDebug,Envoy,Deployer,Vim,Yarn,Drush

要求和初始条件


您将需要:

  • 吉特
  • 码头工人
以及将在其中执行命令的控制台。 Docker网站提供了有关针对不同平台进行安装的全面文档(链接也位于本文结尾)。 如果尚未安装git,请按照官方网站上的说明进行操作。

Git仓库架构:主项目和Laradock


Laradock可以使用两种版本:

  • 每个项目都有单独的laradock
  • 一拉多项目

在第一种情况下,目录结构将如下所示:

图片

在第二个中,像这样:

图片

我们始终使用第一个选项:一个项目-一个laradock。 正是这种方法为一个项目提供了灵活性和独立性。

第二个重要问题是:创建一个公共存储库还是两个独立的存储库? 换句话说,我是否需要在项目中将laradock文件添加到主存储库中? 答案是必要的,但要以主存储库的子模块形式出现。 Docker环境是项目的辅助部分,并非总是必需的。 例如,在暂存和生产服务器上,则没有必要。 当您使用git进行部署时,环境文件将无法到达那里。

环境目录的名称


默认情况下,容器名称使用当前目录名称作为后缀:laradock_nginx_1,laradock_mysql_1等。 为避免卷中的数据混淆,环境需要唯一的目录名。 如果您坚持我们选择的方案,这很容易实现:将项目名称添加到具有环境的目录名称中,例如:

  • 拉拉多克
  • 拉达克-proj1
  • 拉拉德莫巴普

也就是前缀“ laradock”和项目名称(通过连字符)。

一站式启动


我们从哪里开始启动网站?

正如我们在第三章中提到的那样,我们使用Laradoc创建环境。
启动过程包括配置环境和laravel应用程序的步骤。

项目设定


Laradoc包含一个示例环境配置文件。 我们为我们的项目创建一个副本。

 cp env-example .env 

.env选项非常明显。 在参数中,如果我们在项目中使用数据库,则设置数据库访问权限,电子邮件参数,对第三方服务的访问权限。

启动和停止环境应用程序是通过docker-compose命令完成的

 docker-compose up 



 docker-compose stop 

如有必要,您可以在启动命令中调用必要服务的下载。 例如,将以这种方式加载三个附加服务:

 docker-compose up -d nginx percona adminer 

您可以在单独的Shell脚本中删除此命令,从而不必每次都手动输入该命令。

该启动脚本可以称为“ start.sh”,或您喜欢的任何名称:

 #!/usr/bin/env bash docker-compose up -d nginx percona adminer; 

服务停止脚本可以称为“ stop.sh”或“ down.sh”:

 #!/usr/bin/env bash docker-compose stop; 

图片

项目初始化


切换到容器环境是通过执行

 docker-compose exec --user=laradock workspace bash 

部署错误


在Linux环境中安装Laradoc时,可能会发生文件权限问题。

在这种情况下,文件的所有者可能有误,或者访问权限不足。

症状 :当您尝试使用docker-compose up命令启动环境或使用docker-compose exec ...命令进入容器时,如上例所示,错误类似于
/ var / www / vendor不存在,无法创建
流或文件“ /var/www/storage/logs/laravel.log”无法打开:打开流失败:权限被拒绝
错误的原因是,在docker环境配置示例中,用户ID和用户组是硬编码的,默认分别为1000和1000。

如果在我们的unix系统中,这些ID已被其他实体占用,那么您需要手动编辑配置。

纠错程序


检查目录中的用户和组:

 ls -la /var/www 

文件和目录所有者(用户和用户组)必须是laradock laradock。

如果用数字(1001:1001、1001:13002和类似的组合)指示所有者和组,而不是laradock:laradock,则需要对设置文件进行更改。

如果您的用户标识和用户组(/ etc / passwd,/ etc / group)与指定的不匹配,那么为了正确操作,您需要对以下文件进行更改:

/ laradock / php-fpm / Dockerfile *,在行中

RUN usermod -u 1000 www-data

用用户ID替换1000

/laradock/.env行

WORKSPACE_PUID = 1000
WORKSPACE_PGID = 1000

WORKSPACE_PUID-指定您的用户ID,WORKSPACE_PGID-用户组ID

/ laradock /工作区/ Dockerfile *,按行

ARG PUID = 10315
ARG PGID = 10004

PUID-用户ID,PGID-用户组ID

进行更改后,再次重建工作区和php-fpm,然后启动容器:

 docker-compose build workspace php-fpm 

如果遇到此类问题,则需要检查对Laravel框架目录的访问权限。 为需要写权限的目录设置权限:

 sudo chgrp -R www-data storage bootstrap/cache; sudo chmod -R ug+rwx storage bootstrap/cache 

SSL证书和https


您的生产站点很可能会根据安全协议运行。 在https上进行本地开发很有意义。 这并不是很困难,您需要SSL证书和小的设置。 如何颁发自签名SSL证书中对本文进行了详细描述。

运行多个站点


因此,所有项目均按照“一个Laradock-一个项目”计划工作。 但是一个项目不一定是一个站点。 有时您需要同时运行多个站点,因为它们将彼此交互。

在这种情况下,两个laradock不能同时启动,因为它们中的每个启动了一个侦听端口80的Web服务器-我们发生冲突。 但是我们可以访问nginx配置文件,让我们对其进行配置。

但首先,请注意有关体系结构和git存储库的说明。 对于多个站点,我们使用第二个选项中的目录结构:

图片

带有laradock的git存储库不再是另一个存储库的子模块,而是变得完全独立。

将以nginx为例显示Web服务器配置。 在laradock目录中,转到nginx / sites。 我们看到default.conf和几个* .conf.example文件。 基于default.conf或示例文件,我们为站点创建配置。

注意文件根目录。 默认情况下,root指令如下所示:

 root /var/www/public; 

但应如下所示:

 root /var/www/site-1/public; root /var/www/site-2/public; 

重要!
看一下该目录中.gitignore的内容。 除default.conf外的所有* .conf文件都将被忽略。 必须将创建的文件添加到异常中,即不要忽略它们。
配置crontab,以便laravel调度程序可以正常工作。 为此,请在工作区/ crontab / laradock文件中添加路径:

 * * * * * laradock /usr/bin/php /var/www/site-1/artisan schedule:run >> /dev/null 2>&1 * * * * * laradock /usr/bin/php /var/www/site-2/artisan schedule:run >> /dev/null 2>&1 

为了使容器内的站点成功通信,请添加别名。 在docker-compose.yml文件中,找到该部分

 ### NGINX Server ### 

并为每个域添加一个别名:

图片

这是运行具有多个域的项目所需要做的全部工作。 在本文之外,仍然存在为多个域组织https的问题。 类似于上一节中描述的一个域的ssl组织。 如果您有任何困难,请添加评论,我将回答它或在另一篇文章中描述这些功能。

附加功能


在Docker环境中,可以配置所需的应用程序。 Laradoc的基本配置已经包括应用程序包:

Web应用服务器球童Apache2
Web应用程序缓存Nginx,光油
数据库和缓存服务Mongo,Redis,Mssql,Mysql,Percona,Mariadb,Elasticsearch,Memcached,Redis,RethinkDb,Aerospike
Web到数据库的界面管理员,PhpMyAdmin
负载均衡器灭螺
编程,shell和框架PHP,Python,Symfony,Laravel,节点
实用工具PHP,Python,Symfony,Laravel,节点
包装经理纱线作曲家
测试工具詹金斯
应用程序基础结构配置工具地貌

简要考虑最常提及的应用程序。

Rabbitmq

应用程序之间的消息传递机制。 此程序包的开发人员确定其目的如下:“队列管理器”,“消息代理”或“消息排队”。

一条消息可以包含任何数据集。

在使用队列管理器的情况下,将保存来自一个应用程序(发件人)的消息,直到另一个应用程序(收件人)连接并从队列中提取(接收)消息为止。

雷迪斯

在RAM中创建数据缓存。 它也可以与数据库服务器一起用作数据仓库或替换它。

Redis支持字符串,列表,集合,有序集合和哈希表。
萝卜的主要缺点是在清理RAM,重新引导OS或关闭设备时丢失数据。 萝卜开发人员设想了类似的情况:在AOF(仅附加文件)模式下,数据每秒被添加到磁盘文件中。

萝卜的主要优点是可以以最快的速度访问数据,并且访问RAM的速度更快。

物质链接


拉拉韦尔

码头工人

拉拉多克

Laravel宅基地

“如何颁发自签名SSL证书并使浏览器信任它”

Docker + Laravel =

结论


选择Laravel + Docker进行Web开发,我们获得了最有价值的奖项:时间。

在WAMP或LAMP中的开发场景之后,我们不得不花时间
无用,无处。

WAMP和LAMP都要求php开发人员在与Web开发不直接相关的领域具有一定水平的技能:配置Web服务器,配置php参数等。

一旦创建了整个项目环境,使用Laradoc可使我们在最短的时间内将其部署到新的工作环境中。 马上开始工作。

总之,我们注意到使用Laradoc的好处:

  • 每个工作场所的统一基础架构:Web服务器,sql服务器,一组框架和库;
  • 合理利用工作时间;
  • 新开发者快速进入该项目。

在评论中写下您的团队如何与环境合作,使用何种工具和方法。

Source: https://habr.com/ru/post/zh-CN439346/


All Articles