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扩展” 的解决方法
Apr 16 PHP
封装一个PDO数据库操作类代码
Sep 09 PHP
PHP 设置MySQL连接字符集的方法
Jan 02 PHP
PHP include_path设置技巧分享
Jul 03 PHP
如何判断php数组的维度
Jun 10 PHP
php缓存技术详细总结
Aug 07 PHP
ThinkPHP分组下自定义标签库实例
Nov 01 PHP
CI(CodeIgniter)模型用法实例分析
Jan 20 PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
Jul 06 PHP
php socket通信简单实现
Nov 18 PHP
使用laravel的migrate创建数据表的方法
Sep 30 PHP
PHP 代码简洁之道(小结)
Oct 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
轻松修复Discuz!数据库
2008/05/03 PHP
PHP EOT定界符的使用详解
2008/09/30 PHP
如何在PHP中使用正则表达式进行查找替换
2013/06/13 PHP
PHP生成短网址的3种方法代码实例
2014/07/08 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
2016/11/09 PHP
php获取文章内容第一张图片的方法示例
2017/07/03 PHP
基于Jquery实现的一个图片滚动切换
2012/06/21 Javascript
Node.js模块加载详解
2014/08/16 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
jQuery中not()方法用法实例
2015/01/06 Javascript
JS数组array元素的添加和删除方法代码实例
2015/06/01 Javascript
图解js图片轮播效果
2015/12/20 Javascript
jQuery获取与设置iframe高度的方法
2016/08/01 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
2016/09/12 Javascript
微信小程序 配置文件详细介绍
2016/12/14 Javascript
修改Nodejs内置的npm默认配置路径方法
2018/05/13 NodeJs
JS实现常见的查找、排序、去重算法示例
2018/05/21 Javascript
Vue自定义属性实例分析
2019/02/23 Javascript
layui 对table中的数据进行转义的实例
2019/09/12 Javascript
vue实现学生信息管理系统
2020/05/30 Javascript
python快速排序代码实例
2013/11/21 Python
python使用any判断一个对象是否为空的方法
2014/11/19 Python
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
2015/03/06 Python
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
python数据结构之链表的实例讲解
2017/07/25 Python
Scrapy框架使用的基本知识
2018/10/21 Python
深入浅析Python 中 is 语法带来的误解
2019/05/07 Python
Python绘制堆叠柱状图的实例
2019/07/09 Python
python 生成任意形状的凸包图代码
2020/04/16 Python
python使用bs4爬取boss直聘静态页面
2020/10/10 Python
最好的意大利皮夹克:D’Arienzo
2018/12/04 全球购物
违反校纪校规检讨书
2014/02/15 职场文书
2014派出所所长群众路线对照检查材料思想汇报
2014/09/18 职场文书
教师廉洁自律个人总结
2015/02/10 职场文书
心灵点滴观后感
2015/06/02 职场文书
Windows server 2012 NTP时间同步的实现
2022/06/25 Servers