PHP 应用容器化以及部署方法


Posted in PHP onFebruary 12, 2018

PHP 是世界上最好的语言。

经典的 LNMP(linux + nginx + php + mysql)环境有很多现成的部署脚本,但是在 Docker 盛行的今天,依然有很多同学在如何部署上有一些列问题,所以这篇简单介绍一下如何使用 Docker 以及 docker-compose 在服务器上部署 php 应用。

首先我们回顾一下过去的 nginx 里 php 配置:

location ~ \.php$ {
 try_files  $uri =404;
 include   fastcgi_params;
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 fastcgi_split_path_info ^(.+\.php)(/.+)$;
 fastcgi_param PATH_INFO $fastcgi_path_info;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

所有 php 文件使用 php 引擎来解析,php 运行在本地的 9000 端口(可以通过 ip/unix domain sockets 访问),既然可以是本地,当然也可以通过 远程服务 来解析了。

故而我们的 nginx 服务如下配置:

server {
 listen  80;
 charset utf-8;
 # access_log /var/log/nginx/nginx.access.log main;
 # error_log /var/log/nginx/error.log;

 root /var/www/html;
 index index.php index.html;

 add_header X-Cache $upstream_cache_status;

 location ~ \.php$ {
  try_files  $uri =404;
  include   fastcgi_params;
  fastcgi_pass php-fpm:9000;
  fastcgi_index index.php;
  fastcgi_split_path_info ^(.+\.php)(/.+)$;
  fastcgi_param PATH_INFO $fastcgi_path_info;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 }
}

于此同时,有个比较棘手的问题是,php 代码在nginx 和 php 引擎都需要存在,不然解析不了,但这都不是事啊,docker 的 volume 天然支持!

直接看下面的 docker-compose.yml 配置:

version: '2'
services:
 nginx:
  image: nginx:stable-alpine
  ports:
   - 80:80
  volumes:
   - ./conf/nginx/conf.d:/etc/nginx/conf.d
  volumes_from:
   - php-fpm
  restart: always

 php-fpm:
  image: php:7.1-fpm-alpine
  volumes:
   - ./code:/var/www/html
  restart: always

注意点:

php-fpm 挂载了本地目录 code 到 /var/www/html
nginx conf 中使用了 service_name 来访问 php-fpm
nginx 通过 volumes_from 指令共享了 php-fpm 的 /var/www/html
在 code 目录下 index.php 里写一下:

<?php
echo phpinfo();

然后运行:

# bash
docker-compose up

打开浏览器可以看到熟悉的 phpinfo 了:

PHP 应用容器化以及部署方法

那么问题来了,有小伙伴要问了,依赖怎么办?好的,这就是我要继续说的。

在你的项目里放一个 Dockerfile:

FROM php:7.1-fpm-alpine
RUN docker-php-install pdo pdo-mysql
COPY src /var/www/html

构建的话可以选择阿里云镜像服务构建功能或者是 Docker 提供的自动构建,然后更新一下之前的 docker-compose.yml 即可:

version: '2'
services:
 nginx:
  image: nginx:stable-alpine
  ports:
   - 8000:80
  volumes:
   - ./conf/nginx/conf.d:/etc/nginx/conf.d
  volumes_from:
   - php-fpm
  restart: always

 php-fpm:
  image: {YOUR_PHP_IMAGE_NAME}:{TAG}
  restart: always

本示例代码:

ImplementsIO/docker-labs

PHP 相关文章推荐
聊天室php&amp;mysql(二)
Oct 09 PHP
第二节--PHP5 的对象模型
Nov 16 PHP
php 变量定义方法
Jun 14 PHP
PHP读取网页文件内容的实现代码(fopen,curl等)
Jun 23 PHP
php 获取百度的热词数据的代码
Feb 18 PHP
实测在class的function中include的文件中非php的global全局环境
Jul 15 PHP
PHP APC缓存配置、使用详解
Mar 06 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
Jul 29 PHP
php解析http获取的json字符串变量总是空白null
Mar 02 PHP
php 可变函数使用小结
Jun 12 PHP
php中的buffer缓冲区用法分析
May 31 PHP
PHP中isset、empty的用法与区别示例详解
Nov 05 PHP
PHP使用Redis长连接的方法详解
Feb 12 #PHP
PHP长连接实现与使用方法详解
Feb 11 #PHP
搜索附近的人PHP实现代码
Feb 11 #PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 #PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
Feb 11 #PHP
PHP实现的多维数组排序算法分析
Feb 10 #PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 #PHP
You might like
PHP 高手之路(一)
2006/10/09 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
PHP中STDCLASS用法实例分析
2016/11/11 PHP
thinkphp分页集成实例
2017/07/24 PHP
Yii使用EasyWechat实现小程序获取用户的openID的方法
2020/04/29 PHP
一段非常简单的让图片自动切换js代码
2006/11/10 Javascript
JS中简单的实现像C#中using功能(有源码下载)
2007/01/09 Javascript
mapper--图片热点区域高亮组件官方站点
2007/12/22 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
2011/10/12 Javascript
深入理解JQuery keyUp和keyDown的区别
2013/12/12 Javascript
JQuery中使用on方法绑定hover事件实例
2014/12/09 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
基于Jquery和CSS3制作数字时钟附源码下载(CSS3篇)
2015/11/24 Javascript
JavaScript实现广告弹窗效果
2016/08/09 Javascript
浅析Vue 生命周期
2018/06/21 Javascript
javascript中call()、apply()的区别
2019/03/21 Javascript
vue项目前端错误收集之sentry教程详解
2019/05/27 Javascript
100行代码实现vue表单校验功能(小白自编)
2019/11/19 Javascript
10个易被忽视但应掌握的Python基本用法
2015/04/01 Python
利用Python演示数型数据结构的教程
2015/04/03 Python
python中将zip压缩包转为gz.tar的方法
2018/10/18 Python
python nohup 实现远程运行不宕机操作
2020/04/16 Python
使用Keras训练好的.h5模型来测试一个实例
2020/07/06 Python
详解Python流程控制语句
2020/10/28 Python
CSS 3.0文字悬停跳动特效代码
2020/10/26 HTML / CSS
健康监测猫砂:Pretty Litter
2017/05/25 全球购物
电子商务专业个人的自我评价分享
2013/10/29 职场文书
挂职思想汇报
2013/12/31 职场文书
公司培训欢迎词
2014/01/10 职场文书
大学活动总结格式
2014/04/29 职场文书
环保建议书100字
2014/05/14 职场文书
2015年事业单位办公室文员工作总结
2015/04/24 职场文书
工程服务质量承诺书
2015/04/29 职场文书
迎新晚会主持词开场白
2015/05/28 职场文书
2016年小学植树节活动总结
2016/03/16 职场文书