使用Docker快速搭建PHP開發環境

通常咱們會把nginx、php都安裝在同一個容器,爲了擴展方便,咱們但願nginx容器和php容器分開。那麼就可使用docker link命令實現這一目的。php

須要的鏡像:html

  • 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-withextphp71-fpm-centos68-phalcon-withext)。linux

實踐

運行 php-fpm :nginx

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服務自行啓動。-v指定宿主機和容器的目錄映射關係。git

這裏的/work/yphp來自 https://github.com/52fhy/yphpgithub

/work裏面包含的子目錄:docker

/work
  |-- www
  |---yphp

/www是項目目錄,yphp是nginx和php配置目錄,映射到容器,方便本地修改。segmentfault

運行 nginx :centos

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是由於該鏡像很是小。bash

命令不是不少,可是有不少注意點,必須仔細查看,不然可能致使服務不正常:

一、對於php-fpm容器來講,php-fpm的www.conf配置文件裏,監聽的IP致使不能是127.0.0.1,必須是0.0.0.0;不然會致使後續nginx這邊出現404(查看問題)。

;listen = 127.0.0.1:9000
listen = 0.0.0.0:9000

二、nginx容器必須使用--link鏈接到php-fpm容器。
三、nginx容器和php-fpm容器的www目錄必須是一致的。
四、nginx容器配置fastcgi_pass的時候須要修改成--link裏的名稱(實際爲主機名稱,會在nginx容器的/etc/hosts新增一條主機記錄)。
五、若是nginx容器須要支持更多端口訪問,那麼使用-p範圍表示,示例:-p 80-90:80-90。或者多個-p參數。
六、-v參數指定的本地掛載目錄(示例裏的/work)子目錄(例如/www)在宿主機不能是軟連接,不然會致使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參數實際沒有產生做用,能夠省略不寫。

這裏面的/work對於宿主機來講都是同一個目錄。

使用docker ps查看狀態是否都是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已經運行了。添加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服務,會發現phpinfo顯示的PHP版本變成了PHP7.1。

# 重啓nginx容器
docker restart some-nginx

# 重啓nginx容器裏的nginx服務
docker exec some-nginx nginx -s reload

參考

一、docker容器鏈接問題:nginx 和 php-fpm --link後並沒有法正常解析php程序,求解
https://segmentfault.com/q/1010000006148224/a-1020000013359135
二、在docker 上使用alpine linux創建簡易靜態網站 - CSDN博客
http://blog.csdn.net/becivells/article/details/51599186
三、Docker多容器鏈接-以Nginx+PHP爲例 - 程序猿成長計劃 - SegmentFault 思否
http://www.javashuo.com/article/p-yfbausxv-gc.html
四、Nginx調用遠程php-fpm - 指間&流年 - 博客園
http://www.javashuo.com/article/p-ejtllucu-dy.html
五、基於boot2docker部署Docker環境 - 飛鴻影 - 博客園
http://www.javashuo.com/article/p-uxmifybs-hx.html

相關文章
相關標籤/搜索