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 相关文章推荐
10条PHP编程习惯助你找工作
Sep 29 PHP
Ajax PHP 边学边练 之三 数据库
Nov 26 PHP
snoopy 强大的PHP采集类使用实例代码
Dec 09 PHP
服务器web工具 php环境下
Dec 29 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
Sep 23 PHP
php牛逼的面试题分享
Jan 18 PHP
PHP闭包(Closure)使用详解
May 02 PHP
php定义数组和使用示例(php数组的定义方法)
Mar 29 PHP
适用于抽奖程序、随机广告的PHP概率算法实例
Apr 09 PHP
php遍历数组的4种方法总结
Jul 05 PHP
Yii入门教程之目录结构、入口文件及路由设置
Nov 25 PHP
PHP+Ajax实现的检测用户名功能简单示例
Feb 12 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 什么是PEAR?(第二篇)
2009/03/19 PHP
探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法
2013/06/06 PHP
php实现的短网址算法分享
2014/06/20 PHP
php去掉URL网址中带有PHPSESSID的配置方法
2014/07/08 PHP
Javascript实例教程(19) 使用HoTMetal(3)
2006/12/23 Javascript
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
input+select(multiple) 实现下拉框输入值
2009/05/21 Javascript
JAVASCRIPT模式窗口中下载文件无法接收iframe的流
2013/10/11 Javascript
检查输入的是否是数字使用keyCode配合onkeypress事件
2014/01/23 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
javascript框架设计读书笔记之模块加载系统
2014/12/02 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
jQuery实现网页顶部固定导航效果代码
2015/12/24 Javascript
angularjs表格ng-table使用备忘录
2016/03/09 Javascript
纯js封装的ajax功能函数与用法示例
2018/05/14 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
原生js基于canvas实现一个简单的前端截图工具代码实例
2019/09/10 Javascript
Webpack设置环境变量的一些误区详解
2019/12/19 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
js实现鼠标点击飘爱心效果
2020/08/19 Javascript
python-opencv在有噪音的情况下提取图像的轮廓实例
2017/08/30 Python
python中文分词教程之前向最大正向匹配算法详解
2017/11/02 Python
selenium+python自动化测试之页面元素定位
2019/01/23 Python
elasticsearch python 查询的两种方法
2019/08/04 Python
使用Python自动生成HTML的方法示例
2019/08/06 Python
Python实现图像去噪方式(中值去噪和均值去噪)
2019/12/18 Python
python实现局域网内实时通信代码
2019/12/22 Python
美国南部最大的家族百货公司:Belk
2017/01/30 全球购物
潘多拉珠宝俄罗斯官方网上商店:PANDORA俄罗斯
2020/09/22 全球购物
岗位竞聘演讲稿
2014/01/10 职场文书
西式婚礼证婚词
2014/01/12 职场文书
揭牌仪式主持词
2014/03/19 职场文书
新学期标语
2014/06/30 职场文书
2015年党支部公开承诺书
2015/01/22 职场文书
大学生学期个人总结
2015/02/12 职场文书
2016幼儿园新学期寄语
2015/12/03 职场文书