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 和 MySQL 基础教程(一)
Oct 09 PHP
用phpmyadmin更改mysql5.0登录密码
Mar 25 PHP
写php分页时出现的Fatal error的解决方法
Apr 18 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
Jun 03 PHP
php计算当前程序执行时间示例
Apr 24 PHP
Codeigniter实现多文件上传并创建多个缩略图
Jun 12 PHP
php从文件夹随机读取文件的方法
Jun 01 PHP
php猜单词游戏
Sep 29 PHP
php中bind_param()函数用法分析
Mar 28 PHP
PHP解析url并得到url参数方法总结
Oct 11 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
Mar 07 PHP
php实现对文件压缩简单的方法
Sep 29 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二维/三维数组转字符串
2013/09/13 PHP
支持中文的PHP按字符串长度分割成数组代码
2015/05/17 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
2016/11/15 PHP
php版微信自定义回复功能示例
2016/12/05 PHP
PHP实现留言板功能的详细代码
2017/03/25 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
2017/10/12 PHP
浅谈laravel数据库查询返回的数据形式
2019/10/21 PHP
jQuery实现的Email中的收件人效果(按del键删除)
2011/03/20 Javascript
jQuery中将函数赋值给变量的调用方法
2012/03/23 Javascript
原生js 秒表实现代码
2012/07/24 Javascript
Node.js开源应用框架HapiJS介绍
2015/01/14 Javascript
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
简单谈谈Javascript中类型的判断
2015/10/19 Javascript
js ajaxfileupload.js上传报错的解决方法
2016/05/05 Javascript
layDate日期控件使用方法详解
2018/11/15 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
小程序如何写动态标签的实现方法
2020/02/05 Javascript
python发送邮件示例(支持中文邮件标题)
2014/02/16 Python
Python中__init__.py文件的作用详解
2016/09/18 Python
python爬虫之百度API调用方法
2017/06/11 Python
Python利用turtle库绘制彩虹代码示例
2017/12/20 Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
2018/01/05 Python
使用实现pandas读取csv文件指定的前几行
2018/04/20 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
2019/05/13 Python
Python3的高阶函数map,reduce,filter的示例详解
2019/07/23 Python
python 函数中的参数类型
2020/02/11 Python
QML用PathView实现轮播图
2020/06/03 Python
利用Python的folium包绘制城市道路图的实现示例
2020/08/24 Python
css3背景图片透明叠加属性cross-fade简介及用法实例
2013/01/08 HTML / CSS
学校介绍信范文
2014/01/14 职场文书
行政监察建议书
2014/05/19 职场文书
十佳标兵事迹材料
2014/08/18 职场文书
2014幼儿园保育员工作总结
2014/11/10 职场文书
2016年暑假学生家长评语
2015/12/01 职场文书
用Python创建简易网站图文教程
2021/06/11 Python
JavaWeb Servlet实现网页登录功能
2021/07/04 Java/Android