使用Docker快速搭建PHP开发环境
一般我們會把nginx、php都安裝在同一個容器,為了擴展方便,我們希望nginx容器和php容器分開。那么就可以使用docker link命令實現(xiàn)這一目的。
需要的鏡像:
- nginx 1.12.2
- php(含php-fpm7.1) 7.1
這里nginx鏡像選擇daocloud.io/library/nginx:1.12.2-alpine,php鏡像自行編譯(選用的是?https://github.com/52fhy/docker-images?里的php56-fpm-centos68-withext和php71-fpm-centos68-phalcon-withext)。
實踐
運行 php-fpm :
docker run -d --restart=always --name yphp \ -v /work/:/work/ \ -v "/work/yphp/php/etc/":/usr/local/php/etc/ \ php71-fpm-centos68-phalcon-withext
--restart=always?使得容器開機隨著docker服務(wù)自行啟動。-v指定宿主機和容器的目錄映射關(guān)系。
這里的/work/yphp來自?https://github.com/52fhy/yphp?。
/work里面包含的子目錄:
/work |-- www |---yphp
/www是項目目錄,yphp是nginx和php配置目錄,映射到容器,方便本地修改。
運行 nginx :
docker run -d --restart=always --name some-nginx -p 80:80 --link yphp:yphp \ -v /work/:/work/ \ -v /work/yphp/nginx/conf/:/etc/nginx/ \ -v /work/yphp/nginx/logs/:/etc/nginx/logs/ \ daocloud.io/library/nginx:1.12.2-alpine
選用nginx:1.12.2-alpine是因為該鏡像非常小。
命令不是很多,但是有很多注意點,必須仔細(xì)查看,否則可能導(dǎo)致服務(wù)不正常:
1、對于php-fpm容器來說,php-fpm的www.conf配置文件里,監(jiān)聽的IP導(dǎo)致不能是127.0.0.1,必須是0.0.0.0;否則會導(dǎo)致后續(xù)nginx這邊出現(xiàn)404(查看問題)。
;listen = 127.0.0.1:9000 listen = 0.0.0.0:9000
2、nginx容器必須使用--link連接到php-fpm容器。
 3、nginx容器和php-fpm容器的www目錄必須是一致的。
 4、nginx容器配置fastcgi_pass的時候需要修改為--link里的名稱(實際為主機名稱,會在nginx容器的/etc/hosts新增一條主機記錄)。
 5、如果nginx容器需要支持更多端口訪問,那么使用-p范圍表示,示例:-p 80-90:80-90。或者多個-p參數(shù)。
 6、-v參數(shù)指定的本地掛載目錄(示例里的/work)子目錄(例如/www)在宿主機不能是軟鏈接,否則會導(dǎo)致nginx 404,因為軟鏈接在容器里是無效的。但是/work本身可以是軟鏈接。
nginx配置:
 hello.cc.conf
server { listen 80; server_name hello.cc; access_log logs/access.log; error_log logs/error.log; root /work/yphp/php/; index index.php index.html index.htm; location ~ \.php$ { #fastcgi_pass 127.0.0.1:9000; fastcgi_pass yphp:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
注意這里的fastcgi_pass已做改動。
運行多個版本PHP
docker run -d --restart=always --privileged --name yphp56 --env COLUMNS=`tput cols` --env LINES=`tput lines` -p 9000:9000 -p 9400-9499:9400-9499 \ -v /work/:/work/ \ -v "/work/yphp/php/etc56/":/usr/local/php/etc/ \ php56-fpm-centos68-withext docker run -d --restart=always --privileged --name yphp --env COLUMNS=`tput cols` --env LINES=`tput lines` -p 9001:9000 -p 9500-9600:9500-9600 \ -v /work/:/work/ \ -v /work/:/alidata/ \ -v "/work/yphp/php/etc/":/usr/local/php/etc/ \ php71-fpm-centos68-phalcon-withext docker run -d --restart=always --name some-nginx -p 80-90:80-90 --link yphp56 --link yphp \ -v /work/:/work/ \ -v /work/yphp/nginx/conf/:/etc/nginx/ \ -v /work/yphp/nginx/logs/:/etc/nginx/logs/ \ daocloud.io/library/nginx:1.12.2-alpine
對于使用了--link的nginx容器來說,php-fpm容器的-p參數(shù)實際沒有產(chǎn)生作用,可以省略不寫。
這里面的/work對于宿主機來說都是同一個目錄。
使用docker ps查看狀態(tài)是否都是UP:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 221c6ffb19dd daocloud.io/library/nginx:1.12.2-alpine "nginx -g 'daemon of…" 12 minutes ago Up 2 seconds 0.0.0.0:80-90->80-90/tcp some-nginx 02a4f9d804f7 php71-fpm-centos68-phalcon-withext "/run.sh" 24 minutes ago Up 3 seconds 80/tcp, 0.0.0.0:9001->9000/tcp yphp a9decc06558e php56-fpm-centos68-withext "/run.sh" 25 minutes ago Up 3 seconds 80/tcp, 0.0.0.0:9000->9000/tcp yphp56
說明正常。
如果本地是Mac或者Linux且安裝的是Docker(非ToolBox之類),使用127.0.0.1就可以看到nginx已經(jīng)運行了。添加127.0.0.1 hello.cc到/etc/hosts(非Windows)后訪問http://hello.cc/可以看到phpinfo信息。試著修改/work/yphp/nginx/conf/vhost/hello.cc.conf里的fastcgi_pass端口為9001,然后重啟nginx容器或者重啟nginx容器里的nginx服務(wù),會發(fā)現(xiàn)phpinfo顯示的PHP版本變成了PHP7.1。
# 重啟nginx容器 docker restart some-nginx # 重啟nginx容器里的nginx服務(wù) docker exec some-nginx nginx -s reload
參考
1、docker容器連接問題:nginx 和 php-fpm --link后并無法正常解析php程序,求解
https://segmentfault.com/q/1010000006148224/a-1020000013359135
 2、在docker 上使用alpine linux建立簡易靜態(tài)網(wǎng)站 - CSDN博客
http://blog.csdn.net/becivells/article/details/51599186
 3、Docker多容器連接-以Nginx+PHP為例 - 程序猿成長計劃 - SegmentFault 思否
https://segmentfault.com/a/1190000002949036
 4、Nginx調(diào)用遠(yuǎn)程php-fpm - 指間&流年 - 博客園
https://www.cnblogs.com/feiyafeiblog/p/6938515.html
 5、基于boot2docker部署Docker環(huán)境 - 飛鴻影 - 博客園
https://www.cnblogs.com/52fhy/p/8413029.html
總結(jié)
以上是生活随笔為你收集整理的使用Docker快速搭建PHP开发环境的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Django 模板HTML转义和CSRF
- 下一篇: ps命令使用详解
