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各种编码集详解和以及在什么情况下进行使用
Sep 11 PHP
php像数组一样存取和修改字符串字符
Mar 21 PHP
PHP ajax 异步执行不等待执行结果的处理方法
May 27 PHP
php简单判断两个字符串是否相等的方法
Jul 13 PHP
smarty高级特性之对象的使用方法
Dec 25 PHP
php实现购物车功能(上)
Jul 23 PHP
浅析php如何实现App常用的秒发功能
Aug 03 PHP
php版微信数据统计接口用法示例
Oct 12 PHP
thinkPHP+ajax实现统计页面pv浏览量的方法
Mar 15 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
Mar 31 PHP
php根据地址获取百度地图经纬度的实例方法
Sep 03 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
Oct 24 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实现Socket服务器的代码
2008/04/03 PHP
php内存缓存实现方法
2015/01/24 PHP
php实现通用的信用卡验证类
2015/03/24 PHP
PHP类相关知识点实例总结
2016/09/28 PHP
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
document.getElementById方法在Firefox与IE中的区别
2010/05/18 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
jQuery随便控制任意div隐藏的方法
2013/06/28 Javascript
JQuery文字列表向上滚动的代码
2013/11/13 Javascript
Nodejs进程管理模块forever详解
2014/06/01 NodeJs
jQuery中first()方法用法实例
2015/01/06 Javascript
浅谈javascript的Touch事件
2015/09/27 Javascript
全面解析Bootstrap中nav、collapse的使用方法
2016/05/22 Javascript
jQuery实现联动下拉列表查询框
2017/01/04 Javascript
Angular弹出模态框的两种方式
2017/10/19 Javascript
基于ionic实现下拉刷新功能
2018/05/10 Javascript
vue-cli3+ts+webpack实现多入口多出口功能
2019/05/30 Javascript
解决layer.open弹出框不能获取input框的值为空的问题
2019/09/10 Javascript
基于vue和bootstrap实现简单留言板功能
2020/05/30 Javascript
python进阶教程之动态类型详解
2014/08/30 Python
初步理解Python进程的信号通讯
2015/04/09 Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
2016/02/18 Python
Python如何判断数独是否合法
2016/09/08 Python
numpy实现合并多维矩阵、list的扩展方法
2018/05/08 Python
django实现日志按日期分割
2020/05/21 Python
python实现数字炸弹游戏程序
2020/07/17 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
美国班级戒指、帽子和礼服、毕业产品、年鉴:Balfour
2018/11/01 全球购物
阿迪达斯新加坡官方网站:adidas新加坡
2019/12/06 全球购物
家长会演讲稿范文
2014/01/10 职场文书
小学教师师德师风演讲稿
2014/08/22 职场文书
居委会四风问题个人对照检查材料
2014/09/25 职场文书
检讨书1000字
2014/10/11 职场文书
党性修养心得体会2016
2016/01/21 职场文书
《槐乡的孩子》教学反思
2016/02/20 职场文书
GoFrame基于性能测试得知grpool使用场景
2022/06/21 Golang