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中$this-&amp;gt;含义分析
Nov 29 PHP
PHP字符串处理的10个简单方法
Jun 30 PHP
php 文件缓存函数
Oct 08 PHP
通过PHP修改Linux或Unix口令的方法分享
Jan 30 PHP
php自动加载机制的深入分析
Jun 08 PHP
php环境下利用session防止页面重复刷新的具体实现
Jan 09 PHP
php的ajax简单实例
Feb 27 PHP
制作安全性高的PHP网站的几个实用要点
Dec 30 PHP
PHP将二维数组某一个字段相同的数组合并起来的方法
Feb 26 PHP
Symfony2实现在controller中获取url的方法
Mar 18 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
Sep 22 PHP
Ubuntu中支持PHP5与PHP7双版本的简单实现
Aug 19 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 等比例缩放图片详解及实例代码
2016/09/18 PHP
ext checkboxgroup 回填数据解决
2009/08/21 Javascript
Jquery 插件学习实例1 插件制作说明与tableUI优化
2010/04/02 Javascript
JS方法调用括号的问题探讨
2014/01/24 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史
2015/01/09 Javascript
JQ实现新浪游戏首页幻灯片
2015/07/29 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
移动端界面的适配
2017/01/11 Javascript
微信小程序 开发之顶部导航栏实例代码
2017/02/23 Javascript
win系统下nodejs环境安装配置
2017/05/04 NodeJs
详解为Bootstrap Modal添加拖拽的方法
2018/01/05 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
2018/07/10 Javascript
NodeJs 实现简单WebSocket即时通讯的示例代码
2019/08/05 NodeJs
原生js+css调节音量滑块
2020/01/15 Javascript
IDEA配置jQuery, $符号不再显示黄色波浪线的问题
2020/10/09 jQuery
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
使用jquery实现轮播图效果
2021/01/02 jQuery
[01:34]2016国际邀请赛中国区预选赛IG战队教练采访
2016/06/27 DOTA
[56:20]LGD vs VP Supermajor 败者组决赛 BO3 第三场 6.10
2018/07/04 DOTA
python里大整数相乘相关技巧指南
2014/09/12 Python
在Python中测试访问同一数据的竞争条件的方法
2015/04/23 Python
Python实现的json文件读取及中文乱码显示问题解决方法
2018/08/06 Python
Python 正则表达式匹配字符串中的http链接方法
2018/12/25 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
2019/01/14 Python
Python3中lambda表达式与函数式编程讲解
2019/01/14 Python
python实现文件助手中查看微信撤回消息
2019/04/29 Python
python__new__内置静态方法使用解析
2020/01/07 Python
PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解
2020/11/02 Python
python 读取串口数据的示例
2020/11/09 Python
暑假实习求职信范文
2013/09/22 职场文书
幼儿园消防演练方案
2014/02/13 职场文书
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书
在教室放鞭炮的检讨书
2014/09/28 职场文书
毕业欢送会致辞
2015/07/29 职场文书
聘用合同范本
2015/09/21 职场文书
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技