本來我自己是利用 vagrant 建立一個虛擬主機(vm),在裡頭安裝了需多工具,當成開發環境.
但每次要抽換工具或版本總是有點麻煩….
換成 docker 除了讓環境抽換速度更快之外,使用的硬碟空間也小了不少
index :
- 前言:
- 開始安裝 docker
Why Docker ?
為什麼要使用 docker 呢…
* 服務之間的整合快速
* 抽換快速
* 建構快速
(ps : 本篇不會詳細說明什麼是 docker,簡單記錄 docker 安裝流程)
最初我是利用 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 裡進行測試或是包裝一個可備份、移動的開發環境
寫給自己看的筆記?
是的 🙂