直接用 docker-symfony 栈可省去80%踩坑,避免php扩展缺失、nginx fastcgi_pass指向错误、mysql启动顺序紊乱三大问题;需手动配置hosts映射symfony.localhost,database_url主机名必须为db而非localhost,首次启动需等待php和nginx日志显示就绪,且注意var/cache权限问题。

直接用 docker-symfony 这个现成栈,比从零写 Dockerfile 和 docker-compose.yml 快得多,也少踩 80% 的坑——尤其对 Symfony 5/6 应用。
为什么别自己写 docker-compose.yml 初版
自己搭 Nginx + PHP-FPM + MySQL 容器,最容易卡在三处:PHP 扩展没装全(比如 pdo_mysql、zip、opcache)、Nginx 配置里 fastcgi_pass 指向错误(该写 php:9000 却写了 localhost:9000)、MySQL 连接超时(容器启动顺序没控制好,app 启动时 db 还没 ready)。docker-symfony 已预设健康检查、依赖顺序和默认扩展,省掉反复 docker-compose logs php 查错的时间。
symfony.localhost 域名必须手动加 hosts
不加这行,浏览器打不开应用,但错误表现是“无法连接到服务器”,不是 404 或 502——容易误判为 Nginx 没跑起来。执行:
echo '127.0.0.1 symfony.localhost' | sudo tee -a /etc/hosts
Windows 用户需用管理员权限打开记事本,编辑 C:\Windows\System32\drivers\etc\hosts;Mac/Linux 用户注意 sudo 不可省略。改完不用重启 Docker,但浏览器要硬刷新(Cmd+Shift+R 或 Ctrl+F5)。
DATABASE_URL 主机名必须是 db,不是 localhost
Symfony ≥ 4 项目,.env 里的 DATABASE_URL 写成 mysql://root:password@localhost:3306/symfony 是错的——容器内 localhost 指向自己,不是数据库容器。必须改成:
DATABASE_URL="mysql://root:password@db:3306/symfony"
其中 db 是 docker-compose.yml 里服务的名称,Docker 内置 DNS 会自动解析。如果用了自定义网络名或别名,得同步改 docker-compose.yml 的 services.db.networks 配置,否则连不上。
首次 docker-compose up 后要等日志停住再访问
终端持续滚动 php_1 | [23-May-2026 23:05:12] NOTICE: fpm is running, pid 1 这类日志才算 PHP 容器真正就绪;Nginx 日志出现 nginx_1 | 2026/05/23 23:05:15 [notice] 1#1: start worker processes 才代表 Web 层可用。中间如果看到 php_1 | Doctrine\DBAL\Exception\ConnectionException,说明数据库还没初始化完,等 10–20 秒再刷页面,别急着删容器重来。
最常被忽略的是缓存目录权限:var/cache 在容器里属 www-data,但宿主机挂载后可能变成 root,导致后续 bin/console cache:clear 失败。进容器执行 chown -R www-data:www-data var/cache 能临时解决,长期方案是在 docker-compose.yml 的 php 服务里加 user: "33:33"(对应 www-data UID/GID)。











