symfony 6.4.48 应使用 php 8.2-fpm-alpine 基础镜像,启用 pdo、pdo_mysql、mbstring、xml、zip、opcache 等扩展,采用 fpm+nginx 分离架构,通过多阶段构建与权限配置保障生产就绪。

直接用 Docker 搭建 Symfony 6.4.48 项目,核心是“镜像版本对得上、服务分得清、环境配得稳”。6.4.x 属于 Symfony 6 的长期支持(LTS)分支,推荐搭配 PHP 8.2+ 和 Alpine/Debian 官方镜像,避免扩展缺失或兼容问题。
基础镜像与 PHP 环境选择
Symfony 6.4.48 要求 PHP ≥ 8.1,建议使用 php:8.2-fpm-alpine 或 php:8.2-apache 作为基础镜像。Alpine 更轻量,适合生产;Apache 镜像自带 Web 服务,适合快速验证。
- 必须启用的 PHP 扩展:pdo、pdo_mysql、mbstring、xml、zip、opcache(生产环境强烈建议开启)
- Alpine 下安装扩展需额外处理:比如
apk add --no-cache $PHPIZE_DEPS和docker-php-ext-install pdo pdo_mysql mbstring - 避免用 php:8.3+ 运行 6.4.48——虽多数兼容,但部分组件(如某些旧版 Doctrine Bundle)可能触发弃用警告或运行时错误
Dockerfile 示例(生产就绪精简版)
以下适用于 FPM + Nginx 分离架构,符合 Symfony 官方部署建议:
FROM php:8.2-fpm-alpine <h1>安装系统依赖和PHP扩展</h1><p>RUN apk add --no-cache git zip curl && \ docker-php-ext-install pdo pdo_mysql mbstring xml zip && \ docker-php-ext-enable opcache</p><h1>启用 OPCache 优化(生产必需)</h1><p>COPY docker/php/opcache.ini /usr/local/etc/php/conf.d/opcache.ini</p><h1>设置工作目录</h1><p>WORKDIR /var/www/html</p><h1>复制 composer 文件并安装依赖(--no-dev + 优化自动加载)</h1><p>COPY composer.json composer.lock ./ RUN composer install --no-dev --optimize-autoloader --no-interaction</p><h1>复制源码(注意排除 dev 相关文件)</h1><p>COPY . .</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill9103" title="Docker Image Puller"><img src="https://img.php.cn/upload/skill/000/000/081/179240957376550.jpg" alt="Docker Image Puller" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill9103" title="Docker Image Puller" class="overflowclass">Docker Image Puller</a> <p class="overflowclass">使用 Python 脚本下载 Docker 镜像并打包为 tar 文件。用户说“下载镜像”“拉取镜像”“pull xxx”“帮我下载 nginx 镜像”等时触发。支持 SOCKS5 代理直连(推荐)和国内镜像站加速两种模式。</p> </div> <a rel="nofollow" href="/xiazai/skill9103" title="Docker Image Puller" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div><h1>创建缓存与日志目录并设权限(关键!防止 500 错误)</h1><p>RUN mkdir -p var/cache var/logs && \ chown -R www-data:www-data var/</p><h1>切换用户(安全加固)</h1><p>USER www-data</p><p>EXPOSE 9000 CMD ["php-fpm"] </p>
docker-compose.yml(开发/生产双模式参考)
用多环境配置文件区分 dev 和 prod,不混用变量。以下是开发环境最小可行配置(Nginx + PHP-FPM + MySQL):
version: '3.8'
services:
app:
build: .
restart: unless-stopped
volumes:
- .:/var/www/html
- ./docker/php/opcache.ini:/usr/local/etc/php/conf.d/opcache.ini
environment:
- APP_ENV=dev
- APP_DEBUG=1
<p>nginx:
image: nginx:alpine
ports: ["80:80"]
volumes:</p>
- .:/var/www/html
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: [app]
db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: symfony_app MYSQL_USER: symfony MYSQL_PASSWORD: symfony volumes:
- db_data:/var/lib/mysql
volumes: db_data:
注意:生产环境应移除 volumes 挂载,改用构建时复制代码;APP_ENV 设为 prod,禁用调试栏和 profiler;数据库密码等敏感信息通过 env_file 注入,不硬编码。
启动与验证流程
完成上述配置后,执行三步即可访问应用:
- 终端中运行
docker compose up -d(确保使用 Compose v2+) - 等待服务就绪后,执行迁移:
docker compose exec app php bin/console doctrine:migrations:migrate - 访问
http://localhost—— 若看到 Symfony 欢迎页或自定义首页,说明容器链路已通
首次访问若报错 500,大概率是 var/cache 权限未设对或 APP_ENV 与配置不匹配,优先检查日志:docker compose logs app。










