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+SQL 注入攻击的技术实现以及预防办法
Dec 29 PHP
PHP 中检查或过滤IP地址的实现代码
Nov 27 PHP
win7+apache+php+mysql环境配置操作详解
Jun 10 PHP
php 获取SWF动画截图示例代码
Feb 10 PHP
ThinkPHP模板判断输出Defined标签用法详解
Jun 30 PHP
PHP的cURL库简介及使用示例
Feb 06 PHP
PHP微信开发之模板消息回复
Jun 24 PHP
php版银联支付接口开发简明教程
Oct 14 PHP
php中isset与empty函数的困惑与用法分析
Jul 05 PHP
Laravel Eloquent ORM 多条件查询的例子
Oct 10 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
Jan 26 PHP
php + ajax 实现的写入数据库操作简单示例
May 16 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 5.0创建图形的巧妙方法
2010/10/12 PHP
PHP使用memcache缓存技术提高响应速度的方法
2014/12/26 PHP
php简单备份与还原MySql的方法
2016/05/09 PHP
微信支付之JSAPI公众号支付详解
2019/05/15 PHP
laravel5.6实现数值转换
2019/10/23 PHP
跟我一起学写jQuery插件开发方法(附完整实例及下载)
2010/04/01 Javascript
js常用数组操作方法简明总结
2014/06/20 Javascript
JS实现仿京东淘宝竖排二级导航
2014/12/08 Javascript
jQuery中Form相关知识汇总
2015/01/06 Javascript
js实现模拟计算器退格键删除文字效果的方法
2015/05/07 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
原生js实现鼠标跟随效果
2017/02/28 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
2017/09/06 jQuery
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
详解小程序缓存插件(mrc)
2018/08/17 Javascript
vue forEach循环数组拿到自己想要的数据方法
2018/09/21 Javascript
nodejs中实现修改用户路由功能
2019/05/24 NodeJs
javascript中undefined的本质解析
2019/07/31 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
Vue-cli assets SubDirectory及PublicPath区别详解
2020/08/18 Javascript
python中Genarator函数用法分析
2015/04/08 Python
python函数形参用法实例分析
2015/08/04 Python
分享Python字符串关键点
2015/12/13 Python
Python实现一个转存纯真IP数据库的脚本分享
2017/05/21 Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
2017/11/20 Python
解决DataFrame排序sort的问题
2018/06/07 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
2019/01/29 Python
python ETL工具 pyetl
2020/06/07 Python
Python库安装速度过慢解决方案
2020/07/14 Python
亲属关系公证书
2014/04/08 职场文书
教师党的群众路线对照检查材料
2014/09/24 职场文书
初三学生语文考试作弊检讨书
2014/12/14 职场文书
外贸采购员岗位职责
2015/04/03 职场文书
创业计划书之情侣餐厅
2019/09/29 职场文书
68行Python代码实现带难度升级的贪吃蛇
2022/01/18 Python
Python如何加载模型并查看网络
2022/07/15 Python