用Docker装Symfony的核心是长期稳定、团队一致、调试顺手:选PHP 8.1+预装intl等扩展的官方镜像,用docker-compose编排多服务并共用自定义网络,通过环境变量注入APP_ENV而非改.env,启用Xdebug或交互终端确保可调试。

用 Docker 装 Symfony,核心不是“能不能跑”,而是“能不能长期稳定、团队一致、开发调试顺手”。关键在于跳过手动装 PHP/NGINX/MySQL 的老路,直接用容器定义好环境边界和协作规则。
选对基础镜像,别卡在 PHP 版本上
Symfony 6+ 推荐 PHP 8.1 或更高,但不能只看版本号。要确认镜像里已预装关键扩展:intl、mbstring、pdo_mysql、zip、opcache。官方 php:8.2-cli 或 php:8.3-apache 镜像较稳妥; Alpine 镜像虽小,但 intl 扩展编译易出错,新手建议优先用 Debian/Ubuntu 基础镜像。
示例 Dockerfile 开头:
FROM php:8.3-apache
RUN apt-get update && apt-get install -y \
libicu-dev \
libzip-dev \
&& docker-php-ext-install -j$(nproc) intl zip pdo_mysql opcache \
&& a2enmod rewrite
用 docker-compose 管理多服务,不硬编码端口和路径
Web 服务、数据库、Redis、甚至 Mailhog(用于本地邮件测试)都该作为独立 service 写进 docker-compose.yml。重点是:
- PHP 容器挂载代码目录到 /var/www/html(Apache 默认)或 /app(CLI/FPM 常用),保持路径清晰
- MySQL 设置 MYSQL_ROOT_PASSWORD 和 MYSQL_DATABASE,避免 Symfony 连接时反复填密码
- 所有服务共用一个自定义网络(如 symfony_net),让 PHP 容器用 db:3306 直接连 MySQL,不用写 localhost 或 IP
让 Symfony 在容器里真正“活”起来
光跑通 index.php 不够,开发中常要执行命令、查日志、调试 API。所以启动容器后,务必验证三件事:
- composer install 能在容器内运行(可提前 COPY composer.lock,或挂载 .composer 缓存卷加速)
- php bin/console cache:clear --env=dev 成功,说明环境变量、权限、OPcache 配置都到位
- APP_ENV=dev APP_DEBUG=1 通过环境变量注入,而不是改 .env 文件——后者容易被 git 提交污染
加一层 Xdebug 或 TTY,调试才不抓瞎
没有调试能力的开发环境等于半残。推荐两种轻量方案:
- 开发阶段启用 Xdebug:在 PHP 容器中配置 xdebug.mode=debug,IDE 监听 9003 端口,浏览器装 Xdebug Helper 插件
- 不想配 Xdebug?至少让容器支持交互式终端:docker-compose exec php bash 或 ddev ssh(如果用 DDEV),能快速进容器查文件、看日志、跑命令
标准化不是追求一步到位,而是每次新增服务、升级 PHP、换队友协作时,都能靠 docker-compose up -d 一键复现。环境稳了,心思才能全放在业务逻辑上。


















