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编程之高级技巧
Aug 27 PHP
php adodb操作mysql数据库
Mar 19 PHP
php include和require的区别深入解析
Jun 17 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
Aug 21 PHP
php实现根据字符串生成对应数组的方法
Sep 22 PHP
PHP中__FILE__、dirname与basename用法实例分析
Dec 01 PHP
PHP实现支付宝即时到账功能
Dec 21 PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
Apr 20 PHP
php两点地理坐标距离的计算方法
Dec 29 PHP
Laravel timestamps 设置为unix时间戳的方法
Oct 11 PHP
laravel框架分组控制器和分组路由实现方法示例
Jan 25 PHP
禁止直接访问php文件代码分享
May 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 a simple smtp class
2007/11/26 PHP
PHP操作MongoDB时的整数问题及对策说明
2011/05/02 PHP
php socket实现的聊天室代码分享
2014/08/16 PHP
Smarty模板简单配置与使用方法示例
2016/05/23 PHP
PHP微信刮刮卡 附微信接口
2016/07/22 PHP
laravel学习教程之存取器
2016/07/30 PHP
基于php流程控制语句和循环控制语句(讲解)
2017/10/23 PHP
PHP里的$_GET数组介绍
2019/03/22 PHP
laravel框架的安装与路由实例分析
2019/10/11 PHP
JS实现简单的Canvas画图实例
2013/07/04 Javascript
深入理解JavaScript是如何实现继承的
2013/12/12 Javascript
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
2018/09/03 Javascript
实例讲解JS中pop使用方法
2019/01/27 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
17道题让你彻底理解JS中的类型转换
2019/08/08 Javascript
js动态添加带圆圈序号列表的实例代码
2021/02/18 Javascript
使用Python的Treq on Twisted来进行HTTP压力测试
2015/04/16 Python
利用Python命令行传递实例化对象的方法
2016/11/02 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
Python 面向对象之类class和对象基本用法示例
2020/02/02 Python
使用Python对Dicom文件进行读取与写入的实现
2020/04/20 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
pycharm使用技巧之自动调整代码格式总结
2020/11/04 Python
Html5实现文件异步上传功能
2017/05/19 HTML / CSS
canvas绘制树形结构可视图形的实现
2020/04/03 HTML / CSS
Chain Reaction Cycles俄罗斯:世界上最大的在线自行车商店
2019/08/27 全球购物
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
do you have any Best Practice for testing
2016/06/04 面试题
机械设计职业生涯规划书
2013/12/27 职场文书
2014年营业员工作总结
2014/11/18 职场文书
2014年幼儿园保育工作总结
2014/12/02 职场文书
银行求职自荐信范文
2015/03/04 职场文书
工作态度检讨书范文
2015/05/06 职场文书
2015年度电厂个人工作总结
2015/05/13 职场文书
Python OpenCV 图像平移的实现示例
2021/06/04 Python