• 使用Docker快速搭建PHP开发环境


    一般我们会把nginx、php都安装在同一个容器,为了扩展方便,我们希望nginx容器和php容器分开。那么就可以使用docker link命令实现这一目的。

    需要的镜像:

    • 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)。

    实践

    运行 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服务自行启动。-v指定宿主机和容器的目录映射关系。

    这里的/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是因为该镜像非常小。

    命令不是很多,但是有很多注意点,必须仔细查看,否则可能导致服务不正常:

    1、对于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
    

    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参数。
    6、-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
    

    参考

    1、docker容器连接问题:nginx 和 php-fpm --link后并无法正常解析php程序,求解
    https://segmentfault.com/q/1010000006148224/a-1020000013359135
    2、在docker 上使用alpine linux建立简易静态网站 - CSDN博客
    http://blog.csdn.net/becivells/article/details/51599186
    3、Docker多容器连接-以Nginx+PHP为例 - 程序猿成长计划 - SegmentFault 思否
    https://segmentfault.com/a/1190000002949036
    4、Nginx调用远程php-fpm - 指间&流年 - 博客园
    https://www.cnblogs.com/feiyafeiblog/p/6938515.html
    5、基于boot2docker部署Docker环境 - 飞鸿影 - 博客园
    https://www.cnblogs.com/52fhy/p/8413029.html

  • 相关阅读:
    实时控制软件第四周作业
    实时控制软件第三次作业-编程作业(更新梯形加速并绘制轨迹)
    实时控制软件第三次作业(编程作业)-更新中
    实时控制软件设计第二周作业-停车场门禁控制系统状态机
    冰球游戏开发日志(四)
    冰球游戏开发日志(三)
    冰球项目开发日志(二)
    冰球项目开发日志(一)
    第四周作业
    第三周作业
  • 原文地址:https://www.cnblogs.com/52fhy/p/8468791.html
Copyright © 2020-2023  润新知