最近在公司搭建最新版本的 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 就可以很好的理解部署思路,这相当于某种意义上的标准化,避免了每个人习惯的差异导致部署方式的千差万别。

好了,本文到此结束,欢迎大家交流自己的看法。

Demo 仓库地址: https://github.com/yunxi177/laravel12_template