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