什麼是?, 工具

[DevOps] 在 MAC 上利用 Docker 快速建立 PHP+Nginx+Mysql+Memcached 開發環境!

何如在 MAC(osx) 上利用 Docker 建立 PHP+Nginx+Mysql+Memcached 開發環境?
本來我自己是利用 vagrant 建立一個虛擬主機(vm),在裡頭安裝了需多工具,當成開發環境.
但每次要抽換工具或版本總是有點麻煩....
換成 docker 除了讓環境抽換速度更快之外,使用的硬碟空間也小了不少

index :

 


Why Docker ?

為什麼要使用 docker 呢...
* 服務之間的整合快速
* 抽換快速
* 建構快速
(ps : 本篇不會詳細說明什麼是 docker,簡單記錄 docker 安裝流程)

tl;dr
最初我是利用 vagrant 建立一個虛擬主機(vm)
Laravel 5.1 裡建議使用 Homestead + Vagrant,雖然 Laravel 有 官方教學
但要對新手,一下就要認識 Homestead + Vagrant + virtual box,好像有點麻煩.... (雖然網路上教學很多)
相較之下 docker + mac 設定一次之後管理與架設就直接很多

總而言之,選擇什麼樣的開發方式因人而易
方便習慣就好了,不使用虛擬環境進行開發其實也是可行的!

 


 

MAC OS X 與 Docker

最初 docker 剛到 docker 的時候,並沒有這麼方便
需要使用 docker toolbox
docker-tool-box
透過 toolbox 還需要記得一堆指令和流程, 過程上有點麻煩,讓人感覺門檻有點高
(可是他的 logo 很可愛 )

2016-03-01 的時候 docker 官方推出了 Docker for Mac
不再使用 boot2docker
不用再額外安裝 Docker Machine
不需要 VirtualBox 來建立一個 VM,進而使用 container,可以直接建立 container 了
不用 Docker Toolbox ,不用記住一大堆指令
也不用擔心從一堆 container 找不到自己的主要工作區
也可以避免使用 docker 時出現 fat containers 的問題

 


 


進入正題 "如何在 MAC 上利用 Docker 快速建立 PHP+Nginx+Mysql+Memcached 開發環境!"...

1. 安裝 Docker 相關 APP

1-a. Dorcker for Mac (必要)- https://docs.docker.com/docker-for-mac/

docker-for-mac
選擇 stable 版本, 安裝完成後會當駐在 menu bar 上
上述連結裡,清楚說明如何安裝與測試,docker 是否安裝成功
很友善的教學,從 docker 安裝到建立一個 nginx web server
最後也教你怎麼刪掉測試後用不到的 images

 

1-b. docker-kitematic (非必要) - https://www.docker.com/products/docker-kitematic

docker-kitematic
雖然是非必要 APP,不過建議安裝,他是 GUI 介面的 容器(containers)、映像檔(image) 管理軟體
非常好用,logo 也可愛
如果上面的連結無法下載,可以試試從 Github 下載 https://github.com/docker/kitematic/releases
(或在上一步 docker 的介面中也有下載連結)

 


 

2. 建立專案目錄

建立如下的目錄架構...


.
+-- my_main_project_name/ (e.g. php_project)
    +-- 專案1/
    +-- 專案2/
    +-- database/
        +-- mysql/
        +-- postgresql/

    +-- index.php ( for domain -> localhost 用)
    +-- index.html

例圖:
project-directory
- 專案1、專案2 目錄是 git 拉下來的目錄結構,依需求建立
- index.php, index.html 只是方便測試用的
- database 是用來連結 docker 內資料庫,docker 關閉後,資料仍會存在

 


 

3. 建立 Dockerfile

3-1. 由 CLI 移動到 `my_main_project_name/專案1/` 目錄下,建立 `docker-compose.yml` 與 Dockerfiles 等相關目錄結構...

如圖:
docker-file
依照要用到的服務建立對應的檔案內容

3-2. `docker-compose.yml` 範例內容:

memcached:
  build: ./Dockerfiles/memcached
  ports:
    - 11211:11211

mysql:
  build: ./Dockerfiles/mysql
  ports:
    - 3306:3306
  volumes:
    - ../database/mysql:/var/lib/mysql/
  environment:
    MYSQL_USER: DB 使用者
    MYSQL_ROOT_PASSWORD: root 密碼
    MYSQL_PASSWORD: DB 密碼
    MYSQL_DATABASE: 預設資料庫 e.g. my_test

postgresql:
  build: ./Dockerfiles/postgresql
  ports:
    - 5432:5432
  environment:
    POSTGRES_USER: DB 使用者
    POSTGRES_PASSWORD: DB 密碼
    POSTGRES_DB: 預設資料庫
  volumes:
    - ../database/postgresql:/var/lib/postgresql/data/

workspace:
  build: ./Dockerfiles/workspace
  ports:
    - "22:22"
  volumes:
    - ../:/var/www/html/
  links:
    - memcached:memcached
    - mysql:mysql
    - postgresql:postgresql

# fpm-php55:
#   build: ./Dockerfiles/fpm-php55
#   ports:
#     - 9000:9000
#   volumes:
#     - ../:/var/www/html/
#   links:
#     - memcached:memcached
#     - mysql:mysql
#     - postgresql:postgresql

fpm-php70:
  build: ./Dockerfiles/fpm-php70
  ports:
    - 9000:9000
  volumes:
    - ../:/var/www/html/
  links:
    - memcached:memcached
    - mysql:mysql
    - postgresql:postgresql

nginx:
  build: ./Dockerfiles/nginx
  ports:
    - 80:80
  volumes:
    - ../:/var/www/html/
  links:
    #- fpm-php55:fpm
    - fpm-php70:fpm

我的專案用到, php7-fpm, php55-fpm, nginx, mysql, memcache, postgre sql 這幾個服務(service)
其中,另外開了一個 workspace 當做 作業區

ps : 詳細的 docker copmose 格式、語法可以參考官方文件
https://docs.docker.com/compose/compose-file/

 

3-3. 建立各服務 Dockerfiles,e.g. fpm-php70

Dockerfiles/fpm-php70/ 下建立 Dockerfile
Dockerfile 範例內容:


FROM php:7.0-fpm

RUN apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libmcrypt-dev \
        libpng12-dev \
        libpq-dev \
        apt-utils \
    && docker-php-ext-install -j$(nproc) mcrypt \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd

RUN apt-get update && apt-get install -y \
        libmemcached11 \
        libmemcachedutil2 \
        libmemcached-dev \
        libz-dev \
        git \
    && cd /root \
    && git clone -b php7 https://github.com/php-memcached-dev/php-memcached \
    && cd php-memcached \
    && phpize \
    && ./configure \
    && make \
    && make install \
    && cd .. \
    && rm -rf  php-memcached \
    && echo extension=memcached.so >> /usr/local/etc/php/conf.d/memcached.ini \
    && apt-get remove -y build-essential libmemcached-dev libz-dev \
    && apt-get remove -y \
        libmemcached-dev \
        libz-dev \
    && apt-get autoremove -y \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean

RUN  docker-php-ext-install mysqli && \
     docker-php-ext-install pdo_mysql pdo_pgsql \

# Clean up
RUN apt-get clean && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

RUN usermod -u 1000 www-data

WORKDIR /var/www

安裝所需 php extension...

更詳細的設定可以參考這裡,裡面有各類服務的設定與範本:
https://github.com/laradock/laradock

簡單說明檔案目地:
每個服務目錄下都會有個 Dockerfile 說明需要使用哪個 image 與安裝指令等...
e.g.
/Dockerfiles/nginx/Dockerfile
/Dockerfiles/mysql/Dockerfile
/Dockerfiles/fpm-php70/Dockerfile
....

 

docker-compose.yml,是 docker 主要面對的檔案,內容註明需要哪些服務,服務與服務之間的連接(link)
開放的 port
對外連結目錄路徑(volumes)

 


 

4. 起動 Docker

CLI 移動到 my_main_project_name/專案1/ 目錄, (與 docker-compose.yml 同層)
執行

docker-compose up -d

第一次起動需要一點時間下載 image 與建立 容器...

 

起動完成後可以打開 kitematic 檢視 image 與 容器 的狀態!
docker-kitematic

 


 

5. Import DB Data

CLI 移動到 20170129-1800.sql 同層位置


docker exec -i xxxxxxx_mysql_1 mysql -uroot -p[DB root 密碼] [DB 預設資料庫] < 20170129-1800.sql

ps: xxxxxxx_mysql_1 為 mysql 容器名稱

 


 

6. 完成

用瀏覽器打開 localhost
enjoy ur work 👍

/etc/hosts 裡,記得加入

127.0.0.1 localhost

 


 


ext.
可以從 kitematic 挑選 workspace 容器,連入執行 composer, gulp, yarn 等指令 😊
所有的指令、任務都在這個容器內進行...
kitematic-exec
 


 
註:

vm : 虛擬機器, virtual machine
在 mac(osx) 大部會使用 virtual box 建立 vm
可以在 vm 裡進行測試或是包裝一個可備份、移動的開發環境

發表迴響