Mac使用dinghy和laradock搭建php執行環境

tianlai發表於2019-02-16

背景

每次更換一個工作用的電腦,都需要很長的時間來搭建本地的執行環境。有時候,為了安裝一個擴充套件會折騰半天,而且可能需要安裝多個版本的 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。

相關文章