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的FTP学习(四)
Oct 09 PHP
PHP5新特性: 更加面向对象化的PHP
Nov 18 PHP
php Undefined index的问题
Jun 01 PHP
通过php快速统计某个数据库中每张表的数据量
Sep 04 PHP
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
Jan 14 PHP
PHP反射使用实例和PHP反射API的中文说明
Jul 02 PHP
PHP文件缓存类实现代码
Oct 26 PHP
Thinkphp框架开发移动端接口(2)
Aug 18 PHP
PHP读取zip文件的方法示例
Nov 17 PHP
windows环境下使用Composer安装ThinkPHP5
May 18 PHP
php获取用户真实IP和防刷机制的实例代码
Nov 28 PHP
PHP7 新增常量
Mar 09 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/04/09 日漫
PHP HTML代码串截取代码
2008/12/29 PHP
PHP中变量引用与变量销毁机制分析
2014/11/15 PHP
PHP5多态性与动态绑定介绍
2015/04/03 PHP
php设计模式之委托模式
2016/02/13 PHP
PHP+Ajax 检测网络是否正常实例详解
2016/12/16 PHP
PHP获取数组中单列值的方法
2017/06/10 PHP
PHPMAILER实现PHP发邮件功能
2018/04/18 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
JavaScript学习笔记之获取当前目录的实现代码
2010/12/14 Javascript
javascript实现无缝上下滚动特效
2015/12/16 Javascript
AngularJS过滤器详解及示例代码
2016/08/16 Javascript
jQuery常用样式操作实例分析(获取、设置、追加、删除、判断等)
2016/09/08 Javascript
利用JQuery直接调用asp.net后台的简单方法
2016/10/27 Javascript
JavaScript常用正则函数用法示例
2017/01/23 Javascript
基于Vue实现图书管理功能
2017/10/17 Javascript
vue.js过滤器+ajax实现事件监听及后台php数据交互实例
2018/05/22 Javascript
基于Vue 实现一个中规中矩loading组件
2019/04/03 Javascript
详解JWT token心得与使用实例
2019/08/02 Javascript
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
15个简单的JS编码标准让你的代码更整洁(小结)
2020/07/16 Javascript
Python 代码性能优化技巧分享
2012/08/07 Python
Python和JavaScript间代码转换的4个工具
2016/02/22 Python
python urllib urlopen()对象方法/代理的补充说明
2017/06/29 Python
Python for循环生成列表的实例
2018/06/15 Python
Python高级特性与几种函数的讲解
2019/03/08 Python
python实现的生成word文档功能示例
2019/08/23 Python
HTML5实现WebSocket协议原理浅析
2014/07/07 HTML / CSS
FirstCry阿联酋儿童和婴儿产品网上购物:FirstCry.ae
2021/02/22 全球购物
村委会换届选举方案
2014/05/03 职场文书
文明之星事迹材料
2014/05/09 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
志愿者服务活动总结报告
2015/05/06 职场文书
MySQL基础(一)
2021/04/05 MySQL
Django分页器的用法你都了解吗
2021/05/26 Python
SpringBoot集成Druid连接池连接MySQL8.0.11
2021/07/02 Java/Android