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简单的伪原创程序,配合商城采集用的
Oct 12 PHP
UCenter 批量添加用户的php代码
Jul 17 PHP
phpQuery占用内存过多的处理方法
Nov 13 PHP
Codeigniter实现智能裁剪图片的方法
Jun 12 PHP
php面向对象中static静态属性与方法的内存位置分析
Feb 08 PHP
thinkphp3.x中display方法及show方法的用法实例
May 19 PHP
Yii2中Restful API原理实例分析
Jul 25 PHP
PHP实现的XML操作类【XML Library】
Dec 29 PHP
Win10 下安装配置IIS + MySQL + nginx + php7.1.7
Aug 04 PHP
PHP判断是否是微信打开还是浏览器打开的方法
Feb 27 PHP
php+layui数据表格实现数据分页渲染代码
Oct 26 PHP
TP5框架实现自定义分页样式的方法示例
Apr 05 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实现建立多层级目录的方法
2014/07/19 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
php回调函数处理数组操作示例
2020/04/13 PHP
jQuery简单图表peity.js使用示例
2014/05/02 Javascript
JavaScript jquery及AJAX小结
2016/01/24 Javascript
详解cordova打包成webapp的方法
2017/10/18 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
layui下拉框获取下拉值(select)的例子
2019/09/10 Javascript
vue props 单项数据流实例分享
2020/02/16 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
记一次vue跨域的解决
2020/10/21 Javascript
在JavaScript中查找字符串中最长单词的三种方法(推荐)
2021/01/18 Javascript
python利用正则表达式搜索单词示例代码
2017/09/24 Python
Python获取系统所有进程PID及进程名称的方法示例
2018/05/24 Python
实例讲解Python爬取网页数据
2018/07/08 Python
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
2018/10/17 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
2019/02/19 Python
Pandas透视表(pivot_table)详解
2019/07/22 Python
python3.7 openpyxl 删除指定一列或者一行的代码
2019/10/08 Python
pytorch制作自己的LMDB数据操作示例
2019/12/18 Python
学python最电脑配置有要求么
2020/07/05 Python
Python如何进行时间处理
2020/08/06 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
一款利用html5和css3实现的3D立方体旋转效果教程
2016/04/26 HTML / CSS
HTML5拖拽文件上传的示例代码
2021/03/04 HTML / CSS
美国领先的眼镜和太阳镜在线零售商:Glasses.com
2019/08/26 全球购物
宣传策划类求职信范文
2014/01/31 职场文书
健康教育评估方案
2014/05/25 职场文书
副校长竞聘演讲稿
2014/09/01 职场文书
给校长的一封检讨书
2014/09/20 职场文书
2014年领导班子工作总结
2014/12/11 职场文书
业务员年终工作总结2015
2015/05/28 职场文书
pycharm 如何查看某一函数源码的快捷键
2021/05/12 Python
为什么代码规范要求SQL语句不要过多的join
2021/06/23 MySQL