index :
為什麼要使用 docker 呢…
* 服務之間的整合快速
* 抽換快速
* 建構快速
(ps : 本篇不會詳細說明什麼是 docker,簡單記錄 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 開發環境!”…
選擇 stable 版本, 安裝完成後會當駐在 menu bar 上
上述連結裡,清楚說明如何安裝與測試,docker 是否安裝成功
很友善的教學,從 docker 安裝到建立一個 nginx web server
最後也教你怎麼刪掉測試後用不到的 images
雖然是非必要 APP,不過建議安裝,他是 GUI 介面的 容器(containers)、映像檔(image) 管理軟體
非常好用,logo 也可愛
如果上面的連結無法下載,可以試試從 Github 下載 https://github.com/docker/kitematic/releases
(或在上一步 docker 的介面中也有下載連結)
建立如下的目錄架構…
.
+-- 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 關閉後,資料仍會存在
如圖:
依照要用到的服務建立對應的檔案內容
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/
在 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)
CLI 移動到 my_main_project_name/專案1/
目錄, (與 docker-compose.yml 同層)
執行
docker-compose up -d
第一次起動需要一點時間下載 image 與建立 容器…
起動完成後可以打開 kitematic 檢視 image 與 容器 的狀態!
CLI 移動到 20170129-1800.sql 同層位置
docker exec -i xxxxxxx_mysql_1 mysql -uroot -p[DB root 密碼] [DB 預設資料庫] < 20170129-1800.sql
ps: xxxxxxx_mysql_1 為 mysql 容器名稱
用瀏覽器打開 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 裡進行測試或是包裝一個可備份、移動的開發環境
錯誤追蹤、回報非常重要,看到的錯誤才知道怎麼修。現今 PHP 流行的 Laravel 有很好的 Error Tracking, Error Handling。但 plain PHP 怎麼辦呢? 在 production 為了安全考量會設定…
jenkins、circleci、travis 或 Gitlab CI 皆為目前暫知名的 CI/CD 服務,各自缺點也不言而喻...過於肥大、收費略高(?)、速度不夠快執問題...此時使用 go language 開發的 Drone 就出現啦,完全 docker 容器化的運行方式讓整個 CI…
網頁壓縮技術中 gzip 很好用,deflate 己經過時,但你聽過 brotli 嗎? 有著比 gzip 更好、更快的壓縮效率。看起來利大於弊有什麼不用他的理由嗎?簡單從優、缺點來看 brotli!到底 brotli 布羅特利是什麼、如何設定呢。 目前大多的 web server…
為什麼要讓本機使用 Docker 內 PHP? 情境... docker 容器內用的是 PHP 7.4 但你的開發本機還在跑 PHP 5.6 或是更舊,因為 dockerize 的關係會將所有相關環境都轉移到…
為什麼你需要密碼管理工具現代人一天下來需要輸入多少組密碼,工作與生活己經和密碼密不可分! 除了足夠全安的密碼,密碼記錄、儲存的方式又足夠安全嗎?密碼管理工具可以帶來什麼幫助呢? 為什麼你需要密碼管理工具 資安問題!!大多人說著沒做壞事不怕被偷資料、監聽。嚴重曝露出現代人的基本科技素養的低落和無知 🤯 密碼的使用無所不在!! 行動裝置的普及,APP 、手機遊戲、銀行帳戶所有和生活相關的東西都需要密碼!!facebook, line 只要打開 APP 也會輸入密碼只是他是自動輸入、一般情況不可視 (auth token) 一般人最常發生的密碼資安問題…
mysql 資料表分區 mysql table partition 從架構上調整 mysql 的查詢效率。mysql DB 的優化可以簡單也能複雜,除了調整設定值。也可以透過水平分割(Horizontal Partitioning)、垂直分割(Vertical Partitioning) 分庫或分表將資料分散儲存減少資料搜尋、group by 時的效能消耗。拆開批次處理,理論上效率都會變好,本文就水平分割的…
View Comments
寫給自己看的筆記?
是的 :)