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 discuz 主题表和回帖表的设计
Mar 13 PHP
yii框架源码分析之创建controller代码
Jun 28 PHP
php遍历文件夹和文件列表示例分享
Mar 11 PHP
自定义session存储机制避免会话保持问题
Oct 08 PHP
php动态绑定变量的用法
Jun 16 PHP
PHP foreach遍历多维数组实现方式
Nov 16 PHP
PHP中CheckBox多选框上传失败的代码写法
Feb 13 PHP
关于PHP定时发送服务的解决办法
Apr 23 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
May 29 PHP
Laravel中unique和exists验证规则的优化详解
Jan 28 PHP
Yii框架where查询用法实例分析
Oct 22 PHP
php 使用html5 XHR2实现上传文件与进度显示功能示例
Mar 03 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
C# Assembly类访问程序集信息
2009/06/13 PHP
php disk_free_space 返回目录可用空间
2010/05/10 PHP
php基于表单密码验证与HTTP验证用法实例
2015/01/06 PHP
php通过修改header强制图片下载的方法
2015/03/24 PHP
PDO::query讲解
2019/01/29 PHP
javascript 图片上传预览-兼容标准
2009/06/01 Javascript
jQuery中使用了document和window哪些属性和方法小结
2011/09/13 Javascript
常用Extjs工具:Extjs.util.Format使用方法
2012/03/22 Javascript
js实现在页面上弹出蒙板技巧简单实用
2013/04/16 Javascript
用JavaScript计算在UTF-8下存储字符串占用字节数
2013/08/08 Javascript
用于deeplink的js方法(判断手机是否安装app)
2014/04/02 Javascript
jQuery的:parent选择器定义和用法
2014/07/01 Javascript
JavaScript SHA512&amp;SHA256加密算法详解
2015/08/11 Javascript
使用CSS+JavaScript或纯js实现半透明遮罩效果的实例分享
2016/05/09 Javascript
AngularJS过滤器filter用法实例分析
2016/11/04 Javascript
js输入框使用正则表达式校验输入内容的实例
2017/02/12 Javascript
jQuery复合事件用法示例
2017/06/10 jQuery
移动端触摸滑动插件swiper使用方法详解
2017/08/11 Javascript
angularjs 页面自适应高度的方法
2018/01/17 Javascript
nodejs检测因特网是否断开的解决方案
2019/04/17 NodeJs
更强大的vue ssr实现预取数据的方式
2019/07/19 Javascript
纯js+css实现在线时钟
2020/08/18 Javascript
Vue路由权限控制解析
2020/11/09 Javascript
Pthon批量处理将pdb文件生成dssp文件
2015/06/21 Python
将python代码和注释分离的方法
2018/04/21 Python
python操作日志的封装方法(两种方法)
2019/05/23 Python
Django项目主urls导入应用中views的红线问题解决
2019/08/10 Python
Python任务调度利器之APScheduler详解
2020/04/02 Python
建筑工程专业学生的自我评价
2013/12/25 职场文书
2015年推普周活动方案
2015/05/06 职场文书
个人收入证明范本
2015/06/12 职场文书
新学期新寄语,献给新生们!
2019/11/15 职场文书
MySQL主从搭建(多主一从)的实现思路与步骤
2021/05/13 MySQL
Python连接Postgres/Mysql/Mongo数据库基本操作大全
2021/06/29 Python
使用@Value值注入及配置文件组件扫描
2021/07/09 Java/Android
SpringBoot中使用Redis作为全局锁示例过程
2022/03/24 Java/Android