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
java EJB 加密与解密原理的一个例子
Jan 11 PHP
PHP 递归效率分析
Nov 24 PHP
php5.3 废弃函数小结
May 16 PHP
PHP编码转换函数 自动转换字符集支持数组转换
Dec 16 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
Oct 30 PHP
php动态生成版权所有信息的方法
Mar 24 PHP
PHP易混淆知识整理笔记
Sep 24 PHP
php微信公众平台开发(一) 配置接口
Dec 06 PHP
PHP-CGI远程代码执行漏洞分析与防范
May 07 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
Nov 17 PHP
laravel 解决groupBy时出现的错误 isn't in Group By问题
Oct 17 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 多维数组排序实现代码
2009/08/05 PHP
PHP教程 基本语法
2009/10/23 PHP
php解析url的三个示例
2014/01/20 PHP
10个对初学者非常有用的PHP技巧
2016/04/06 PHP
php 指定范围内多个随机数代码实例
2016/07/18 PHP
图像替换新技术 状态域方法
2010/01/28 Javascript
jquery实现鼠标滑过显示提示框的方法
2015/02/05 Javascript
jQuery焦点图轮播特效代码分享(3款)
2015/09/05 Javascript
详解使用vue脚手架工具搭建vue-webpack项目
2017/05/10 Javascript
微信小程序对接七牛云存储的方法
2017/07/30 Javascript
基于vue实现分页效果
2017/11/06 Javascript
Vue表单控件绑定图文详解
2019/02/11 Javascript
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
vue - vue.config.js中devServer配置方式
2019/10/30 Javascript
Vue实现商品飞入购物车效果(电商项目)
2019/11/26 Javascript
基于JavaScript的数据结构队列动画实现示例解析
2020/08/06 Javascript
JavaScript仿京东轮播图效果
2021/02/25 Javascript
Python3爬虫学习之将爬取的信息保存到本地的方法详解
2018/12/12 Python
Tensorflow 实现分批量读取数据
2020/01/04 Python
Python dict的常用方法示例代码
2020/06/23 Python
PyTorch中clone()、detach()及相关扩展详解
2020/12/09 Python
css3实现超炫风车特效
2014/11/12 HTML / CSS
CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解
2020/06/01 HTML / CSS
CSS3动画和HTML5新特性详解
2020/08/31 HTML / CSS
洛杉矶健身中心女性专用运动服饰品牌:Marika
2018/05/09 全球购物
加拿大城市本地限时优惠:Buytopia.ca
2018/09/19 全球购物
武汉东之林科技有限公司机试
2013/09/17 面试题
介绍一下Mysql的存储引擎
2015/02/12 面试题
工厂厂长岗位职责
2013/11/08 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
人事文员岗位职责
2015/02/04 职场文书
SQLServer2019 数据库环境搭建与使用的实现
2021/04/08 SQL Server
Mysql中存储引擎的区别及比较
2021/06/04 MySQL
Java版 简易五子棋小游戏
2022/05/04 Java/Android
介绍一下28个JS常用数组方法
2022/05/06 Javascript