宝哥软件园

基于Docker构建PHP开发环境的详细教程

编辑:宝哥软件园 来源:互联网 时间:2021-09-09

如今,许多开发人员使用游民来管理他们的虚拟机开发环境。流浪确实很酷,但也有很多缺点(最重要的是占用资源太多)。随着容器技术、Docker和更多类似Docker的技术的出现,解决这个问题变得很容易。放弃

由于boot2docker的工作方式,本文描述的方法可能无法在您的环境中正常工作。如果需要在非Linux环境下共享文件夹到Docker容器,需要注意更多额外的细节。我会写一篇文章介绍实际问题。什么是好的开发环境

首先,我们需要知道什么是好的开发环境。对我来说,一个好的开发环境需要具备以下特征:

可以随意使用。我必须可以自由删除和创建新的环境。快速开始。当我想使用它时,它可以立即使用。易于更新。在我们这个行业,事情的变化非常快,这一定让我很容易将自己的开发环境更新到新的软件版本。Docker支持这些功能,甚至更多。您几乎可以立即销毁和重建容器,而更新环境只需要重建您当前使用的映像。什么是PHP开发环境

目前Web应用复杂,PHP开发环境需要很多东西。为了确保环境的简单性,需要进行各种限制。我们使用Nginx、PHP5-FPM和MySQL来运行Synmfony项目。

宠物和牛

我们要讨论的另一个关键点是,我们应该在多容器还是单容器中部署开发环境。这两种方法都有各自的优势:

单个容器易于分发和维护。因为它们是独立的,所以一切都在同一个容器中运行,这就像一个虚拟机。但是这也意味着当你想要升级某个东西(比如PHP的新版本)的时候,你需要重新构建整个容器。添加组件时,多个容器可以提供更好的模块化。因为每个容器都包含堆栈的一部分:Web、PHP、MySQL等。每个服务都可以单独扩展或添加,无需重新构建所有内容。因为我比较懒,需要在笔记本里放点别的东西,这里只介绍单容器的方法。初始化项目

首先要做的是初始化一个新的Symfony项目。推荐的方法是使用composer的create-project命令。Composer本来可以安装在工作站上,但是太简单了。这次我们通过Docker使用它。之前发表过一篇关于docker命令的文章:制作Docker命令(好吧,我撒谎了,这篇文章是我写的,然后我觉得独立会更好)。

反正你可以看。接下来,如果没有composer命令,您可以创建自己的composer别名。

$ alias composer=' docker run-I-t-v $ pwd :/srvu百慕大/composer '现在您可以初始化Symfony项目:

$ composer create-project symfony/framework-standard-edition有些项目太棒了!让我们做一些真正的工作。

容器

构建一个运行标准Symfony项目的自给自足的容器是相当容易的,只需安装常用的Nginx、PHP5-FPM和MySQL-Server,然后抛出准备好的Nginx虚拟主机配置文件,再复制一些配置文件即可。

这个容器的源代码可以在GitHub上的ubermuda/docker-symfony仓库中找到。Dockerfile是Docker用来构建映像的配置文件。让我们看看:

FROM DEBIAN : twishenv DEBIAN _ FRONTEND非交互运行apt-get update-Yrun apt-get install-y nginx PHP 5-fpm PHP 5-mysqlnd PHP 5-CLI MySQL-server Supervisor run sed-e ' s/;daemonize=yes/daemonize=no/'-I/etc/PHP 5/fpm/PHP-fpm。会议-e的/听着主人/听着。owner/'-I/etc/PHP 5/fpm/pool。d/www .会议-e的/听着分组/听。group/'-I/etc/PHP 5/fpm/pool。d/www .confrun echo “ n请关闭;”/etc/nginx/nginx。confadd vhost。conf/etc/nginx/sites-可用/默认添加主管。conf/etc/supervisor。糖膏剂d/主管。confadd init。sh/init。shexpose 80 3306 VOLUME['/SRV ']WORKSDIR/SRvcmd['/usr/bin/supervisor rd ']我们通过扩展德比安:喘息这个基础镜像开始,然后通过一系列的一项Linux操作系统指令命令来配置Nginx和PHP5-FPM。

复制代码代码如下: RUN sed-e s/;daemonize=yes/daemonize=no/'-I/etc/PHP 5/fpm/PHP-fpm。会议-e的/听着主人/听着。owner/'-I/etc/PHP 5/fpm/pool。d/www .会议-e的/听着分组/听。group/'-I/etc/PHP 5/fpm/pool。d/www .' confrun echo ' n一次关闭;/etc/nginx/nginx.conf

这里我们要做两件事。首先配置PHP5-FPM和Nginx让他们在前台运行以便监督可以追踪到他们。然后,配置PHP5-FPM以指定的用户运行网络服务器,并处理好文件权限。

接下来需要安装一组配置文件,首先是Nginx的虚拟主机配置文件vhost.conf:

服务器{ listen 80 server _ name _ access _ log/var/log/nginx/access。日志;error _ log/var/log/nginx/error。日志;root/SRV/web;index app _ dev . ph plocation/{ try _ files $ uri $ uri//app _ dev。PHP?$ query _ string}地点~ [^/].PHP(/| $){ fastcgi _ pass UNIX :/var/run/PHP 5-fpm。袜子;包括fastcgi _ params}}因为我们不需要域名,所以把服务器名设成了_(有点像实际抽取与汇报语言的$_占位符变量), 并配置根目录(文档根)为/svr/web,我们会把应用程序部署在/srv下,剩下的就是标准的Mginx PHP5-FPM配置。

因为一个容器每次只能运行一个程序,我们需要supervisord(或者任何别的进程管理器,不过我比较中意supervisord)。幸运的是,这个进程管理器会产生我们需要的所有进程!下面是一小段监督的配置:

[supervisord]nodaemon=true[program : ninx]command=/usr/sbin/nginx[program : PHP 5-fpm]command=/usr/sbin/PHP 5-fpm[program : MySQL]command=/usr/bin/MySQL _ safe[program : init]command=/init。sha outestart=false redirect _ stderr=true redirect _ stdout=/SRV/app/log/init。日志.这里我们需要做的是定义所有的服务,加上一个特殊的程序:初始化进程,它不是一个实际的服务,而是一个独创的运行启动脚本的方式。

这个启动脚本的问题在于,它通常需要先启动某些服务。比如,你可能要初始化一些数据库表,但前提是你得先把关系型数据库跑起来,一个可能的解决办法是,在启动脚本中启动MySQL,然后初始化表,然后为了防止影响到监督的进程管理,需要停掉MySQL,最后再启动监督者。

这样的脚本看起来类似下面这样:

/etc/init。d/MySQL startapp/console doctrine : schema : update-force/etc/init。d/MySQL stop exec/usr/bin/supervisord

看起来丑爆了有木有,咱换种方式,让监督者来运行它并且永不重启。实际的初始化脚本如下:

#!/bin/BashRet=1,而[[RET-ne 0]];做睡眠1;MySQL-e ' exit '/dev/null 21;RET=$?doneDB _ NAME=$ { DB _ NAME :-symfony } MySQL admin-u root create $ DB _ NAME if[-n ' $ INIT '];然后/srv/$INITfi脚本先等待关系型数据库启动,然后根据环境变量数据库名创建数据库,默认为西蒙弗尼,然后在初始化环境变量中查找要运行的脚本,并尝试运行它。本文的结尾有说明如何使用这些环境变量。构建并运行镜像

万事俱备只欠东风。我们还要构建Symfony Docker镜像,使用码头工人建造命令:

$ CD docker-symfony $ docker build-t symfony .现在,可以使用它来运行你的Symfony工程了:

$ CD某些项目$ Docker Run-I-T-P-V $ PWD :/SRV SYMFONY让我们看看这一系列选项是什么。

-我启动交互模式,即STDIO(标准输入/输出)连接到你当前的终端。当您想要接收日志或向进程发送信号时,它非常有用。-t为容器创建一个虚拟TTY,它是-i的好朋友,通常一起使用。-P告诉Docker守护程序发布所有指定的端口,在本例中是端口80。-v $PWD:/srv将当前目录装载到容器的/srv目录中。装载目录,使其内容可用于目标装载点。现在您还记得前面提到的DB_NAME和INIT环境变量。你为什么要用它们?它们用于定制您的环境。基本上,您可以通过docker run的-e选项设置容器中的环境变量,启动脚本将获得环境变量。因此,如果您的数据库被命名为some_project_dev,您可以这样运行容器:

$ dockerrun-I-t-p-v $ pwd :/SRV-e db _ name=some _ project _ devsymfonyit环境变量甚至更强大,它允许您在启动时运行指定的脚本。例如,您有一个bin/setup脚本来运行composer install命令并设置数据库schema:

#!/bin/bash composer installapp/console doctrine : schema : update-force use-e运行它:

$ dockerrun-I-t-p -v $ pwd :/SRV -e db _ name=some _ project _ dev -e init=bin/setup注意,在docer run中可以多次使用-e选项,看起来相当酷。此外,您的启动脚本需要可执行权限(chmod x)。

现在,我们通过curl向容器发送一个请求,检查一切是否如预期的那样工作。首先,我们需要将Docker的公共端口映射到容器的80端口,并使用docker port命令:

$ Dockerport $(Dockerps-AQL 1)800 . 0 . 0 . 0:49153 Dockerps-AQL 1是一个易于使用的命令,可以轻松检索最后一个容器的id。在我们的示例中,Docker将容器的端口80映射到端口49153。让我们卷起来看看。

$ curl http://localhost :49153不允许您访问此文件。有关更多信息,请访问checkapp _ dev.php。当我们不能从本地主机访问dev co时。Symfony的默认错误消息是在进入控制器时获得的,这是正常的,因为我们不从容器内部发送curl请求,所以我们可以安全地从前端控制器web/app _ dev.php中删除这些行。

//此检查防止访问意外部署到生产服务器的调试前端控制器。//请随意删除、扩展或制作更复杂的东西。(in _ array(@ $ _ SERVER[' REMOTE _ ADDR '],array('127.0.0.1 ',' fe80:1 ',' :1 ')| | PHP _ SAPI _ name()===' CLI-SERVER '){ header(' HTTP/1.0 403禁地');退出('不允许您访问此文件。检查。basename(__FILE__)。'了解更多信息');}这些线路阻止从localhost以外的地方访问dev controller。现在,当您再次卷曲时,您可以正常工作,或者访问http://localhost:49153/:

201571105429165.png  (1554988)

更多资讯
游戏推荐
更多+