0

0

在Docker中运行PHP项目的探索之旅

php中文网

php中文网

发布时间:2016-06-20 12:36:10

|

1280人浏览过

|

来源于php中文网

原创

来自: http://dockone.io/article/1037



Docker出现后,容器技术在互联网领域得到了空前的普及,无论是大公司还是屌丝创业公司的码农基本上都会在各种技术社区或者各种演讲会议上了解到过相关技术,我们作为一家屌丝创业公司也不例外,去年对Docker做了一番了解,并在年前测试了一些方案,今天在这里总结一下遇到的各种坑以及踩坑过程中的一些思考,希望能对了解过Docker并且跃跃欲试的同学有点启发,当然更欢迎在这方面有丰富经验的同学给一些建议或者指点。

这篇文章不会提及Docker的理论知识或者基本概念相关的内容,如果想了解Docker的基本使用,Docker的 官方文档是个不错的选择,如果想了解基本的理论,可以参考下coolshell博客上的几篇文章: Docker基础技术:Linux Namespace(上)、 Docker基础技术:Linux Namespace(下)、 Docker基础技术:Linux CGroup、 Docker基础技术:AUFS、 Docker基础技术:DeviceMapper。

一、项目环境

我们项目用的标准的PHP技术栈:PHP-FPM + Nginx,运行在阿里云的ECS上,数据库也是阿里云的服务。

二、缘起

对于一个普通的屌丝创业公司的屌丝项目来说,理论上来说是没必要用太复杂的技术的,对新技术的克制也是码农的一个职业操守。然而我之所以在项目上做这个尝试也并非是想尝试新技术,而是源自于项目上线以来遇到的各种问题,比如前面文章里有提到过的 laravel的性能问题,而HHVM或者PHP7这些新技术都大大提到了性能,一下子全部切换风险太大,所以可以用容器来运行某几个服务测试一下;再比如之前有出现过一个BUG,某个接口出现问题占用内存太高导致整个系统响应超时;再比如,看了各种技术大会上别人分享的经验确实想自己试一下,哈哈。

三、牛刀小试

根据Docker的理念,每个容器都是一个独立的服务,服务之间通过接口相互协作。我们采用的方案是PHP-FPM和Nginx分别跑在不同的容器中,PHP-FPM容器暴露端口给Nginx容器。

容器之间的网络通信最初用的是Docker自带的link,link虽然很简单,但是不太好用,link是通过在容器启动时修改/etc/hosts文件来实现的,当时用的时候遇到的一个问题是被link的容器重启后,这个容器IP变了,但是link的容器里并没有更新(1.10版本对link机制做了修改,不知道是否解决了这个问题,还没具体看),还有一个问题就是当同一个服务需要开多个容器时就搞不定了,当然如果是用集群的方式来跑就更搞不定了,所以link只能在本地开发时玩玩,在生产环境没啥用。最后这部分用的方案是用consul来做服务发现,关于consul就不在这里展开介绍了,有兴趣的同学可以看下这篇文章: Service Discovery for Docker Containers using Consul and Registrator。

然后代码是放在host上,在容器启动时挂载一下代码的目录。根据接口使用的场景将接口分到了几个不同的容器里面去跑,对资源隔离做了下压力测试,符合预期,很满意!然后选了两个容器跑HHVM测试了下,确实性能提高了很多。整个结构如下图所示:

晓象AI资讯阅读神器
晓象AI资讯阅读神器

晓象-AI时代的资讯阅读神器

下载

这样可以正常使用了,然后就是日志的处理,最开始挂载了一个host上的目录用来存放日志,但是这样也不太符合Docker的理念,于是就又弄了个logstash容器,将各种容器的日志写到logstash容器里面去。

然后就是对容器的监控,我们用了oneapm提供的服务,还不错,也有其他一些开源工具的选择,但是用oneapm的服务更方便一些。

一个完整的技术栈就这样搞定了,跑了几天也没出现什么问题。作为一个有追求的码农,当然是要有更高的要求的,后来想到这样一个问题:Docker的理念是容器即是一个完整的服务,但是我们的用法是把在容器内把PHP-FPM跑起来了,代码并不在里面,而是通过目录挂载的方式来实现的,这样就需要在host上面部署好代码,没有完美的实现容器即服务的理念。好,我们追求下完美!

四、完美之路

其实把代码放进容器并不只是为了去追求理念上的完美,还有另外一个用意,那就是基于Docker的CI。基本思路是每次发布都会build一个新版本的镜像,build过程中需要把代码更新到最新版本,然后安装依赖的第三方库以及其他一些业务相关的预处理,build完成后再push到registry,然后在各个节点pull下来,重启容器。整个流程如下图所示:


怎么样?这下完美了吧!如果现实也是那么完美就好了,但是偏偏现实总是会有各种各样的坑等着你!

首先,在没有用这个机制之前,发布一次代码也就几秒钟的事情,merge下分支,然后各个节点pull下代码就可以了,但是用了Docker后,merge分支后就需要build一下镜像,build后再push到registry,然后再到各个节点把镜像pull下来,少说也是要花分钟级别的。这时候有的同学可能会说Docker镜像的原理不是layer机制么,对,确实是layer,每次build只需要更新需要更新的layer就可以,但是还是没办法做到像git那样只更新那几个文件,至少要更新整个项目的代码目录。

其次,之前只需要更新一下代码就可以了,现在却需要把容器重启一下!本来重启容器是很快的,但是在容器里PHP-FPM跑起来后却很慢,我猜测是在执行docker stop时会发一个SIGTERM的信号到容器里的进程,PHP-FPM在处理SIGTERM信号时会做一些清理工作。一个节点至少有几十个容器,每个容器都重启一下非常耗时!

这样本来很简单的一个发布,用了这个「完美」的机制后却需要好几分钟。虽然整个流程完全自动化,但是确实没必要为了完美的理念做出这样一个妥协。

此外还遇到了另外一个非常奇葩的问题:升级到1.10后,容器启动后经常会遇到端口不通的情况,这时候如果进入到容器里发起一次网络请求,比如ping以下某个IP,端口就会恢复正常。用各种工具调试了很久依然没找出来问题在哪,屌丝创业公司也没精力研究这么高深的问题,只好暂时搁置了。

挣扎了很久,最后又回到了老路子。

五、面对现实

虽然没能理念上完美的方案,但是也要让整套架构更方便的扩展,比如在流量高峰期快速上架节点。得益于云计算近几年的发展,这个问题也比较容易解决。前面提到代码是放在host的一个目录,那么基本上每个host只需要三个条件就能够上线:
  • 项目代码目录
  • 安装Docker
  • 配置好salt-minion(用来更新配置文件)


  • 只需要在购买一台ECS后,做完上面的操作,生成一个系统镜像,需要上线新节点时用这个系统镜像来直接配置服务器即可。节点上线后,启动各个容器,通过前面提到的用consul实现的服务发现机制,自动加入集群。

    六、继续探索

    后面打算用Docker Swarm来简单做下集群管理,未来对调度需求比较大时可能会尝试下Mesos或者Kubernetes。不过关于容器的生态链都发展的非常快,可能等需要的时候又有更好的方案了吧。

    简单总结下整个过程的感悟吧,从架构上来说,永远都没有完美的架构,只有最适合自己的架构。从码农角度来说,在做技术选型时最重要的是权衡当前项目需求、团队对各种技术了解的程度以及该技术选型带来的复杂度。切勿看了几个大牛的技术架构分享就在自己项目上跃跃欲试,最后弄的连自己都搞不定还给别人留下一个烂摊子收拾。最后,在项目迭代过程中保持项目的简单的能力永远是衡量一个码农技术的水平的重要标准。

    立即学习PHP免费学习笔记(深入)”;

      热门AI工具

      更多
      DeepSeek
      DeepSeek

      幻方量化公司旗下的开源大模型平台

      豆包大模型
      豆包大模型

      字节跳动自主研发的一系列大型语言模型

      通义千问
      通义千问

      阿里巴巴推出的全能AI助手

      腾讯元宝
      腾讯元宝

      腾讯混元平台推出的AI助手

      文心一言
      文心一言

      文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

      讯飞写作
      讯飞写作

      基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

      即梦AI
      即梦AI

      一站式AI创作平台,免费AI图片和视频生成。

      ChatGPT
      ChatGPT

      最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

      相关专题

      更多
      拼多多赚钱的5种方法 拼多多赚钱的5种方法
      拼多多赚钱的5种方法 拼多多赚钱的5种方法

      在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

      28

      2026.01.26

      edge浏览器怎样设置主页 edge浏览器自定义设置教程
      edge浏览器怎样设置主页 edge浏览器自定义设置教程

      在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

      8

      2026.01.26

      苹果官方查询网站 苹果手机正品激活查询入口
      苹果官方查询网站 苹果手机正品激活查询入口

      苹果官方查询网站主要通过 checkcoverage.apple.com/cn/zh/ 进行,可用于查询序列号(SN)对应的保修状态、激活日期及技术支持服务。此外,查找丢失设备请使用 iCloud.com/find,购买信息与物流可访问 Apple (中国大陆) 订单状态页面。

      31

      2026.01.26

      npd人格什么意思 npd人格有什么特征
      npd人格什么意思 npd人格有什么特征

      NPD(Narcissistic Personality Disorder)即自恋型人格障碍,是一种心理健康问题,特点是极度夸大自我重要性、需要过度赞美与关注,同时极度缺乏共情能力,背后常掩藏着低自尊和不安全感,影响人际关系、工作和生活,通常在青少年时期开始显现,需由专业人士诊断。

      3

      2026.01.26

      windows安全中心怎么关闭 windows安全中心怎么执行操作
      windows安全中心怎么关闭 windows安全中心怎么执行操作

      关闭Windows安全中心(Windows Defender)可通过系统设置暂时关闭,或使用组策略/注册表永久关闭。最简单的方法是:进入设置 > 隐私和安全性 > Windows安全中心 > 病毒和威胁防护 > 管理设置,将实时保护等选项关闭。

      5

      2026.01.26

      2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】
      2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】

      铁路12306提供起售时间查询、起售提醒、购票预填、候补购票及误购限时免费退票五项服务,并强调官方渠道唯一性与信息安全。

      35

      2026.01.26

      个人所得税税率表2026 个人所得税率最新税率表
      个人所得税税率表2026 个人所得税率最新税率表

      以工资薪金所得为例,应纳税额 = 应纳税所得额 × 税率 - 速算扣除数。应纳税所得额 = 月度收入 - 5000 元 - 专项扣除 - 专项附加扣除 - 依法确定的其他扣除。假设某员工月工资 10000 元,专项扣除 1000 元,专项附加扣除 2000 元,当月应纳税所得额为 10000 - 5000 - 1000 - 2000 = 2000 元,对应税率为 3%,速算扣除数为 0,则当月应纳税额为 2000×3% = 60 元。

      12

      2026.01.26

      oppo云服务官网登录入口 oppo云服务登录手机版
      oppo云服务官网登录入口 oppo云服务登录手机版

      oppo云服务https://cloud.oppo.com/可以在云端安全存储您的照片、视频、联系人、便签等重要数据。当您的手机数据意外丢失或者需要更换手机时,可以随时将这些存储在云端的数据快速恢复到手机中。

      40

      2026.01.26

      抖币充值官方网站 抖币性价比充值链接地址
      抖币充值官方网站 抖币性价比充值链接地址

      网页端充值步骤:打开浏览器,输入https://www.douyin.com,登录账号;点击右上角头像,选择“钱包”;进入“充值中心”,操作和APP端一致。注意:切勿通过第三方链接、二维码充值,谨防受骗

      7

      2026.01.26

      热门下载

      更多
      网站特效
      /
      网站源码
      /
      网站素材
      /
      前端模板

      精品课程

      更多
      相关推荐
      /
      热门推荐
      /
      最新课程
      简单聊聊mysql8与网络通信
      简单聊聊mysql8与网络通信

      共1课时 | 811人学习

      c语言项目php解释器源码分析探索
      c语言项目php解释器源码分析探索

      共7课时 | 0.4万人学习

      关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
      php中文网:公益在线php培训,帮助PHP学习者快速成长!
      关注服务号 技术交流群
      PHP中文网订阅号
      每天精选资源文章推送

      Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号