Laravel怎么使用Docker部署_Laravel容器化开发教程【现代】

1次阅读

laravel新项目需先chmod +x artisan并挂载.env,用php:8.2-apache镜像;dockerfile中启用pdo_sqlite、bcmath扩展;db_host填服务名而非localhost;storage/权限问题通过user: “33:33″或统一uid解决。

Laravel怎么使用Docker部署_Laravel容器化开发教程【现代】

laravel new 生成的项目怎么直接跑进 Docker?

别先写 docker-compose.yml,更别急着改 php.ini —— Laravel 官方脚手架默认不兼容标准 PHP-FPM 镜像,因为缺 artisan 可执行权限和 .env 加载时机问题。

  • 新建项目后立刻执行:chmod +x artisan,否则容器里运行 php artisan serve 会报 Permission denied
  • .env 文件必须在容器启动前挂载进去,不能靠 docker cp 后补;否则 APP_KEY 为空导致 500 internal Server Error
  • 开发阶段推荐用 php:8.2-apache 镜像而非 php:8.2-fpm + nginx 分离,省掉 socket 通信调试——apache2-foreground 启动快、日志直出、public/ 路径默认就对

Dockerfile 里 RUN composer install 为什么总失败?

不是 Composer 版本问题,是 Laravel 10+ 默认要求 ext-pdo_sqliteext-bcmath,而官方 php:8.2-cli 镜像没开这些扩展。

  • 必须显式启用:在 RUN 前加 docker-php-ext-install pdo_sqlite bcmath
  • 别用 composer install --no-interaction,Laravel 的 post-install-cmd 会尝试清空 bootstrap/cache/,但该目录在多阶段构建中可能被覆盖成只读,改用 composer install --no-scripts,后续再单独跑 php artisan config:clear
  • 缓存 Composer 依赖:把 vendor/ 单独作为 volume 挂载到宿主机(如 ./vendor:/var/www/vendor),避免每次 docker build 都重装

docker-compose.yml 中 DB_HOST 怎么设才不连不上 mysql

127.0.0.1localhost 是最常见错误——Docker 容器内 localhost 指自己,不是宿主机,也不是同 Compose 网络里的其他服务。

  • 必须填服务名:比如 MySQL 服务定义为 mysql:,那 .env 里就得写 DB_HOST=mysql
  • 启动顺序要管:Laravel 容器启动时 MySQL 可能还没 ready,depends_on 只控制启动顺序,不等端口就绪;加个健康检查或用 wait-for-it.sh 脚本更靠谱
  • MySQL 镜像要用 mysql:8.0mysql:5.7 明确版本,别用 latest——Laravel 10 不支持 MySQL 8.1+ 的默认认证插件,得加 command: --default-authentication-plugin=mysql_native_password

本地开发时 storage/logs/laravel.log 权限总是 600 怎么办?

容器里 PHP 进程 UID 默认是 www-data (33),但宿主机挂载的 storage/ 目录属主是当前用户(比如 UID 1001),导致日志写不进、缓存生成失败、500 错误无提示。

  • 不要在 Dockerfile 里 chown -R www-data:www-data storage/ —— 挂载后权限会被覆盖;改用 user: "33:33"docker-compose.yml 中指定运行 UID/GID
  • 或者统一 UID:在宿主机创建用户 useradd -u 33 -g 33 laravel,再把 storage/ 归属改成它,一劳永逸
  • 临时调试可加 php artisan storage:linkpublic/storage,但注意这个命令也受 UID 限制,得在容器内以 www-data 身份运行

真正卡住人的从来不是 Dockerfile 写几行,而是 storage/bootstrap/cache/ 这两个目录的 UID 同步、.env 加载时机、以及 MySQL 服务名写错这三件事。其它都是表象。

text=ZqhQzanResources