推荐用 docker-compose.yml 启动 php-fpm、nginx、mysql 和 redis 四类服务分离职责,通过挂载代码、配置时区与 opcache、修正 database_url 等实现一键部署与验证。

直接用 Docker 容器跑 Symfony 项目,核心是分离职责、避免单容器硬塞所有服务。推荐用 docker-compose.yml 启动四类服务:PHP-FPM(执行逻辑)、Nginx(处理请求与静态资源)、数据库(MySQL/PostgreSQL)、Redis(缓存与会话)。这样既贴近生产行为,又支持热更新和独立调试。
准备基础项目结构
先创建标准 Symfony 项目,不依赖本地 PHP 环境:
- 运行
docker run --rm -v $(pwd):/app composer create-project symfony/website-skeleton myapp,生成项目目录 - 进入
myapp目录,确保public/存在且composer.json可读 - 不需要提前安装 PHP、MySQL 或 Web 服务器——全部由容器提供
编写 docker-compose.yml(必需四服务)
在项目根目录新建 docker-compose.yml,明确划分角色:
-
app(PHP-FPM):基于
php:8.4-fpm-alpine,挂载代码到/var/www/html,启用intl、pdo_mysql等扩展 -
web(Nginx):使用
nginx:alpine,挂载public/为文档根目录,配置try_files $uri /index.php?$query_string支持 Symfony 路由 -
db(MySQL):指定
mysql:8.0,通过environment设置 root 密码和数据库名,挂载./data持久化数据 -
redis(可选但推荐):添加
redis:7-alpine,供 Symfony 的 cache 和 session 使用,避免 dev 环境降级为 file cache
配置关键细节避免踩坑
很多失败源于忽略以下三点:
-
权限与挂载路径:PHP 容器内
/var/www/html/var/cache目录需可写,建议在docker-compose.yml中对app服务加volumes映射该子目录,或启动后执行docker-compose exec app chown -R www-data:www-data var/cache -
时区与 OPCache:在 PHP 容器的
php.ini或环境变量中设date.timezone=Asia/Shanghai;开发阶段建议关闭 OPCache(opcache.enable=0),避免修改代码不生效 -
数据库连接配置:修改
.env中的DATABASE_URL为mysql://symfony:symfony@db:3306/symfony(用户名、密码、主机名需与 compose 中 db 服务名一致)
一键启动与验证
完成配置后,终端执行:
-
docker-compose build(首次构建镜像) -
docker-compose up -d(后台启动全部服务) -
docker-compose logs -f app查看 PHP 日志,docker-compose exec db mysql -usymfony -psymfony -e "SHOW DATABASES;"验证数据库连通性 - 浏览器访问
http://localhost,看到 Symfony 默认欢迎页即成功











