什麼是?

[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

透過 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/


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

 

1-b. docker-kitematic (非必要) – https://www.docker.com/products/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

例圖:

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

 


 

3. 建立 Dockerfile

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

如圖:

依照要用到的服務建立對應的檔案內容

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 與 容器 的狀態!

 


 

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 等指令 😊
所有的指令、任務都在這個容器內進行…

 


 
註:

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

可樂

View Comments

Recent Posts

plain PHP 搭配 Slack 進行錯誤追蹤、回報(Error Tracking、Error Handling)

錯誤追蹤、回報非常重要,看到的錯誤才知道怎麼修。現今 PHP 流行的 Laravel 有很好的 Error Tracking, Error Handling。但 plain PHP 怎麼辦呢? 在 production 為了安全考量會設定…

4 years ago

Drone CI/CD 配合 Github 使用 Rsync 進行 Deploy

jenkins、circleci、travis 或 Gitlab CI 皆為目前暫知名的 CI/CD 服務,各自缺點也不言而喻...過於肥大、收費略高(?)、速度不夠快執問題...此時使用 go language 開發的 Drone 就出現啦,完全 docker 容器化的運行方式讓整個 CI…

4 years ago

Nginx brotli 設定

網頁壓縮技術中 gzip 很好用,deflate 己經過時,但你聽過 brotli 嗎? 有著比 gzip 更好、更快的壓縮效率。看起來利大於弊有什麼不用他的理由嗎?簡單從優、缺點來看 brotli!到底 brotli 布羅特利是什麼、如何設定呢。 目前大多的 web server…

4 years ago

本機使用 Docker 容器內 PHP (wrapper/expose PHP)

為什麼要讓本機使用 Docker 內 PHP? 情境... docker 容器內用的是 PHP 7.4 但你的開發本機還在跑 PHP 5.6 或是更舊,因為 dockerize 的關係會將所有相關環境都轉移到…

4 years ago

為什麼你需要密碼管理工具

為什麼你需要密碼管理工具現代人一天下來需要輸入多少組密碼,工作與生活己經和密碼密不可分! 除了足夠全安的密碼,密碼記錄、儲存的方式又足夠安全嗎?密碼管理工具可以帶來什麼幫助呢? 為什麼你需要密碼管理工具 資安問題!!大多人說著沒做壞事不怕被偷資料、監聽。嚴重曝露出現代人的基本科技素養的低落和無知 🤯 密碼的使用無所不在!! 行動裝置的普及,APP 、手機遊戲、銀行帳戶所有和生活相關的東西都需要密碼!!facebook, line 只要打開 APP 也會輸入密碼只是他是自動輸入、一般情況不可視 (auth token) 一般人最常發生的密碼資安問題…

4 years ago

簡單使用 Mysql Partition 優化查詢

mysql 資料表分區 mysql table partition 從架構上調整 mysql 的查詢效率。mysql DB 的優化可以簡單也能複雜,除了調整設定值。也可以透過水平分割(Horizontal Partitioning)、垂直分割(Vertical Partitioning) 分庫或分表將資料分散儲存減少資料搜尋、group by 時的效能消耗。拆開批次處理,理論上效率都會變好,本文就水平分割的…

4 years ago