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操作xml代码
Jun 17 PHP
php数字转汉字代码(算法)
Oct 08 PHP
TMDPHP 模板引擎使用教程
Mar 13 PHP
zf框架的zend_cache缓存使用方法(zend框架)
Mar 14 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
Jul 23 PHP
php常用的安全过滤函数集锦
Oct 09 PHP
PHP开启opcache提升代码性能
Apr 26 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
Dec 07 PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
May 13 PHP
php metaphone()函数及php localeconv() 函数实例解析
May 15 PHP
PHP多维数组指定多字段排序的示例代码
May 16 PHP
PHP 实现缩略图
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
生成缩略图
2006/10/09 PHP
php重定向的三种方法分享
2012/02/22 PHP
php生成数组的使用示例 php全组合算法
2014/01/16 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
php判断数组中是否存在指定键(key)的方法
2015/03/17 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
JavaScript Event学习第四章 传统的事件注册模型
2010/02/07 Javascript
JavaScript Event学习第七章 事件属性
2010/02/07 Javascript
ExtJs Excel导出并下载IIS服务器端遇到的问题
2011/09/16 Javascript
一个页面放2段图片滚动代码出现冲突的问题如何解决
2012/12/21 Javascript
js 判断图片是否加载完以及实现图片的预下载
2014/08/14 Javascript
浅析在javascript中创建对象的各种模式
2016/05/06 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
Angular2 组件间通过@Input @Output通讯示例
2017/08/24 Javascript
基于js中的存储键值对以及注意事项介绍
2018/03/30 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
解决webpack多页面内存溢出的方法示例
2019/10/08 Javascript
webpack4 配置 ssr 环境遇到“document is not defined”
2019/10/24 Javascript
Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)
2019/11/21 Javascript
JS制作简易计算器的实例代码
2020/07/04 Javascript
js实现简易ATM功能
2020/10/27 Javascript
python 提取文件的小程序
2009/07/29 Python
给Python入门者的一些编程建议
2015/06/15 Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
2016/12/14 Python
python实现闹钟定时播放音乐功能
2018/01/25 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
BookOutlet加拿大:在网上书店购买廉价折扣图书和小说
2018/10/05 全球购物
社团文化节邀请函
2014/01/10 职场文书
销售简历自我评价
2014/01/24 职场文书
2014乡镇党委副书记对照检查材料思想汇报
2014/10/09 职场文书
2014年工商所工作总结
2014/12/09 职场文书
周年庆典答谢词
2015/01/20 职场文书
科级干部培训心得体会
2016/01/06 职场文书
那些美到让人窒息的诗句,值得你收藏!
2019/08/20 职场文书