痛點
筆者在嘗試起一個新web專案時,往往會陷入重新建立一套Docker環境的繁瑣事當中。我想大家在開始做一個新專案時,或者快速為了和以前的專案做完全的隔離,也會起一套新docker環境。
從這篇文章你會得到
採用docker-compose
容器編排技術,一步啟動全部服務。php容器在官方的基礎上還打包了一些常用擴充(附帶build原始碼,動手能力強可以自己打包),php,nginx,mysql都附帶有自定義配置檔案(便於開發測試的配置調整),都供下載。
架構
本片文章搭建出來的環境如上圖。
環境說明
執行環境
Mac OS 10.13.6
Virtual Box 5.2.14
Ubuntu 16.04.4
Docker 17.07.0-ce
容器
Nginx 1.12.1-alpine
PHP-fpm 5.6
MySQL 5.7
Redis 3.2
Memcached 1.4.27
這裡說明一下筆者執行環境,採用了在Mac機上安裝vbox虛擬機器,在虛擬機器裡面的debian環境安裝了Docker環境,檔案放在Mac環境,通過檔案掛載方式,達到Mac環境編輯,Docker環境實時更新效果。你要問為啥不在Mac下直接裝Docker,歷史原因~
執行材料
.
├── build ## docker 映象build 材料
│ ├── php5.6 ## php 5.6
│ │ ├── Dockerfile
│ │ ├── imagick-3.4.3.tgz
│ │ ├── memcached-2.2.0.tgz
│ │ ├── redis-4.0.2.tgz
│ │ ├── sources.list
│ │ └── xdebug-XDEBUG_2_5_5.tar.gz
│ └── php-cli ## php cli 的自建映象
│ ├── amqp-1.9.3.tgz
│ ├── Dockerfile
│ ├── Dockerfile-php-swoole
│ ├── memcached-3.0.4.tgz
│ ├── redis-4.1.1.tgz
│ ├── sources.list.jessie
│ ├── swoole-4.0.4.tgz
│ ├── swoole-4.2.6.tgz
│ ├── xdebug-2.6.1.tgz
│ └── yaf-3.0.7.tgz
├── config ## 配置檔案
│ ├── apt ## 由於使用的debian系列,所以命名apt
│ │ └── sources.list ## 更新為國內源
│ ├── memcached ## memchached的配置
│ │ └── memcached.conf
│ ├── mysql ## mysql 的配置
│ │ ├── conf.d
│ │ │ └── mysqld_safe_syslog.cnf
│ │ └── my.cnf
│ ├── nginx ## nginx 的配置
│ │ ├── conf.d
│ │ │ ├── default
│ │ │ └── xiuno
│ │ ├── mime.types
│ │ ├── nginx.conf
│ │ └── sites-enabled
│ ├── php ## php的配置,分cli,和fpm配置
│ │ ├── cli
│ │ │ ├── conf.d
│ │ │ │ ├── 05-opcache.ini
│ │ │ │ ├── 10-pdo.ini
│ │ │ │ ├── 20-curl.ini
│ │ │ │ ├── 20-gd.ini
│ │ │ │ ├── 20-imagick.ini
│ │ │ │ ├── 20-json.ini
│ │ │ │ ├── 20-memcache.ini
│ │ │ │ ├── 20-mysqli.ini
│ │ │ │ ├── 20-mysql.ini
│ │ │ │ ├── 20-pdo_mysql.ini
│ │ │ │ ├── 20-readline.ini
│ │ │ │ ├── 20-redis.ini
│ │ │ │ ├── 20-xdebug.ini
│ │ │ │ └── swoole.ini
│ │ │ └── php.ini
│ │ ├── fpm
│ │ │ ├── conf.d
│ │ │ │ ├── docker.conf
│ │ │ │ ├── www.conf
│ │ │ │ └── zz-docker.conf
│ │ │ ├── docker-php-fpm.conf
│ │ │ ├── php-fpm.conf
│ │ │ ├── php.ini
│ │ │ └── pool.d
│ │ │ └── www.conf
│ │ └── mods-available
│ │ ├── curl.ini
│ │ ├── gd.ini
│ │ ├── imagick.ini
│ │ ├── json.ini
│ │ ├── memcache.ini
│ │ ├── mysqli.ini
│ │ ├── mysql.ini
│ │ ├── opcache.ini
│ │ ├── pdo.ini
│ │ ├── pdo_mysql.ini
│ │ ├── readline.ini
│ │ ├── redis.ini
│ │ └── xdebug.ini
│ └── redis ## redis 配置
│ ├── redis.conf
│ ├── redis-server.sh
│ └── sentinel.conf
├── data ## 為了資料持久化
│ ├── mysql ## mysql 檔案掛載
│ └── redis ## redis 持久化資料資料夾
├── docker-compose.yaml ## 容器編排 !!!
├── log ## 各個容器產生的日誌
│ ├── mysql ## mysql日誌
│ │ ├── error.log
│ │ └── mysql.log
│ ├── nginx ## nginx 日誌
│ │ ├── access.log
│ │ ├── access_xiuno.log
│ │ ├── error.log
│ │ └── error_xiuno.log
│ └── php
├── php ## php程式碼存放目錄
│ └── xiunobbs ## php專案
└── tool ## php 一些工具
├── composer.phar
└── phpunit-4.8.36.phar
配置檔案下載
git clone https://gitee.com/xupaul/docker_fast_init
配置說明
目前筆者還沒有寫相關自動化指令碼自動適配使用者的使用環境,所以這裡需要先調整一下下載後的配置檔案。
docker-compose.yml 檔案調整
這個檔案有大量的檔案掛載配置,這塊就需要調整,拿一個舉例。
version: "2"
services:
http:
image: nginx:1.12.1-alpine
volumes:
- ~/config/nginx/nginx.conf:/etc/nginx/nginx.conf:rw
ports:
- "8080:80"
environment:
TZ : "Asia/Shanghai"
networks:
tasker_net:
ipv4_address: "192.63.0.11"
在例子中最後volumes
的下一行,是將宿主機的nginx.conf
配置檔案掛載並覆蓋容器內的nginx.conf
檔案,~/
檔案路徑就是clone git專案後的目錄直接替換即可。
如果你也使用了虛擬機器,那麼你需要~/
要替換為docker
的執行環境的路徑!
在ports
這裡,http服務為了不和本機的80埠衝突,以及sudo
許可權才能申請的小於1024的埠,這裡我以8080作為預設值。其他容器的埠配置也遵循以上的規則,為的是能一個命令就能啟動起來。
為每個容器都配置了時區。
網路ip這部分,為了便於配置就手動分配ip了。
Nginx 配置
配置好了php-fpm之間tcp通訊,以及php路由的rewrite。配置了靜態資源快取。
MySQL 配置
額外配置了一般性的查詢日誌,便於debug程式。
PHP 配置
php:
image: paulxu/php:5.6-fpm-jessis-pdo-xdebug-mysqli-gd-mb-zip-2
volumes:
- ~/config/php/cli/php.ini:/usr/local/etc/php/php.ini/:rw
ports:
- "9000"
environment:
PHP_IDE_CONFIG: "serverName=bs"
XDEBUG_CONFIG: "remote_host=10.0.2.2 remote_port=9000"
我為php一起打包了一些常用擴充,其中xdebug需要調整一下remote_host
的的ip(docker-compose.yaml, ~/config/php/cli/20-xdebug.ini 兩個檔案內的都需要調整). server_name
需要結合開發IDE一起調整,如PHPStorm裡Preferences | Languages & Frameworks | PHP | Servers
配置路徑下有什麼可用的記錄,那麼這裡填什麼。
Redis 配置
沒有特殊配置
Memecached 配置
沒有特殊配置
映象構建
php映象
可以通過如下命令拉取:
docker pull paulxu/php:5.6-fpm-jessis-pdo-xdebug-mysqli-gd-mb-zip-2
或者在到 ~/build/php5.6
下自行打包:
docker build -t paulxu/php:5.6-fpm-jessis-pdo-xdebug-mysqli-gd-mb-zip-2 -f dockerfile .
如果自定義tag name,需要一併調整docker-compose.yml
啟動
- 從gitee下載配置
- 根據自己的環境調整配置
- 準備好映象
- 啟動
啟動命令
## 當前執行緒執行,要停止時,鍵入`Ctrl+C`
docker-comose -f ./docker-compose.yaml up
## 後臺執行
docker-comose -f ./docker-compose.yaml up -d
摧毀
docker-comose -f ./docker-compose.yaml down
常見問題
MySQL 掛載的配置檔案被忽略,不起作用
MySQL 要求配置檔案的許可權為只能讀,你需要已只讀方式掛載
不知道remote_host怎麼辦
禁用xdebug,搭建好環境並啟動,在IDE執行的環境(因為xdebug
需要和IDE通訊)訪問以http
(在瀏覽器訪問,注意埠對映)的方式訪問php容器內程式碼,在Nginx
的access.log
裡檢視訪問的ip就是remote_host
.
docker build 時報錯導致打包映象失敗
遇到這種情況,如果時一些不要緊的報錯,可以選擇忽略他們。可以在命令後面追加 exit 0
來遮蔽錯誤
最後
祝願大家能一步到位,有問題留言,遇到疑難雜可以試試本地起虛擬機器裡跑docker容器的那種方案。