最近在公司搭建最新版本的 Laravel 开发环境,对 docker 部署进行了进一步的优化,我们之前的项目是把定时任务 Cron 和 API 在同一个容器里启动的,这显然不太符合容器的最佳实践,借着这次框架搭建的契机,我决定优化一下这个问题。
环境如下:
Laravel : 12
PHP : 8. 4
我们把项目跑在两个容器里,一个是 API 的容器,另一个是 Supervisor 的容器,把 Cron 和 Jobs 放在放在 Supervisor 里执行。
这样就能避免维护过多的容器。在后期做 CI/CD 也会更加方便。
Supervisor 使用和 PHP 一样的 Dockerfile 因为 Supervisor 会用到 PHP 环境来起 Laravel 的 Jobs。
整体方案就是这样来做的,比较简单, 文末我会放一个 git 仓库地址,感兴趣的可以可以进一步了解,接下来讲讲一些细节。
Cron 的配置我们放在了 Dockerfile 里来配置,当然你也可以放在 entrypoint.sh
里来做。
RUN echo "* * * * * /usr/local/bin/php /var/www/artisan schedule:run >> /var/log/cron.log 2>&1" | crontab -
我们的 docker compose 配置如下:
services:
php:
build:
context: ./
command: ["php", "artisan", "serve", "--host=0.0.0.0", "--port=8000"]
ports:
- "8000:8000"
volumes:
- .:/var/www
supervisor:
restart: always
container_name: supervisor
build:
context: ./
entrypoint: ["supervisord"]
command: ["-c", "/etc/supervisor/supervisord.conf"]
volumes:
- ./docker/supervisor/:/etc/supervisor/
- ./storage/supervisor/:/var/log/supervisor/
Supervisor 容器把日志和配置文件映射到了物理机上,方便后续配置和排查问题。
关于 Dockerfile 我们除了必须的 PHP 环境,还包含了 Supervisor 和 Cron 。
好了,到此基本上就结束了,我们在容器化的道路上又进了一步,最近对容器化有了更深的理解,在这里分享一下。
容器化让部署和迁移成本变低了,这会让我们与云厂商平台进行解耦,你可以很方便的迁移程序到其他云厂商。
其次容器化让部署变得更透明了,如果用物理机部署没有充分的文档说明,换一个人部署服务成本会很高。容器化降低了这种成本,团队内部只要了解 docker 就可以很好的理解部署思路,这相当于某种意义上的标准化,避免了每个人习惯的差异导致部署方式的千差万别。
好了,本文到此结束,欢迎大家交流自己的看法。