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 验证码制作(网树注释思想)
Jul 20 PHP
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
May 07 PHP
php安全之直接用$获取值而不$_GET 字符转义
Jun 03 PHP
php实现MD5加密16位(不要默认的32位)
Aug 12 PHP
php格式化日期和时间格式化示例分享
Feb 24 PHP
CodeIgniter实现更改view文件夹路径的方法
Jul 04 PHP
windows中为php安装mongodb与memcache
Jan 06 PHP
php使用指定编码导出mysql数据到csv文件的方法
Mar 31 PHP
php文件操作之小型留言本实例
Jun 20 PHP
php使用curl并发减少后端访问时间的方法分析
May 12 PHP
用php+ajax新建流程(请假、进货、出货等)
Jun 11 PHP
PHP 数组操作详解【遍历、指针、函数等】
May 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
PHP的反射类ReflectionClass、ReflectionMethod使用实例
2014/08/05 PHP
CodeIgniter生成静态页的方法
2016/05/17 PHP
php文件系统处理方法小结
2016/05/23 PHP
Zend Framework前端控制器用法示例
2016/12/11 PHP
php实现文章评论系统
2019/02/18 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
2019/04/16 PHP
Javascript中Eval函数的使用说明
2008/10/11 Javascript
利用JQuery的load函数动态加载其它页面的内容的实现代码
2010/12/14 Javascript
基于JavaScript 下namespace 功能的简单分析
2013/07/05 Javascript
jQuery背景插件backstretch使用指南
2015/04/21 Javascript
window.location.hash知识汇总
2015/11/09 Javascript
分享javascript、jquery实用代码段
2016/10/20 Javascript
js实现文字选中分享功能
2017/01/25 Javascript
深入浅出webpack之externals的使用
2017/12/04 Javascript
高性能的javascript之加载顺序与执行原理篇
2018/01/14 Javascript
JS拖动选择table里的单元格完整实例【基于jQuery】
2019/05/28 jQuery
vue+django实现一对一聊天功能的实例代码
2019/07/17 Javascript
p5.js临摹动态图形实现方法详解
2019/10/23 Javascript
Nodejs技巧之Exceljs表格操作用法示例
2019/11/06 NodeJs
详解vue高级特性
2020/06/09 Javascript
[02:29]完美世界高校联赛上海赛区回顾
2015/12/15 DOTA
分析Python的Django框架的运行方式及处理流程
2015/04/08 Python
Python中title()方法的使用简介
2015/05/20 Python
win与linux系统中python requests 安装
2016/12/04 Python
Django使用httpresponse返回用户头像实例代码
2018/01/26 Python
Python实现点阵字体读取与转换的方法
2019/01/29 Python
Python中的 sort 和 sorted的用法与区别
2019/08/10 Python
对django的User模型和四种扩展/重写方法小结
2019/08/17 Python
Django--权限Permissions的例子
2019/08/28 Python
美国最大的团购网站:Groupon
2016/07/23 全球购物
美国在线眼镜商城:Eyeglasses.com
2017/06/26 全球购物
Kickers鞋英国官网:男士、女士和儿童鞋
2021/03/08 全球购物
一些Solaris面试题
2015/12/22 面试题
2014年社区妇联工作总结
2014/12/02 职场文书
博士给导师的自荐信
2015/03/06 职场文书
php png失真的原因及解决办法
2021/11/17 PHP