
这篇文章是关于什么的
本文将讨论我们使用Docker快速配置可扩展的dev环境进行Web开发的经验。 我将简要讨论我们面临的任务以及解决这些问题所选择的工具。 本文标记有教程图标,因为您会在其中找到有关部署环境的说明。 与类似的文章(文章末尾的链接)相比,技术细节更少,示例更多。
我们面临什么任务?
碰巧一个新的开发人员连接到一个现有的团队。 这样他就可以开始执行任务(换句话说,编写代码并检查他的工作),而这不足以获取源代码。 您需要一个包含Web服务器,php编译器和数据库的环境。 这是最小设置。 根据项目的不同,环境可能包括:
- NoSQL
- 队列服务器
- 全文搜索引擎;
- 缓存解决方案;
- 选择器;
- 有用的开发人员工具
所有这些都必须在开发人员本地安装,并且与其他团队成员的版本相同。 这里有困难:
- 安装后,需要进行配置;
- 该软件已经安装,但版本不同。
- 很久了
开发人员在不同平台(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文件添加到主存储库中? 答案是必要的,但要以主存储库的子模块形式出现。 Docker环境是项目的辅助部分,并非总是必需的。 例如,在暂存和生产服务器上,则没有必要。 当您使用git进行部署时,环境文件将无法到达那里。
环境目录的名称
默认情况下,容器名称使用当前目录名称作为后缀:laradock_nginx_1,laradock_mysql_1等。 为避免卷中的数据混淆,环境需要唯一的目录名。 如果您坚持我们选择的方案,这很容易实现:将项目名称添加到具有环境的目录名称中,例如:
也就是前缀“ 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”,或您喜欢的任何名称:
服务停止脚本可以称为“ stop.sh”或“ down.sh”:

项目初始化
切换到容器环境是通过执行
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服务器,一组框架和库;
- 合理利用工作时间;
- 新开发者快速进入该项目。
在评论中写下您的团队如何与环境合作,使用何种工具和方法。