背景
每次更换一个工作用的电脑,都需要很长的时间来搭建本地的运行环境。有时候,为了安装一个扩展会折腾半天,而且可能需要安装多个版本的 php。有人说,集成运行环境不是很好嘛,一次搞定所有的要求。是的,对于新手来说,使用集成包就足够了。但是集成境包不容易满足定制化的需求,比如某个扩展没有,还是得手动编译安装,而且这种方式有点太 low 了。 对于 mac 来说,需要卸载自带的 php ,然后使用 php 安装器来管理多个版本,这可能会影响本地系统。
这篇博客主要跟大家带来使用 docker 来搭建本地运行环境,docker 号称 build once, run anywhere,用于生产环境也可以哦。等你换一个电脑,从网上 down 下来自己的配置文件,剩下就是网速和时间的问题了。喝一杯咖啡,环境就搭建好了。
安装docker
安装Homebrew
Homebrew 可以说填补了 mac 包管理工具的空缺,安装起来非常简单。
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安装 docker
brew install docker docker-machine docker-compose
Docker 和传统意义的虚拟机相比,Docker 运行在进程的命名空间内,并没有提供操作系统层的抽象,直接使用主机的资源。
docker-machine 有点类似虚拟机了,Docker 可以运行在其中。由于 Mac 文件系统的限制,Docker 运行在 Mac OS 上有明显延迟,这也就是后面要用 dinghy 加速的原因。
docker-compose 单独的容器只可以提供比较单一的服务,通过 docker-compose 来管理容器,定义容器之间的依赖关系等,来满足应用级别的需要。
官方文档或者可以通过 Docker For Mac 的安装包进行安装,也很简单。
使用laradock
laradock 是通过 docker-compose 来构建的,旨在方便地提供 laravel 的运行环境。做适当的修改可以很方便的当做 php 的开发环境。
安装
git clone https://github.com/laradock/laradock.git
简介
进入到 laradock 的目录,看到有很多文件夹和文件,其中最重要的就是 env-example,docker-compose.yml以及各个目录里的 Dockerfile 文件了。env-example 的环境配置文件的样例,后两者有很多变量都是在这个文件中定义的。
初运行
启动 docker,进入到 laradock 的目录,执行
cp env-example .env docker-compose up -d mysql redis nginx # 启动相关容器 docker-compose ps # 查看进程 docker-compose exec 容器名字 sh # 进入相关容器
通过ps可以看到有6个进程启动了,分别是 application, workspace, php-fpm, nginx, redis, mysql。 其中 php-fpm 是 nginx 所依赖的容器, appliction 代表整个应用,workspace 是主要用来执行 php-cli 命令的容器,例如 artisan, composer, phpunit等。
配置
例如 文件的目录关系如下:
/dev - laradock - code - project-1 - project-2
打开 .env 文件,修改 APPLICATION 的值为项目文件的相对路径,
APPLICATION=../code/
这个路径会映射到 worksapce 容器的 /var/www/ 目录上,(注意任何修改配置文件都需要执行docker-compose build 容器名字
重新构建相关容器)。进入nginx/sites
目录,执行cp project-1.conf.example project-1.conf
,修改 docker 让它可以挂载 /dev 目录后,执行docker-compose restart nginx
重启 nginx ,本地绑定 host127.0.0.1 project-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 (假如我们用的是 php 7.1),找一个合适的位置添加ARG INSTALL_ZMQ=false ENV INSTALL_ZMQ ${INSTALL_ZMQ} RUN if [ ${INSTALL_ZMQ} = true ]; then \ # Install the ZMQ extension RUN apt-get -yqq install wget && \ wget https://github.com/zeromq/libzmq/releases/download/v4.2.1/zeromq-4.2.1.tar.gz && \ tar -zxvf zeromq-4.2.1.tar.gz && \ apt-get -yqq remove wget && \ cd zeromq-4.2.1 && \ ./configure && \ make && make install && \ pecl install zmq-beta && \ echo "extension=zmq.so" >> /etc/php/7.1/cli/conf.d/40-zmq.ini && \ cd .. ; ;fi
保存后,重新编译启动 workspace ,进入容器后执行
php -m
发现扩展装上了。
使用dinghy加速mac
主要用来在 MAC 上加速 docker 的虚拟机。
安装
brew tap codekitchen/dinghy && brew install dinghy
安装虚拟机
xhyve, virtualbox, vmware fusion, parallels desktop 这四个均可,以parallels desktop 为例。只有 vmware 支持的比较好,其他三个都需要安装驱动。下面以 parallels 为例。
安装 driver
brew install docker-machine-parallels
创建虚拟机
dinghy create --provider parallels
成创建后可以看到都是 running 的状态,可以按要求加入相关环境变量,以便启动 docker 的时候可以找到 dinghy。同时还应该加上挂载目录的配置:export DINGHY_HOST_MOUNT_DIR=/dev/ export DINGHY_GUEST_MOUNT_DIR=/dev/
配置 dns 和 http-proxy
当运行
docker-compose up -d nginx
的时候,你会发现启动失败,提示 80 和 443 被占用了。是 http-proxy 占用了,这个是默认被打开的。dinghy 很有趣,当打开 dns revole 的时候,默认所有的 .docker 为二级域名的域名都会被 dinghy 的 dns 解析,这个可以被修改,我们打开$HOME/.dinghy/preferences.yml
,在下面加入:dinghy_domain: dev
,所有以 .dev 为二级域名的域名都会被 dinghy 解析。并通过 http-proxy 代理来访问其它容器(如果本地绑定了 host 需要去掉)。下面开始配置:
打开 docker-compose.yml 找到 nginx 的配置选项,去掉 80 和 443 端口的映射。添加新的配置项environment: - VIRTUAL_HOST=${DINGHY_VIRTUAL_HOST}
然后再 .env 中加入
DINGHY_VIRTUAL_HOST=project-1.dev
多个域名可以用逗号隔开,重新构建 nginx,docker-compose build nginx
,然后重启 dinghy。