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
深入解析php模板技术原理【一】
Jan 10 PHP
php抓取页面与代码解析 推荐
Jul 23 PHP
网站用php实现paypal整合方法
Nov 28 PHP
PHP中IP地址与整型数字互相转换详解
Aug 20 PHP
PHP 使用memcached简单示例分享
Mar 05 PHP
php中switch语句用法详解
Aug 17 PHP
浅谈PHP中的
Apr 23 PHP
微信自定义菜单的创建/查询/取消php示例代码
Aug 05 PHP
PHP简单预防sql注入的方法
Sep 27 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 PHP
Yii框架操作cookie与session的方法实例详解
Sep 04 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 变量未定义等错误的解决方法
2011/01/12 PHP
PHP+MYSQL实现用户的增删改查
2015/03/24 PHP
高质量PHP代码的50个实用技巧必备(下)
2016/01/22 PHP
joomla实现注册用户添加新字段的方法
2016/05/05 PHP
php 5.4 全新的代码复用Trait详解
2017/01/05 PHP
js判断浏览器类型的方法
2013/08/07 Javascript
Mac/Windows下如何安装Node.js
2013/11/22 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
中止javascript执行的方法
2014/02/14 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
JS小游戏之极速快跑源码详解
2014/09/25 Javascript
node.js中的fs.ftruncate方法使用说明
2014/12/15 Javascript
JQuery.get提交页面不跳转的解决方法
2015/01/13 Javascript
利用jQuery中的ajax分页实现代码
2016/02/25 Javascript
深入分析javascript中的错误处理机制
2016/07/17 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
2016/12/08 Javascript
微信小程序 Buffer缓冲区的详解
2017/07/06 Javascript
jQuery实现QQ空间汉字转拼音功能示例
2017/07/10 jQuery
vue、react等单页面项目应该这样子部署到服务器
2018/01/03 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
2018/09/10 Javascript
[02:23]完美世界全国高校联赛街访DOTA2第一期
2019/11/28 DOTA
centos 下面安装python2.7 +pip +mysqld
2014/11/18 Python
Python中模块(Module)和包(Package)的区别详解
2019/08/07 Python
Python使用scipy模块实现一维卷积运算示例
2019/09/05 Python
CSS3属性box-shadow使用指南
2014/12/09 HTML / CSS
深入探究HTML5的History API
2015/07/09 HTML / CSS
浅析HTML5中的 History 模式
2017/06/22 HTML / CSS
澳洲在线厨具商店:Kitchen Style
2018/05/05 全球购物
King Apparel官网:英国街头服饰品牌
2019/09/05 全球购物
优秀党员转正的自我评价
2013/10/06 职场文书
派出所所长先进事迹
2014/05/19 职场文书
2014年安全生产工作总结
2014/11/13 职场文书
大学生违纪检讨书范文
2015/05/07 职场文书
2016保送生自荐信范文
2016/01/29 职场文书
《风筝》教学反思
2016/02/23 职场文书
vue实现简易音乐播放器
2022/08/14 Vue.js