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 str_pad 函数用法简介
Jul 11 PHP
PHP导入Excel到MySQL的方法
Apr 23 PHP
PHP curl_setopt()函数实例代码与参数分析
Jun 02 PHP
php设计模式 Factory(工厂模式)
Jun 26 PHP
PHP设计模式之调解者模式的深入解析
Jun 13 PHP
Laravel框架学习笔记(一)环境搭建
Oct 15 PHP
PHP 5.3和PHP 5.4出现FastCGI Error解决方法
Feb 12 PHP
php+ajax实现无刷新动态加载数据技术
Apr 28 PHP
彻底搞懂PHP 变量结构体
Oct 11 PHP
php进程daemon化的正确实现方法
Sep 06 PHP
Laravel 错误提示本地化的实现
Oct 22 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
Mar 27 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
使用Sphinx对索引进行搜索
2013/06/25 PHP
php判断页面是否是微信打开的示例(微信打开网页)
2014/04/25 PHP
PHP 正则表达式小结
2015/02/12 PHP
Symfony2学习笔记之插件格式分析
2016/03/17 PHP
项目中应用Redis+Php的场景
2016/05/22 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
jquery实现表单验证简单实例演示
2015/11/23 Javascript
基于jQuery实现二级下拉菜单效果
2016/02/01 Javascript
javascript 常用验证函数总结
2016/06/28 Javascript
seajs学习之模块的依赖加载及模块API的导出
2016/10/20 Javascript
jQuery中map函数的两种方式
2017/04/07 jQuery
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
Javascript中的作用域及块级作用域
2017/12/08 Javascript
基于vue-simplemde实现图片拖拽、粘贴功能
2018/04/12 Javascript
实例详解Node.js 函数
2018/06/10 Javascript
vue 中的keep-alive实例代码
2018/07/20 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
NodeJs入门教程之定时器和队列
2019/03/08 NodeJs
Vue 利用指令实现禁止反复发送请求的两种方法
2019/09/15 Javascript
JavaScript判断浏览器版本的方法
2019/11/03 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
Python学生成绩管理系统简洁版
2020/04/05 Python
Pandas分组与排序的实现
2019/07/23 Python
python模拟实现斗地主发牌
2020/01/07 Python
深入浅析python的第三方库pandas
2020/02/13 Python
基于python实现坦克大战游戏
2020/10/27 Python
HTML5 表单验证失败的提示语问题
2017/07/13 HTML / CSS
团员学习总结的自我评价范文
2013/10/14 职场文书
工商管理专业应届生求职信
2013/11/04 职场文书
两则小学生的自我评价分享
2013/11/14 职场文书
技校生自我鉴定
2013/12/08 职场文书
关于元旦的广播稿
2014/02/16 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
2016年春季运动会通讯稿
2015/11/25 职场文书
为什么RedisCluster设计成16384个槽
2021/09/25 Redis
《火纹风花雪月无双》预告“神秘雇佣兵” 紫发剑客
2022/04/13 其他游戏