You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Docker规范部署带调度与队列的Laravel应用

Laravel Docker部署优化方案

一、核心思路:混合模式兼顾便捷性与可维护性

不用非选其一,推荐采用「基础镜像打包依赖+代码挂载共享」的混合方案,同时解决静态资源访问、开发效率、进程启动三个核心问题:

  • 自定义PHP-FPM镜像仅打包Laravel运行必需的依赖(PHP扩展、Composer、环境配置),不包含应用代码
  • 通过Docker共享卷将应用代码挂载到所有PHP-FPM容器和Nginx容器,既支持开发时热更新,又让Nginx直接读取静态资源
  • 针对队列、调度进程,在docker-compose.yml中通过command覆盖默认启动命令,实现进程的Docker化管理

二、具体实现步骤

1. 优化自定义PHP-FPM镜像

Dockerfile示例:

FROM php:8.2-fpm

# 安装Laravel必备扩展
RUN docker-php-ext-install mbstring pdo_mysql
RUN pecl install redis && docker-php-ext-enable redis

# 安装Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# 设置工作目录
WORKDIR /var/www/html

# 仅保留基础运行环境,不复制应用代码

2. 配置Docker Compose共享卷

通过命名卷实现代码共享,同时分别定义各服务的启动命令:

version: '3.8'

volumes:
  app-code: # 生产环境用命名卷保证代码一致性;开发环境可替换为绑定挂载
  db-data:

services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - app-code:/var/www/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf # 自定义Nginx配置
    depends_on:
      - app-fpm

  app-fpm:
    build: ./php-fpm
    volumes:
      - app-code:/var/www/html
    environment:
      - APP_ENV=production
      - DB_HOST=mariadb

  queue-fpm:
    build: ./php-fpm
    volumes:
      - app-code:/var/www/html
    environment:
      - APP_ENV=production
      - DB_HOST=mariadb
    command: php artisan queue:work redis --tries=3 --timeout=60 # 启动队列消费进程

  scheduler-fpm:
    build: ./php-fpm
    volumes:
      - app-code:/var/www/html
    environment:
      - APP_ENV=production
      - DB_HOST=mariadb
    command: |
      bash -c "while true; do php artisan schedule:run --verbose --no-interaction; sleep 60; done" # 模拟调度任务循环执行

  mariadb:
    image: mariadb:10.11
    volumes:
      - db-data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=your_root_pwd
      - MYSQL_DATABASE=laravel_app

3. 配置Nginx访问静态资源

nginx.conf示例:

server {
    listen 80;
    root /var/www/html/public;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass app-fpm:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Nginx直接从共享卷读取public目录下的静态资源,无需经过PHP-FPM。

4. 开发与生产环境适配

  • 开发环境:将app-code卷替换为绑定挂载:./your-laravel-app:/var/www/html,实现代码修改后容器自动同步
  • 生产环境:可通过CI/CD流程先将代码同步到命名卷(比如用临时容器执行composer install --no-dev),或给镜像添加代码版本标签,配合私有仓库实现版本化部署

三、额外优化建议

  • 队列进程可添加--daemon参数(Laravel 8+),或用Supervisor管理进程,提升稳定性
  • 调度任务的sleep 60可根据需求调整,确保每分钟执行一次schedule:run
  • 生产环境建议开启PHP-FPM的进程守护、Nginx的缓存配置,提升性能

内容的提问来源于stack exchange,提问作者Gregor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:43:14