Docker无法自动启动Laravel服务问题排查求助
我用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命令。
最终验证步骤
- 停止并删除现有容器:
docker-compose down - 重新构建backend镜像:
docker-compose build backend - 启动所有服务:
docker-compose up -d - 查看backend容器日志确认启动状态:
若日志中出现docker logs lerenlerentool_backendLaravel development server started: http://0.0.0.0:8000,说明服务启动成功。
内容的提问来源于stack exchange,提问作者Tygo Iedema

