聊聊 PHP 容器应用的最佳实践

2022-08-16 09:48:11 +08:00
 dzdh
最近公司正在推进容器化建设,主要是扩容方便。
然后有几个问题,问一下。

项目是 laravel 。那么附带的还有他的 queue 和 cron artisan schedule:run 。

是都放在一个容器里吗?弄个 supervisor 启动 nginx 、fpm 、cron -f 、和 queue:work ?

总觉得哪里不对,有啥最佳实践推荐一下吗?
3403 次点击
所在节点    问与答
38 条回复
cooper
2022-08-16 09:49:24 +08:00
我们就是一个 docker 中,没啥不好。已经用三年了。
XiLingHost
2022-08-16 09:49:37 +08:00
ss098
2022-08-16 10:00:16 +08:00
可以构建成一个容器,但不要在一个容器内使用 supervisor 或其他进程管理工具启动,要作为多个容器启动。
dzdh
2022-08-16 10:02:28 +08:00
@ss098

emmm.. 构建成 1 个容器 .... 多个容器启动。 啥。

一个 image ,根据参数启动不同的进程作为独立 container 是吧。
shoaly
2022-08-16 10:06:24 +08:00
@XiLingHost 这个是啥? readme 里面光做了一个 logo , 有点蒙蒙的
LexLuth0r
2022-08-16 10:26:01 +08:00
一个 Pod 中启动多个 container ,如 nginx 、php-fpm 服务、queue 服务。如果 queue 启动较多防止单个 Pod 资源不足,queue 服务也可以单独部署在一个 Pod 中,cron 同理。如果某一个 container 会频繁扩容就单独放到一个 Pod 中方便增加副本数。
dzdh
2022-08-16 10:29:46 +08:00
@LexLuth0r 不是 k8s 呢
zyh94946
2022-08-16 10:35:36 +08:00
不是 k8s 用什么?
xuelu520
2022-08-16 10:38:09 +08:00
我们的 laravel 项目,queue 和 console 的脚本都有单独的容器来。
Rache1
2022-08-16 10:38:17 +08:00
镜像都是同一个,queue 和 schedule 这些可以放到一个单独的容器里面去跑,使用 queue 使用 supervisor 守护
dusu
2022-08-16 10:51:15 +08:00
肯定拆开来用 docker compose
redis mysql 这种放一个容器
升级起来不是要命么
而且基本上他们升级频率不高吧

另外 简单说两个坑 可自行试试
1. network 如果用 bridge ,性能可能会比裸跑低 30%
2. 不用 volume ,用挂载代码,性能可能会比裸跑扣一半以上
dusu
2022-08-16 10:57:39 +08:00
@dusu 哦 看错了 没有 redis/mysql😥
nginx 的话基本上看业务会不会后期扩展了
如果会就拆出来 如果不考虑就放一块
queue 和 cron 可以考虑同镜像不同容器
y830CAa5nink4rUQ
2022-08-16 11:12:52 +08:00
说一下我的做法,目前感觉用起来非常舒服:

web 一个容器,里面用 supervisor 同时跑 nginx + php-fpm
queue 、cron 单独一个容器

#3 三楼所说的「不要在一个容器内使用 supervisor 」不适用于传统 php 项目
leo108
2022-08-16 11:22:09 +08:00
#13 传统 PHP 项目也是可以把 PHP 和 Nginx 拆开成两个容器的
shuimugan
2022-08-16 11:44:21 +08:00
上 nginx unit 就可以把 php 和 nginx 二合一了
goodSleep
2022-08-16 11:46:40 +08:00
我们没用容器,但是 artisan queue supervisor 都是单独部了一套业务
dzdh
2022-08-16 11:52:48 +08:00
@shuimugan #14 一直没研究明白这个东西。这个东西没有配置文件。必须只能是 http post 配置然后存在内存里吗?
dzdh
2022-08-16 11:53:18 +08:00
@dusu #11

compose 一个 service 的存储是共享的吗?
reter
2022-08-16 11:55:37 +08:00
没有人规定容器里面不能使用 supervisor 。

但是容器只能监控第一个启动进程,如果使用了 supervisor ,那么容器监控到的是 supervisor 状态,而不是具体服务的状态。
在容器内使用 supervisor 带来比较明显的缺点:
- 进程监控( docker 只能看到 supervisor 的存在,无法感知 supervisor 背后启动的服务, 比如 docker ps )
- 日志管理(如果服务直接往 stdout 输出日志,日期可以被 docker 收集,如果加了 supervisor 显然不能直接收集)
- 信号处理+服务重启 (docker 重启服务时,会先向进程发送信号 SIGTERM ,此时服务可进行后续处理,超时才发送 SIGKILL. 使用 supervisor 可能需要进行额外配置,同时重启 supervisor 会将后面所有的服务都重启)

同时一个服务一个容器,可以很好的利用现有的容器监控方案,然而使用 supervisor 就失去了这些优势。

没有人规定容器里面不能使用 supervisor 。
y830CAa5nink4rUQ
2022-08-16 12:07:23 +08:00
@leo108
#14
分是能分,但是呢,传统 php 项目经常在 nginx 、fpm 共用 public 文件目录的。

典型情况是 fpm 保存文件到 public/uploads 目录,nginx 提供静态文件服务,分开了会很麻烦。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/873113

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX