在这篇文章中我们将通过Docker在个人本地电脑上构建一个快速、轻量级、不依赖本地电脑所安装的任何开拓套件的可复制的Laravel和Vue项目的开拓环境(开拓环境的所有依赖都安装在Docker构建容器里),加入Vue只是由于有的项目里会在Laravel项目中利用Vue做前后端分离开拓,开拓环境中须要安装前端开拓须要的工具集,当然前后端也可以分成两个项目开拓,这个话题不在本篇文章的谈论范围内。
以是我们的目标是:
不在本地安装Mamp/Wamp这样的软件不该用类似Vagrant这样的虚拟机不在本地电脑全局安装PHP开拓所须要的工具集不在本地电脑全局安装前端开拓所须要的工具集不在本地电脑全局安装Mysql和Nginx开始前你须要先去安装一个Docker客户端,Docker的官网中有详细的安装方法。
第一步:获取Laravel的源码包
由于我们电脑上不安装Composer,以是就不能利用Composer来创建Laravel项目了, 这里我利用cURL直接从github高下载了最新的Laravel源码包,你也可以利用wget或者git clone 来获取源码包。
上面的命令在curl下载完源码包后会解压源码压缩包,解压完成后在把源码压缩包v5.5.0.tar.gz删掉,实行完后你会看到一个laravel-5.5.0的项目目录。
第二步:添加docker-compose.yml
在项目中创建docker-compose.yml文件。
Compose 项目是 Docker 官方的开源项目,卖力实现对 Docker 容器集群的快速编排。我们知道利用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的运用容器。在这里我们会用到四个容器分别将PHP、Mysql、Nginx放在四个不同的容器中,通过compose`将四个运用容器关联到一起组成项目。
编排文件的开头如下:
在编排文件中,把每个容器叫做一个做事,services下定义全体运用中用到的所有做事(即容器)。
App做事
APP做事的容器将实行我们项目中的代码。
Notes:
我们利用app.dockerfile这个镜像文件来构建我们的App容器,在镜像文件中我们会对项目中用到的PHP模块镜像配置,也会额外安装NPM用来构建前端代码。working_dir: /var/www把事情目录设置成了/var/www,在容器中项目代码将会被放在/var/www目录下面,包括利用docker exec app实行的命令也都因此/var/www为当前事情目录的。volumes是容器内数据卷所挂载路径设置,在这里我们只定义一个数据卷,把宿主机项目目录挂到在容器中的/var/www上,这样我们在本地电脑对项目代码进行的变动就会立时同步到容器中去,反过来也是一样,容器中对代码做的变动也会及时反馈到本地电脑的项目中。environment设置环境变量名,这里我们设置了DB_PORT和DB_HOST 这样就不用修正项目中的.env文件里关于这两项的值了,当然任何你须要在开拓环境单独设置的环境变量都可以写到这里,Laravel读取配置利用的DotEnv会检测是否系统有指定环境变量的设置,有的话就不会在去读取.env文件了。现在我们须要创建上面build环节中提到的app.dockerfile这个文件了,详细内容如下:
图图图??????
Notes:
我在这里先将NPM和Composer装到了app容器中,由于在开拓时常常须要实行他们,如果发布莅临盆环境,一样平常是利用单独的composer对项目代码进行构建而不是放在运行运用的容器里,容器的核心思想之一便是保持单一,这样才能做到快速增加相同角色的容器。Web做事
接下来,我们须要配置一个Web做事器用,我们把这个容器在编排文件中命名成web
Notes:
volumes_from用来复用在app做事中定义的数据卷路径通过ports将本地电脑的8080端口映射到web容器的80端口,这样在开拓环境中我们就不用设置hosts文件,直接通过IP加端口就能访问做事了。Web做事器选用nginx,以是我们须要用一个nginx镜像文件来构建这个容器,在这之前我们须要在nginx镜像的根本上再设置一下项目中用到的vhost,以是我们须要一个web.dockerfile文件,它的定义如下:根据镜像文件的定义,我们把项目中的vhost.conf复制到了容器的/etc/nginx/conf.d/default.conf中,这样基本的nginx配置就配置好了,vhost.conf中的定义如下:
Notes:
由于是开拓环境我们就只进行最大略的配置,不做调优考虑了。fastcgi_pass app:9000; nginx将对PHP的要求通过fastcgi通报给了app做事的9000端口,docker-compose会自动把services中定义的容器做事连接起来,各个做事相互之间利用做事名称引用。Mysql做事
接下来我们将配置Mysql做事,与上面两个做事有点不一样的是,在PHP-FPM和Nginx的容器中,我们配置本地电脑的文件可以同步到容器中供容器访问,这让我们开拓时对文件作的变动能够快速的在容器中得到反馈加快我们的开拓过程。但是在数据库容器中我们希望容器中创建的文件能够持久化(默认容器销毁时,容器内创建的文件也会被销毁),我们可以通过Docker的数据卷来实现上述功能,只不过这次不用再把本地电脑的文件挂在到数据卷上了,Docker客户端会管理创建的数据卷的在本地电脑上详细存储的位置。
下面是编排文件中对database做事的设置
Notes:
在文件的最下面我们通过volumes命令创建了一个名为dbdata的数据卷(dbdata后面的冒号是故意写上去的,这是YML文件的一个语法限定,不用太关心)定义完数据卷后,在上面我们利用<name>:<dir>的格式,关照Docker,将dbdata数据卷挂在到容器中的/var/lib/mysql目录上environments中设置的是Mysql的docker镜像须要的四个必要参数。ports端口映命中,我们将本地电脑的33061端口映射到容器的3306端口,这样我们就能通过电脑上的数据库工具连接到docker内的Mysql了。将所有做事编排到一起
下面是完全的docker-compose.yml文件,通过编排文件我们将三个运用容器关联在一起组成了项目的做事端
version: '2'services: # The Application app: build: context: ./ dockerfile: app.dockerfile working_dir: /var/www volumes: - ./:/var/www environment: - \"大众DB_PORT=3306\"大众 - \"大众DB_HOST=database\"大众 # The Web Server web: build: context: ./ dockerfile: web.dockerfile working_dir: /var/www volumes_from: - app ports: - 8080:80 # The Database database: image: mysql:5.6 volumes: - dbdata:/var/lib/mysql environment: - \公众MYSQL_DATABASE=homestead\"大众 - \公众MYSQL_USER=homestead\"大众 - \"大众MYSQL_PASSWORD=secret\公众 - \公众MYSQL_ROOT_PASSWORD=secret\"大众 ports: - \公众33061:3306\"大众volumes: dbdata:
启动做事
按照上面的步骤配置好编排文件还有指定的docker镜像文件后,我们就可以通过下面的命令启动做事了,实行完后会启动上面文件里定义的三个做事。
docker-compose up -d
第一次启动时,由于docker客户端要下载上面提到的三个镜像并且构建做事以是启动速率会慢一些,等到下载完镜像并构建完成后,往后的启动都会非常快。
初始化Laravel项目
启动完做事后我们可以初始化Laravel项目了,步骤跟官方文档里先容的一样,但是须要在启动的app做事的容器里实行:
Notes:
docker-compose exec 将命令发送到指定的容器中去实行app是定义在docker-compose.yml中的一个做事,它是一个运行着php-fpm的容器php artisan migrate 是要在容器里实行的命令查看nginx日志的方法:
docker ps 找到nginx做事的container iddocker exec -it <contianer id> /bin/bash 进入nginx容器nginx日志的详细路径请查看项目中的vhost.conf实行完上面的命令后你就能通过http://127.0.0.1:8080/访问到项目啦。
在我的Github gist有一组参考文件方便同学们参考 https://gist.github.com/kevinyan815/fa0760902d29f19a4213b4a16fe0501b
gist里的文件轻微旧一些,后来在利用的过程中又加入些新的PHP模块和Node,之前composer也单独放到了一个容器中,不过相信聪明的你看到这里该当已经会根据需求变动这些文件啦。
原文链接:https://segmentfault.com/a/1190000018372614
本文作者:KevinYan