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 相关文章推荐
用PHP4访问Oracle815
Oct 09 PHP
php小型企业库存管理系统的设计与实现代码
May 16 PHP
深入phpMyAdmin的安装与配置的详细步骤
May 07 PHP
深入解析PHP垃圾回收机制对内存泄露的处理
Jun 14 PHP
PHP 安全检测代码片段(分享)
Jul 05 PHP
PHP读取文件内容后清空文件示例代码
Mar 18 PHP
php生成短网址示例
May 05 PHP
PHP浮点数精度问题汇总
May 13 PHP
php使用socket post数据到其它web服务器的方法
Jun 02 PHP
php 一维数组的循环遍历实现代码
Apr 10 PHP
php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】
Apr 18 PHP
PHP远程连接oracle数据库操作实现方法图文详解
Apr 11 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
利用ajax和PHP实现简单的流程管理
2017/03/23 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
2017/10/07 PHP
JavaScript 高级语法介绍
2009/06/15 Javascript
jQuery+CSS 半开折叠效果原理及代码(自写)
2013/03/04 Javascript
js获取URL的参数的方法(getQueryString)示例
2013/09/29 Javascript
js判断页面中是否有指定控件的简单实例
2014/03/04 Javascript
JQuery做的一个简单的点灯游戏分享
2014/07/16 Javascript
node.js中的require使用详解
2014/12/15 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
2016/10/09 Javascript
Bootstrap常用组件学习(整理)
2017/03/24 Javascript
Vue基于NUXT的SSR详解
2017/10/24 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
2017/12/04 Javascript
Vue slot用法(小结)
2018/10/22 Javascript
js实现简单模态框实例
2018/11/16 Javascript
vue实现跳转接口push 转场动画示例
2019/11/01 Javascript
[57:22]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第五场
2018/04/10 DOTA
[03:11]TI9战队档案 - Alliance
2019/08/20 DOTA
Python中encode()方法的使用简介
2015/05/18 Python
Django学习笔记之ORM基础教程
2018/03/27 Python
python TKinter获取文本框内容的方法
2018/10/11 Python
python 对给定可迭代集合统计出现频率,并排序的方法
2018/10/18 Python
Python 数据库操作 SQLAlchemy的示例代码
2019/02/18 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
CSS3使用transition属性实现过渡效果
2018/04/18 HTML / CSS
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
amazeui 验证按钮扩展的实现
2020/08/21 HTML / CSS
南京迈特望C/C++面试题
2012/07/09 面试题
小学语文教学反思
2014/02/10 职场文书
关于青春的演讲稿三分钟
2014/08/22 职场文书
党员民主生活会整改措施
2014/09/26 职场文书
摩登时代观后感
2015/06/03 职场文书
《工作是最好的修行》读后感3篇
2019/12/13 职场文书
postgreSQL数据库基础知识介绍
2022/04/12 PostgreSQL
使用CSS定位HTML元素的实现方法
2022/07/07 HTML / CSS
mysqldump进行数据备份详解
2022/07/15 MySQL