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网上调查系统
Oct 09 PHP
PHP_MySQL教程-第一天
Mar 18 PHP
解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别
Jun 24 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
Sep 23 PHP
如何写php守护进程(Daemon)
Dec 30 PHP
PHP常见的6个错误提示及解决方法
Jul 07 PHP
PHP+jquery+CSS制作头像登录窗(仿QQ登陆)
Oct 20 PHP
CI框架常用函数封装实例
Nov 21 PHP
php之可变函数的实例详解
Sep 13 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
Sep 04 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
May 28 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
Jul 18 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
解决phpmyadmin 乱码,支持gb2312和utf-8
2006/11/20 PHP
php array_intersect()函数使用代码
2009/01/14 PHP
PHP 身份证号验证函数
2009/05/07 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
基于php实现的php代码加密解密类完整实例
2016/10/12 PHP
YII分模块加载路由的实现方法
2018/10/01 PHP
PHP的PDO大对象(LOBs)
2019/01/27 PHP
PHP基于面向对象封装的分页类示例
2019/03/15 PHP
jQuery点击后一组图片左右滑动的实现代码
2012/08/16 Javascript
Javascript 数组排序详解
2014/10/22 Javascript
跟我学习javascript的call(),apply(),bind()与回调
2015/11/16 Javascript
JS实现简单的tab切换选项卡效果
2016/09/21 Javascript
vue+vue-validator 表单验证功能的实现代码
2017/11/13 Javascript
Vue创建头部组件示例代码详解
2018/10/23 Javascript
微信小程序事件对象中e.target和e.currentTarget的区别详解
2019/05/08 Javascript
JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解
2019/08/16 Javascript
Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
2020/04/27 Javascript
[27:02]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第三场
2014/05/24 DOTA
django1.8使用表单上传文件的实现方法
2016/11/04 Python
Django中ORM表的创建和增删改查方法示例
2017/11/15 Python
Python Unittest根据不同测试环境跳过用例的方法
2018/12/16 Python
python+opencv实现高斯平滑滤波
2020/07/21 Python
python 格式化输出百分号的方法
2019/01/20 Python
python实现两张图片的像素融合
2019/02/23 Python
pandas如何处理缺失值
2019/07/31 Python
python实现3D地图可视化
2020/03/25 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
2020/07/30 Python
pycharm 的Structure界面设置操作
2021/02/05 Python
HTML5网页音乐播放器的示例代码
2017/11/09 HTML / CSS
网络安全方面的面试题
2016/01/07 面试题
跟单业务员岗位职责
2014/03/08 职场文书
聘任书的写作格式及范文
2014/03/29 职场文书
会议邀请函
2015/01/30 职场文书
个人工作违纪检讨书
2015/05/05 职场文书
初级职称评定工作总结
2015/08/13 职场文书
使用Spring处理x-www-form-urlencoded方式
2021/11/02 Java/Android