nginx Docker:如何以Docker的方式组织Laravel应用程序的时间表和队列

vyswwuz2  于 5个月前  发布在  Nginx
关注(0)|答案(2)|浏览(70)

嘿,
几天来,我试图为我的Laravel应用程序找到一个好的解决方案。我使用Docker和Docker compose来组织我的堆栈,并将其拆分为以下服务:

  • Nginx服务请求
  • PHP-FPM用于处理从Nginx传递到Laravel应用程序的请求
  • PHP-FPM用于处理Laravel应用程序的队列
  • PHP-FPM用于处理Laravel应用程序的时间表
  • MariaDB作为数据库

PHP-FPM的服务使用相同的自定义Docker镜像,为Laravel应用程序添加必要的文件。
我的问题是,我不知道我应该如何提供我的Laravel应用程序的文件到服务。我可以想到两种方法:
1.复制自定义Dockerfile中的文件。使用这种方法,我可以通过自定义注册表部署我的应用程序,并通过更改docker-compose.yml中的入口点来启动队列和时间表。缺点是我不知道Nginx应该如何访问容器中的文件,尤其是静态资产。这也使开发过程变得更加困难。
1.将文件作为卷绑定到容器中。这解决了(几乎)第一种方法的所有缺点,但我想不出一个好的解决方案来启动队列和调度工人(以Docker的方式)。
我会非常感谢任何帮助和有用的建议。在阅读了很多问题在这里在SO和其他博客文章和观看一些YouTube视频后,我非常非常困惑。

vs91vp4v

vs91vp4v1#

你可以在Dockerfile中安装supervisor并在其中运行必要的服务:cron,php-fpm,queue。

Dockerfile

FROM php:7.2-fpm-alpine
RUN set -ex \
  && apk add --update \
  ...
  supervisor

COPY supervisord.conf /etc/supervisord.conf

ADD crontab /etc/cron.d/laravel-cron
RUN chmod 0644 /etc/cron.d/laravel-cron \
    && crontab /etc/cron.d/laravel-cron

ENTRYPOINT ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisord.conf"]

字符串

supervisord.conf

[supervisord]
nodaemon=true

[unix_http_server]
file=/tmp/supervisord.sock
chmod=0700

[program:cron]
command=/usr/sbin/crond -f -l 8
stdout_logfile=/dev/stdout
stderr_logfile=/dev/stderr
stdout_logfile_maxbytes=0
stderr_logfile_maxbytes=0
autorestart=true
priority=10

[supervisorctl]
serverurl=unix:///tmp/supervisord.sock

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[program:php-fpm]
command=php-fpm -F
autorestart=true
autorestart=true
priority=5
stdout_events_enabled=true
stderr_events_enabled=true

[include]
files = /etc/supervisor/conf.d/*.conf

crontab

* * * * * cd /var/www/crm && php artisan schedule:run >> /dev/null 2>&1

1sbrub3j

1sbrub3j2#

在dockerish的方式下,你可以做的是将服务分离到不同的容器中,这样队列和cron作业就不会影响你的基本主应用程序。

# Dockerfile
FROM php:8.1-fpm

# Other Dockerfile codes

EXPOSE 9000
CMD ["php-fpm"]

# End of Dockerfile 

# docker-compose.yml

version: '3'
services:
  
  #PHP Service
  laravel-app:
    image: laravel-app # Build the application image based on Dockerfile present in the root directory 
    build:
      context: .
      dockerfile: Dockerfile
    container_name: laravel-app
    tty: true
    environment:
      SERVICE_NAME: laravel-app
      SERVICE_TAGS: dev
    working_dir: /var/www
    volumes:
       - ./:/var/www
       - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
    networks:
      - laravel-network

  # Queue Worker Service
  laravel-queue-worker:
    image: laravel-app  # Reference the existing image built for laravel-app
    container_name: laravel-queue-worker
    tty: true
    environment:
      SERVICE_NAME: laravel-queue-worker
      SERVICE_TAGS: dev
    working_dir: /var/www
    volumes:
      - ./:/var/www
      - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
    networks:
      - laravel-network
    command: php artisan queue:work --queue=default --sleep=3 --tries=3 --max-time=3600
    restart: always 
  # Scheduler Service
  laravel-scheduler-worker:
    image: laravel-app  # Reference the existing image built for laravel-app
    container_name: laravel-scheduler-worker
    tty: true
    environment:
      SERVICE_NAME: laravel-scheduler-worker
      SERVICE_TAGS: dev
    working_dir: /var/www
    volumes:
      - ./:/var/www
      - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
    networks:
      - laravel-network
    command: php artisan schedule:run
    restart: always 
#Docker Networks
networks:
  laravel-network:
    name: laravel-network
    driver: bridge

字符串
在这里,我们首先创建laravel应用程序镜像,然后使用同一镜像在单独的容器中运行队列工作器和任务调度器。您的nginx服务将仅从laravel-app容器提供服务。

相关问题