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 编写的日历
Oct 09 PHP
sqlyog 中文乱码问题的设置方法
Oct 19 PHP
如何判断php数组的维度
Jun 10 PHP
PHP中批量生成静态html(命令行下运行PHP)
Apr 19 PHP
推荐一本PHP程序猿都应该拜读的书
Dec 31 PHP
10个超级有用值得收藏的PHP代码片段
Jan 22 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
Nov 09 PHP
PHP自定义函数实现格式化秒的方法
Sep 14 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
Nov 06 PHP
laravel多条件查询方法(and,or嵌套查询)
Oct 09 PHP
php libevent 功能与使用方法详解
Mar 04 PHP
PHP文件打开关闭及读写操作示例解析
Aug 06 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 excel类 phpExcel使用方法介绍
2010/08/21 PHP
Thinkphp关闭缓存的方法
2015/06/26 PHP
Yii针对添加行的增删改查操作示例
2016/10/18 PHP
如何判断图片地址是否失效
2007/02/02 Javascript
JavaScript实现的圆形浮动标签云效果实例
2015/08/06 Javascript
jquery实现顶部向右伸缩的导航区域代码
2015/09/02 Javascript
基于replaceChild制作简单的吞噬特效
2015/09/21 Javascript
javascript类型系统——undefined和null全面了解
2016/07/13 Javascript
微信小程序使用第三方库Immutable.js实例详解
2016/09/27 Javascript
jQuery插件扩展实例【添加回调函数】
2016/11/26 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
2017/04/13 Javascript
Vue + Vue-router 同名路由切换数据不更新的方法
2017/11/20 Javascript
vue.js 实现点击展开收起动画效果
2018/07/07 Javascript
layui实现点击按钮给table添加一行
2018/08/10 Javascript
关于单文件组件.vue的使用
2018/09/20 Javascript
Vue+element 解决浏览器自动填充记住的账号密码问题
2019/06/11 Javascript
[01:04]DOTA2上海特锦赛现场采访 FreeAgain遭众解说围攻
2016/03/25 DOTA
[00:57]英雄,你的补给到了!
2020/11/13 DOTA
跟老齐学Python之开始真正编程
2014/09/12 Python
详解Python的单元测试
2015/04/28 Python
python用装饰器自动注册Tornado路由详解
2017/02/14 Python
Python实现的中国剩余定理算法示例
2017/08/05 Python
浅述python中深浅拷贝原理
2018/09/18 Python
解决django 新增加用户信息出现错误的问题
2019/07/28 Python
Python列表推导式实现代码实例
2020/09/09 Python
Python结合百度语音识别实现实时翻译软件的实现
2021/01/18 Python
使用jTopo给Html5 Canva中绘制的元素添加鼠标事件
2014/05/15 HTML / CSS
美国百货齐全的精品网站,提供美式风格的产品:Overstock.com
2016/07/22 全球购物
北承题目(C++)
2012/05/16 面试题
大二自我鉴定
2014/01/31 职场文书
人力资源经理的岗位职责
2014/03/02 职场文书
幼儿园安全责任书
2014/04/14 职场文书
小学生期末评语
2014/04/21 职场文书
综治宣传月活动总结
2014/04/28 职场文书
维稳工作情况汇报
2014/10/27 职场文书
游戏开发中如何使用CocosCreator进行音效处理
2021/04/14 Javascript