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脚本的10个技巧(8)
Oct 09 PHP
浅析PHP水印技术
Feb 14 PHP
PHP 彩色文字实现代码
Jun 29 PHP
php set_magic_quotes_runtime() 函数过时解决方法
Jul 08 PHP
php中++i 与 i++ 的区别
Aug 08 PHP
PHP递归复制、移动目录的自定义函数分享
Nov 18 PHP
PHP 反射(Reflection)使用实例
May 12 PHP
利用“多说”制作留言板、评论系统
Jul 14 PHP
thinkphp跨库操作的简单代码实例
Sep 22 PHP
PHPExcel导出2003和2007的excel文档功能示例
Jan 04 PHP
基于 Swoole 的微信扫码登录功能实现代码
Jan 15 PHP
YII2框架中actions的作用与使用方法示例
Mar 13 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
从康盛产品(discuz)提取出来的模板类
2011/06/28 PHP
解析PHP 5.5 新特性
2013/07/02 PHP
解析将多维数组转换为支持curl提交的一维数组格式
2013/07/08 PHP
php中sql注入漏洞示例 sql注入漏洞修复
2014/01/24 PHP
PHP多文件上传实例
2015/07/09 PHP
PHP快速排序算法实现的原理及代码详解
2019/04/03 PHP
PHP实现读取文件夹及批量重命名文件操作示例
2019/04/15 PHP
js实现页面打印功能实例代码(附去页眉页脚功能代码)
2009/12/15 Javascript
jQuery筛选器children()案例详解(图文)
2013/02/17 Javascript
jQuery Validate 验证,校验规则写在控件中的具体实例
2014/02/27 Javascript
使用Node.js实现HTTP 206内容分片的教程
2015/06/23 Javascript
jQuery实现返回顶部功能
2016/02/23 Javascript
使用postMesssage()实现跨域iframe页面间的信息传递方法
2016/03/29 Javascript
Bootstrap表单布局样式源代码
2016/07/04 Javascript
js实现贪吃蛇小游戏(容易理解)
2017/01/22 Javascript
关于react中组件通信的几种方式详解
2017/12/10 Javascript
javacript replace 正则取字符串中的值并替换【推荐】
2018/09/13 Javascript
Vue中axios拦截器如何单独配置token
2019/12/27 Javascript
在Python下进行UDP网络编程的教程
2015/04/29 Python
python3 pandas 读取MySQL数据和插入的实例
2018/04/20 Python
python根据时间获取周数代码实例
2019/09/30 Python
tensorboard显示空白的解决
2020/02/15 Python
python 使用事件对象asyncio.Event来同步协程的操作
2020/05/04 Python
css3实现背景动态渐变效果
2019/12/10 HTML / CSS
浅谈HTML5 defer和async的区别
2016/06/07 HTML / CSS
abstract是什么意思
2012/02/12 面试题
大学生学习党课思想汇报
2014/01/03 职场文书
2014年中秋节活动总结
2014/08/29 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
2014年资料员工作总结
2014/11/18 职场文书
导师对论文的学术评语
2015/01/04 职场文书
公证处委托书
2015/01/28 职场文书
中国汉字听写大会观后感
2015/06/02 职场文书
小学班长竞选稿
2015/11/20 职场文书
用Java实现简单计算器功能
2021/07/21 Java/Android
win10键盘驱动怎么修复?Win10键盘驱动修复小技巧
2022/04/06 数码科技