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+JS无限级可伸缩菜单详解(简单易懂)
Jan 02 PHP
用PHP程序实现支持页面后退的两种方法
Jun 30 PHP
php getimagesize 上传图片的长度和宽度检测代码
May 15 PHP
解析thinkphp的左右值无限分类
Jun 20 PHP
php数组删除元素示例
Mar 21 PHP
PHP防止注入攻击实例分析
Nov 03 PHP
thinkphp的静态缓存用法分析
Nov 29 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
Mar 21 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
Apr 21 PHP
php获取一定范围内取N个不重复的随机数
May 28 PHP
php封装的mongodb操作类代码
Aug 06 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
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
2006/10/09 PHP
php 变量定义方法
2009/06/14 PHP
PHP 导出数据到淘宝助手CSV的方法分享
2010/02/27 PHP
发款php蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
2020/03/02 PHP
使用JavaScript实现Java的List功能(实例讲解)
2013/11/07 Javascript
js打开新窗口方法整理
2014/02/17 Javascript
深入分析JQuery和JavaScript的异同
2014/10/23 Javascript
Vue.JS入门教程之处理表单
2016/12/01 Javascript
jquery插件bootstrapValidator表单验证详解
2016/12/15 Javascript
jQuery实现对网页节点的增删改查功能示例
2017/09/18 jQuery
手把手教你用Node.js爬虫爬取网站数据的方法
2018/07/05 Javascript
Vue cli3 库模式搭建组件库并发布到 npm的流程
2018/10/12 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
2019/09/06 Javascript
[02:55]含熏伴清风,风行者至宝、屠夫身心及典藏宝瓶二展示
2020/09/08 DOTA
在Python 3中实现类型检查器的简单方法
2015/07/03 Python
详解Python中contextlib上下文管理模块的用法
2016/06/28 Python
更改Ubuntu默认python版本的两种方法python-&gt; Anaconda
2016/12/18 Python
在Django中输出matplotlib生成的图片方法
2018/05/24 Python
在python中使用requests 模拟浏览器发送请求数据的方法
2018/12/26 Python
用python一行代码得到数组中某个元素的个数方法
2019/01/28 Python
Python类如何定义私有变量
2020/02/03 Python
python实现梯度法 python最速下降法
2020/03/24 Python
html5+css3之制作header实例与更新
2020/12/21 HTML / CSS
科尔士百货公司官网:Kohl’s
2016/07/11 全球购物
阿迪达斯奥地利官方商城:adidas.at
2016/10/16 全球购物
美国畅销的跑步机品牌:ProForm
2017/02/06 全球购物
关于Java finally的面试题
2016/04/27 面试题
自我介绍演讲稿
2014/01/15 职场文书
2014年基层党组织公开承诺书
2014/03/29 职场文书
党的群众路线教育实践活动心得体会(乡镇)
2014/11/03 职场文书
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
爱心捐款活动总结
2015/05/09 职场文书
Python基础之Socket通信原理
2021/04/22 Python