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 相关文章推荐
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
Jan 15 PHP
PHP_MySQL教程-第一天
Mar 18 PHP
基于PHP读取csv文件内容的详解
Jun 18 PHP
浅析php过滤html字符串,防止SQL注入的方法
Jul 02 PHP
PHP运行SVN命令显示某用户的文件更新记录的代码
Jan 03 PHP
PHP命名空间(namespace)的动态访问及使用技巧
Aug 18 PHP
PHP的伪随机数与真随机数详解
May 27 PHP
详解yii2实现分库分表的方案与思路
Feb 03 PHP
php使用Jpgraph创建3D饼形图效果示例
Feb 15 PHP
PHP判断是否是微信打开,浏览器打开的方法
Mar 14 PHP
浅谈PHP5.6 与 PHP7.0 区别
Oct 09 PHP
PHP copy函数使用案例代码解析
Sep 01 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
《星际争霸》各版本雷兽特点图文解析 雷兽不同形态一览
2020/03/02 星际争霸
15种PHP Encoder的比较
2007/03/06 PHP
PHP 获取远程文件内容的函数代码
2010/03/24 PHP
PHP中ajax无刷新上传图片与图片下载功能
2017/02/21 PHP
PHP Trait功能与用法实例分析
2020/06/03 PHP
解决jquery submit()提交表单提示:f[s] is not a function
2013/01/23 Javascript
浅谈关于JavaScript的语言特性分析
2013/04/11 Javascript
JS 加入收藏夹的代码(主流浏览器通用)
2013/05/13 Javascript
使用jquery修改表单的提交地址基本思路
2014/06/04 Javascript
jQuery的:parent选择器定义和用法
2014/07/01 Javascript
JS实现弹出居中的模式窗口示例
2016/06/20 Javascript
Jquery Easyui选项卡组件Tab使用详解(10)
2016/12/18 Javascript
加载 vue 远程代码的组件实例详解
2017/11/20 Javascript
angular4中*ngFor不能对返回来的对象进行循环的解决方法
2018/09/12 Javascript
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
Vue作用域插槽实现方法及作用详解
2020/07/08 Javascript
Python之PyUnit单元测试实例
2014/10/11 Python
Python中urllib2模块的8个使用细节分享
2015/01/01 Python
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
python友情链接检查方法
2015/07/08 Python
python实现决策树ID3算法的示例代码
2018/05/30 Python
Python字符串逆序输出的实例讲解
2019/02/16 Python
python导入库的具体方法
2020/06/18 Python
python读取excel数据绘制简单曲线图的完整步骤记录
2020/10/30 Python
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
美国南部最大的家族百货公司:Belk
2017/01/30 全球购物
写一个方法1000的阶乘
2012/11/21 面试题
社区精神文明建设汇报材料
2014/08/17 职场文书
投资入股合作协议书
2014/10/28 职场文书
2015年计划生育责任书
2015/05/08 职场文书
经费申请报告
2015/05/15 职场文书
雨中的树观后感
2015/06/03 职场文书
用python自动生成日历
2021/04/24 Python
Tomcat弱口令复现及利用
2022/05/06 Servers
分享几个实用的CSS代码块
2022/06/10 HTML / CSS
MySQL 原理与优化之Limit 查询优化
2022/08/14 MySQL