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

Docker无法自动启动Laravel服务问题排查求助

Laravel Docker容器无法自动启动服务,需手动执行serve命令

我用React、Sass、Laravel结合Docker开发项目,但Docker没法自动启动Laravel服务,页面一直无限加载。必须进入Laravel项目目录手动执行php artisan serve才能正常运行。

项目目录结构

my-project/   
├── backend/   
│ └── (Laravel 文件)   
├── frontend/   
│ └── (React 文件)  
├── docker/   
│ ├── backend/  
│     └── Dockerfile  
│ ├── frontend/   
│     └── Dockerfile   
└── docker-compose.yml  

docker-compose.yml 配置

version: '3.8'

services:
  backend:
    build:
      context: ../  # 项目根目录
      dockerfile: docker/backend/Dockerfile  # Dockerfile路径
    image: lerenlerentool-backend
    container_name: lerenlerentool_backend
    restart: unless-stopped
    working_dir: /var/www
    entrypoint: php artisan serve --host=0.0.0.0
    volumes:
      - ../backend:/var/www  # 将本地backend目录映射到容器内
      - ./backend/php-local.ini:/usr/local/etc/php/conf.d/local.ini
    ports:
      - "8000:8000"
    networks:
      - app-network
    environment:
      - APP_ENV=local
      - APP_DEBUG=true
      - APP_KEY=base64:ertrdSfHv01dD/4R6N6acsRQW+hLn3MTNmk84ypaW4I=
      - DB_HOST=127.0.0.1
      - DB_PORT=3306
      - DB_DATABASE=lerenlerentool
      - DB_USERNAME=test
      - DB_PASSWORD=1234
    depends_on:
      - db

  frontend:
    build:
      context: ../
      dockerfile: docker/frontend/Dockerfile
    image: lerenlerentool-frontend
    container_name: lerenlerentool_frontend
    restart: unless-stopped
    ports:
      - "3000:80"
    volumes:
      - ../frontend:/app
      - /app/node_modules
    networks:
      - app-network

  db:
    image: mysql:8.0
    container_name: lerenlerentool_db
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: lerenlerentool
      MYSQL_USER: test
      MYSQL_PASSWORD: 1234
      MYSQL_ROOT_PASSWORD: 1234
    volumes:
      - dbdata:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - app-network

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: lerenlerentool_phpmyadmin
    restart: unless-stopped
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: 1234
    ports:
      - "8080:80"
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

volumes:
  dbdata:

Backend Dockerfile 配置

# 使用带FPM支持的PHP镜像
FROM php:8.2-fpm

# 安装必要的PHP扩展依赖
RUN apt-get update && apt-get install -y libpng-dev libjpeg-dev libfreetype6-dev zip git unzip

# 安装Composer用于Laravel依赖管理
COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer

# 设置Laravel项目工作目录
WORKDIR /var/www/backend

RUN apt-get update && apt-get install -y \
    libpng-dev libjpeg-dev libfreetype6-dev \
    libonig-dev libzip-dev zip unzip git curl \
    && docker-php-ext-install pdo pdo_mysql bcmath mbstring

# 安装PDO MySQL扩展
RUN docker-php-ext-install pdo_mysql

# 将Laravel项目文件复制到容器内
COPY backend /var/www/backend  

# 安装Laravel依赖
RUN composer install --optimize-autoloader --no-dev

# 安装Node.js和npm(如果需要处理静态资源)
RUN curl -sL https://deb.nodesource.com/setup_22.x | bash - \
    && apt-get install -y nodejs

# 设置容器启动命令
CMD php artisan serve --host=0.0.0.0 --port=8000

# 暴露端口
EXPOSE 8000

已尝试的修改

  • 调整Dockerfile中的启动命令:
    CMD php artisan serve --host=0.0.0.0 --port=8000
    
  • 调整docker-compose.yml中的entrypoint:
    entrypoint: php artisan serve --host=0.0.0.0
    

问题分析与解决方案

核心问题1:目录映射与工作目录不匹配

docker-compose中backend服务的working_dir设为/var/www,同时把本地../backend映射到容器的/var/www,但Dockerfile构建时设置的工作目录是/var/www/backend,导致容器启动后执行php artisan serve时,找不到项目根目录下的artisan文件(路径混乱)。

修正方案:
统一目录配置,修改docker-compose.yml中backend服务的配置:

working_dir: /var/www/backend
volumes:
  - ../backend:/var/www/backend  # 修正映射路径,与Dockerfile工作目录一致
  - ./backend/php-local.ini:/usr/local/etc/php/conf.d/local.ini

核心问题2:数据库连接配置错误

docker-compose中backend的DB_HOST=127.0.0.1,但在Docker容器内,127.0.0.1指向容器自身,无法连接到db容器中的MySQL服务,会导致Laravel启动失败或页面加载异常。

修正方案:
修改backend服务的环境变量,将DB_HOST改为MySQL服务的容器名db:

environment:
  - APP_ENV=local
  - APP_DEBUG=true
  - APP_KEY=base64:ertrdSfHv01dD/4R6N6acsRQW+hLn3MTNmk84ypaW4I=
  - DB_HOST=db  # 替换为mysql服务名
  - DB_PORT=3306
  - DB_DATABASE=lerenlerentool
  - DB_USERNAME=test
  - DB_PASSWORD=1234

核心问题3:Entrypoint与CMD冲突

docker-compose中设置的entrypoint会覆盖Dockerfile里的CMD,如果entrypoint命令的执行路径不对,会导致启动失败。

修正方案:
保留docker-compose的entrypoint并指定完整命令(确保在正确目录执行):

entrypoint: php artisan serve --host=0.0.0.0 --port=8000

或者直接删除docker-compose中的entrypoint,使用Dockerfile里的CMD命令。

最终验证步骤

  1. 停止并删除现有容器:
    docker-compose down
    
  2. 重新构建backend镜像:
    docker-compose build backend
    
  3. 启动所有服务:
    docker-compose up -d
    
  4. 查看backend容器日志确认启动状态:
    docker logs lerenlerentool_backend
    
    若日志中出现Laravel development server started: http://0.0.0.0:8000,说明服务启动成功。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:35:00