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 相关文章推荐
Windows2003 下 MySQL 数据库每天自动备份
Dec 21 PHP
PHP 替换模板变量实现步骤
Aug 24 PHP
《PHP编程最快明白》第八讲:php启发和小结
Nov 01 PHP
浅析PKI加密解密 OpenSSL
Jul 01 PHP
php实现图片缩放功能类
Dec 18 PHP
PHP实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
May 10 PHP
php匹配字符中链接地址的方法
Dec 22 PHP
PHP开发中AJAX技术的简单应用
Dec 11 PHP
PHP模板引擎Smarty中变量的使用方法示例
Apr 11 PHP
PHP接收App端发送文件流的方法
Sep 23 PHP
PHP foreach遍历多维数组实现方式
Nov 16 PHP
Laravel框架实现超简单的分页效果示例
Feb 08 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
无线电广播与收音机发展的历史回眸
2021/03/02 无线电
搜索引擎技术核心揭密
2006/10/09 PHP
第六节--访问属性和方法
2006/11/16 PHP
php mysql 封装类实例代码
2016/09/18 PHP
ThinkPHP打水印及设置水印位置的方法
2016/10/14 PHP
PHP实现根据数组某个键值大小进行排序的方法
2018/03/13 PHP
PHP扩展Swoole实现实时异步任务队列示例
2019/04/13 PHP
PHP通过文件保存和更新信息的方法分析
2019/09/12 PHP
Javascript中的常见排序算法
2007/03/27 Javascript
将字符串转换成gb2312或者utf-8编码的参数(js版)
2013/04/10 Javascript
jquery ui dialog替代confirm实例分析
2016/01/25 Javascript
js仿支付宝填写支付密码效果实现多方框输入密码
2016/03/09 Javascript
Express之get,pos请求参数的获取
2017/05/02 Javascript
vue-router实现webApp切换页面动画效果代码
2017/05/25 Javascript
详解微信小程序 登录获取unionid
2017/06/27 Javascript
JS运动特效之链式运动分析
2018/01/24 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
2018/12/29 Javascript
基于vue框架手写一个notify插件实现通知功能的方法
2019/03/31 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
深入理解webpack process.env.NODE_ENV配置
2020/02/23 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
Python算法之图的遍历
2017/11/16 Python
Tensorflow中的placeholder和feed_dict的使用
2018/07/09 Python
OpenCV+python手势识别框架和实例讲解
2018/08/03 Python
python元组的概念知识点
2019/11/19 Python
Python短信轰炸的代码
2020/03/25 Python
CSS3系列教程:背景图片(背景大小和多背景图) 应用说明
2012/12/19 HTML / CSS
使用iframe+postMessage实现页面跨域通信的示例代码
2020/01/14 HTML / CSS
约瑟夫·特纳男装:Joseph Turner
2017/10/10 全球购物
《草原的早晨》教学反思
2014/04/08 职场文书
储备店长岗位职责
2015/04/14 职场文书
代理词怎么写
2015/05/25 职场文书
第一军规观后感
2015/06/12 职场文书
三年级作文之趣事作文
2019/11/04 职场文书
原生JS封装vue Tab切换效果
2021/04/28 Vue.js
Java中CyclicBarrier和CountDownLatch的用法与区别
2021/08/23 Java/Android