采用docker-compose容器編排技術(shù)臀晃,一步啟動全部服務(wù)觉渴。php容器在官方的基礎(chǔ)上還打包了一些常用拓展(附帶build源碼,動手能力強可以自己打包)徽惋,php案淋,nginx,mysql都附帶有自定義配置文件(便于開發(fā)測試的配置調(diào)整)寂曹,都供下載
架構(gòu)
本片文章搭建出來的環(huán)境如上圖哎迄。
環(huán)境說明
運行環(huán)境
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
這里說明一下筆者運行環(huán)境,采用了在Mac機上安裝vbox虛擬機隆圆,在虛擬機里面的debian環(huán)境安裝了Docker環(huán)境漱挚,文件放在Mac環(huán)境,通過文件掛載方式渺氧,達到Mac環(huán)境編輯旨涝,Docker環(huán)境實時更新效果。你要問為啥不在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? ? ? ? ? ? ? ? ? ? ## 更新為國內(nèi)源
│? ├── 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? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ## 為了數(shù)據(jù)持久化
│? ├── mysql? ? ? ? ? ? ? ? ? ? ? ? ? ? ## mysql 文件掛載
│? └── redis? ? ? ? ? ? ? ? ? ? ? ? ? ? ## redis 持久化數(shù)據(jù)文件夾
├── docker-compose.yaml? ? ? ? ? ? ? ? ## 容器編排 ;⌒取!潮太!
├── log? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ## 各個容器產(chǎn)生的日志
│? ├── 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
配置說明
目前筆者還沒有寫相關(guān)自動化腳本自動適配用戶的使用環(huán)境管搪,所以這里需要先調(diào)整一下下載后的配置文件虾攻。
docker-compose.yml 文件調(diào)整
這個文件有大量的文件掛載配置,這塊就需要調(diào)整更鲁,拿一個舉例霎箍。
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配置文件掛載并覆蓋容器內(nèi)的nginx.conf文件澡为,~/文件路徑就是clone git項目后的目錄直接替換即可漂坏。
如果你也使用了虛擬機,那么你需要~/要替換為docker的運行環(huán)境的路徑媒至!
在ports這里顶别,http服務(wù)為了不和本機的80端口沖突,以及sudo權(quán)限才能申請的小于1024的端口塘慕,這里我以8080作為默認值筋夏。其他容器的端口配置也遵循以上的規(guī)則,為的是能一個命令就能啟動起來图呢。
為每個容器都配置了時區(qū)。
網(wǎng)絡(luò)ip這部分骗随,為了便于配置就手動分配ip了蛤织。
Nginx 配置
配置好了php-fpm之間tcp通訊,以及php路由的rewrite鸿染。配置了靜態(tài)資源緩存指蚜。
MySQL 配置
額外配置了一般性的查詢?nèi)罩荆阌赿ebug程序涨椒。
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需要調(diào)整一下remote_host的的ip(docker-compose.yaml, ~/config/php/cli/20-xdebug.ini 兩個文件內(nèi)的都需要調(diào)整).?server_name?需要結(jié)合開發(fā)IDE一起調(diào)整,如PHPStorm里Preferences | Languages & Frameworks | PHP | Servers配置路徑下有什么可用的記錄蚕冬,那么這里填什么免猾。
Redis 配置
沒有特殊配置
Memecached 配置
沒有特殊配置
鏡像構(gòu)建
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囤热,需要一并調(diào)整docker-compose.yml
啟動
從gitee下載配置
根據(jù)自己的環(huán)境調(diào)整配置
準備好鏡像
啟動
啟動命令
## 當(dāng)前線程運行猎提,要停止時,鍵入`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 要求配置文件的權(quán)限為只能讀锨苏,你需要已只讀方式掛載
不知道remote_host怎么辦
禁用xdebug,搭建好環(huán)境并啟動棺聊,在IDE運行的環(huán)境(因為xdebug需要和IDE通訊)訪問以http(在瀏覽器訪問伞租,注意端口映射)的方式訪問php容器內(nèi)代碼,在Nginx的access.log里查看訪問的ip就是remote_host.
docker build 時報錯導(dǎo)致打包鏡像失敗
遇到這種情況限佩,如果時一些不要緊的報錯葵诈,可以選擇忽略他們。可以在命令后面追加?exit 0?來屏蔽錯誤