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 相关文章推荐
珊瑚虫IP库浅析
Feb 15 PHP
Mysql和网页显示乱码解决方法集锦
Mar 27 PHP
PHP注释实例技巧
Oct 03 PHP
php学习笔记 PHP面向对象的程序设计
Jun 13 PHP
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
Jul 01 PHP
php教程 插件机制在PHP中实现方案
Nov 02 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
Jan 27 PHP
PHP数据类型的总结分析
Jun 13 PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
Feb 15 PHP
LAMP环境使用Composer安装Laravel的方法
Mar 25 PHP
php 字符串中是否包含指定字符串的多种方法
Apr 12 PHP
php 实现银联商务H5支付的示例代码
Oct 12 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生成二维码的方法汇总
2015/07/22 PHP
PHP执行shell脚本运行程序不产生core文件的方法
2016/12/28 PHP
Django中的cookie与session操作实例代码
2017/08/17 PHP
DOM相关内容速查手册
2007/02/07 Javascript
超级简单的图片防盗(HTML),好用
2007/04/08 Javascript
JSON 学习之JSON in JavaScript详细使用说明
2010/02/23 Javascript
js function使用心得
2010/05/10 Javascript
javaScript的函数对象的声明详解
2015/02/06 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
jQuery AjaxUpload 上传图片代码
2016/02/02 Javascript
JavaScript实现点击按钮字体放大、缩小
2016/02/29 Javascript
JS中input表单隐藏域及其使用方法
2017/02/13 Javascript
JS实现监控微信小程序的原理
2018/06/15 Javascript
layui 实现加载动画以及非真实加载进度的方法
2019/09/23 Javascript
微信小程序获取当前时间及星期几的实例代码
2020/09/20 Javascript
小程序角标的添加及绑定购物车数量进行实时更新的实现代码
2020/12/07 Javascript
解读Python中degrees()方法的使用
2015/05/18 Python
构建Python包的五个简单准则简介
2015/06/15 Python
python 简单的多线程链接实现代码
2016/08/28 Python
通过5个知识点轻松搞定Python的作用域
2016/09/09 Python
python的pandas工具包,保存.csv文件时不要表头的实例
2018/06/14 Python
python通过TimedRotatingFileHandler按时间切割日志
2019/07/17 Python
Django models.py应用实现过程详解
2019/07/29 Python
Python实现子类调用父类的初始化实例
2020/03/12 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
2020/03/14 Python
Charlotte Tilbury英国官网:英国彩妆品牌
2017/05/26 全球购物
一站式跨境收款解决方案:Payoneer(派安盈)
2018/09/06 全球购物
电脑租赁公司创业计划书
2014/01/08 职场文书
大学毕业感言100字
2014/02/03 职场文书
护士毕业实习感言
2014/03/05 职场文书
父母对孩子说的话
2014/04/12 职场文书
借款担保书范文
2014/05/13 职场文书
个人担保书范文
2014/05/20 职场文书
党员对照检查材料
2014/09/22 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书
教你做个可爱的css滑动导航条
2021/06/15 HTML / CSS