背景每次换一台工作电脑,本地运行环境搭建都需要很长时间。有时安装一个扩展需要很长时间,可能需要安装多个版本的php。有人说集成运行环境不太好,一下子搞定所有需求。是的,对于初学者来说,使用集成包就足够了。但是,集成环境包不容易满足定制化的需求。比如某个扩展没有,还得手动编译安装,这种方式有点太low了。mac的话需要先卸载自带的php,再用php安装器管理多个版本,可能会对本地系统造成影响。本篇博客主要为大家带来使用docker搭建本地运行环境。Docker号称一次构建,随处运行,也可以用于生产环境。当你换了一台电脑,从网上下载自己的配置文件,剩下的就是网速和时间的问题了。喝杯咖啡,环境就准备好了。安装docker和安装HomebrewHomebrew可以说是填补了mac包管理工具的空缺,而且安装起来非常简单。/usr/bin/ruby-e"$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/master/install)"安装dockerbrewinstalldockerdocker-machinedocker-composeDocker和传统虚拟机阶段中相比之下,Docker运行在进程的命名空间中,不提供操作系统层的抽象,直接使用宿主机的资源。docker-machine有点像一个虚拟机,Docker可以在其中运行。由于Mac文件系统的限制,在MacOS上运行Docker会有明显的延迟,这也是后面会使用小艇来加速的原因。单个docker-compose容器只能提供相对单一的服务,通过docker-compose管理容器,定义容器之间的依赖关系等,满足应用层面的需求。官方文档或者可以通过DockerForMac的安装包安装,也很简单。使用laradocklaradocklaradock由docker-compose构建,旨在提供一个方便的laravel运行环境。通过适当的修改,可以方便的作为php开发环境使用。安装gitclonehttps://github.com/laradock/laradock.git介绍进入laradock的目录,看到有很多文件夹和文件,其中最重要的是env-example、docker-compose.yml和各种目录Dockerfile文件。env-example的环境配置文件的一个例子,后两者的很多变量都定义在这个文件中。第一次运行启动docker,进入laradock目录,执行cpenv-example.envdocker-composeup-dmysqlredisnginx#启动相关容器docker-composeps#查看进程docker-composeexec容器名sh#进入相关containers通过ps可以看到启动了6个进程,分别是application、workspace、php-fpm、nginx、redis、mysql。其中php-fpm是nginx依赖的容器,application代表整个应用,workspace是主要用来执行php-cli命令的容器,比如artisan、composer、phpunit等,例如目录关系配置文件如下:/dev-laradock-code-project-1-project-2打开.env文件,将APPLICATION的值修改为工程文件的相对路径,APPLICATION=../code/这个路径会被映射到worksapce容器的/var/www/目录下,(注意配置文件的任何修改都需要执行docker-composebuildcontainername来重建相关容器)。进入nginx/sites目录,执行cpproject-1.conf.exampleproject-1.conf,修改docker使其可以挂载/dev目录,执行docker-composerestartnginx重启nginx,绑定host127.0.0.1projectlocally-1.dev,在浏览器中输入http://project-1.dev,应该可以看到效果。编译你自己的扩展。预定义扩展由一般扩展作者提供。在.env中找到相关的配置选项来打开或关闭它们。未定义的扩展如果我们需要的扩展没有定义,我们需要手工编译扩展。比如我们的php-cli需要zmq扩展,首先打开.env文件,在WORKSPACE下添加WORKSPACE_INSTALL_ZMP=true,然后打开docker_composer.yml,在workspace的args中添加INSTALL_ZMQ=${WORKSPACE_INSTALL_ZMQ},保存,打开workspace/Dockerfile-71(如果我用的是php7.1),找个合适的地方添加ARGINSTALL_ZMQ=falseENVINSTALL_ZMQ${INSTALL_ZMQ}RUNif[${INSTALL_ZMQ}=true];然后\#安装ZMQ扩展RUNapt-get-yqqinstallwget&&\wgethttps://github.com/zeromq/libzmq/releases/download/v4.2.1/zeromq-4.2.1.tar.gz&&\tar-zxvfzeromq-4.2.1.tar.gz&&\apt-get-yqq删除wget&&\cdzeromq-4.2.1&&\./configure&&\make&&makeinstall&&\peclinstallzmq-beta&&\echo"扩展=zmq.so">>/etc/php/7.1/cli/conf.d/40-zmq.ini&&\cd..;;保存fi后,重新编译启动workspace,进入容器后执行php-m,发现扩展安装好了。使用小艇加速macdinghy主要是用来加速mac上的docker虚拟机。安装brewtapcodekitchen/dinghy&&brewinstalldinghy来安装虚拟机xhyve、virtualbox、vmwarefusion和parallelsdesktop。以parallelsdesktop为例。只有vmware支持的比较好,其他三个都需要安装驱动。让我们以平行线为例。安装driverbrewinstalldocker-machine-parallels创建虚拟机dinghycreate--providerparallels创建后可以看到都在运行。您可以根据需要添加相关的环境变量,以便您在启动docker时可以找到小艇。同时还要加上挂载目录的配置:exportDINGHY_HOST_MOUNT_DIR=/dev/exportDINGHY_GUEST_MOUNT_DIR=/dev/配置dns和http-proxy运行docker-composeup-dnginx时会发现启动失败,提示80和443被占用。它被默认启用的http-proxy占用。小艇很有趣。开启dnsrevole后,所有以.docker为二级域名的域名,默认都会由小艇的dns解析。这可以修改。我们打开$HOME/.dinghy/preferences.yml,在下面添加:dinghy_domain:dev,凡是.dev为二级域名的域名,都会被小艇解析。并通过http-proxy代理访问其他容器(如果本地绑定了host需要去掉)。下面开始配置:打开docker-compose.yml找到nginx的配置选项,去掉80和443端口的映射。添加新的配置项环境:-VIRTUAL_HOST=${DINGHY_VIRTUAL_HOST}然后在.env中添加DINGHY_VIRTUAL_HOST=project-1.dev多个域名可以用逗号分隔,重建nginx,docker-compose构建nginx,然后重启小艇。
