DB_HOST必须写服务名db而非localhost,因容器间通信依赖Docker内部网络和DNS解析;.env中DB_HOST=db才能正确连接MySQL容器,否则报Connection refused。

laravel 在 Docker 里安装本身不复杂,但「装得对、跑得稳、改得动」这三件事加起来,容易踩坑。
docker-compose.yml 里 DB_HOST 写 localhost 还是 db?
- 容器间通信必须用服务名,不是
localhost或127.0.0.1 - Laravel 的
.env中DB_HOST=db才能连上 MySQL 容器;写成localhost会报Connection refused - Nginx 和 PHP-FPM 是两个容器,PHP 容器访问 MySQL 时走的是 Docker 内部网络,
db是docker-compose.yml中定义的服务名 - 如果你用
php:8.4-fpm镜像但没装pdo_mysql扩展,也会连不上——错误提示可能是Class 'PDO' not found或更隐晦的Driver not found
Dockerfile 构建时 composer install 总失败?
常见原因有这几个:
- 没在
.dockerignore里排除node_modules、vendor、.git,导致构建上下文过大,超时或内存溢出 - Composer 镜像拉取慢(尤其国内),没配阿里云镜像源:
WORKSPACE_COMPOSER_REPO_PACKAGIST=<a href="https://www.php.cn/link/1569ae888190eb8c53b218b0d529e1e9">https://www.php.cn/link/1569ae888190eb8c53b218b0d529e1e9</a> -
composer install在构建阶段执行,但composer.json和composer.lock没 COPY 进去就跑命令,直接报错No composer.json present - 使用了
--no-dev却在本地开发时依赖barryvdh/laravel-debugbar等包,结果页面白屏无提示
php artisan key:generate 在容器里执行不了?
这个命令必须在应用代码已就位、且 config/app.php 可读的前提下运行:
- 如果你把
APP_KEY留空,Laravel 启动时会尝试自动生成,但容器里可能因权限问题写不到storage/目录 - 更稳妥的做法是在构建镜像前生成好:
php artisan key:generate --show,把输出值填进.env,再 COPY 进容器 - 不要依赖容器启动后自动执行该命令——Supervisor 或
entrypoint.sh里漏掉这步,就会卡在Target class [App\Http\Controllers\HomeController] does not exist这类路由异常上
关键点其实就一个:Docker 不是魔法盒,它只是把原本你在宿主机上敲的几条命令,封装进可复现的步骤里。真正复杂的从来不是 Docker 本身,而是你有没有把 Laravel 的运行前提(扩展、权限、配置加载顺序、目录挂载)一项项对齐。漏掉任意一环,表现出来的都是「装不起来」。


















