背景

每次更换一个工作用的电脑,都需要很长的时间来搭建本地的运行环境。有时候,为了安装一个扩展会折腾半天,而且可能需要安装多个版本的 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

    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 ,本地绑定 host 127.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

  • dinghy

    主要用来在 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。


tianlai
320 声望2 粉丝