将Symfony项目迁移到Docker容器化开发环境,能够统一不同开发者的本地运行环境,避免依赖版本冲突问题,同时简化环境部署流程,让项目在不同设备上都能保持一致的运行状态。

迁移前的准备工作
首先需要确认本地已经安装好Docker和Docker Compose,同时准备好需要迁移的Symfony项目源码,确保项目在本地原生环境下可以正常运行。如果项目使用了数据库、缓存等外部服务,也需要提前梳理好相关服务的配置信息。
编写Docker相关配置文件
Dockerfile配置
我们需要为Symfony项目编写对应的Dockerfile,用于构建php运行环境的镜像,以下是适用于Symfony的Dockerfile示例:
# 使用官方php-fpm镜像作为基础镜像 FROM php:8.2-fpm # 安装Symfony项目需要的php扩展 RUN docker-php-ext-install pdo_mysql opcache # 安装Composer COPY --from=composer:latest /usr/bin/composer /usr/bin/composer # 设置工作目录 WORKDIR /var/www/symfony_project # 复制项目源码到容器中 COPY . . # 安装项目依赖 RUN composer install --no-dev --optimize-autoloader # 设置目录权限 RUN chown -R www-data:www-data /var/www/symfony_project
Docker Compose配置
使用Docker Compose可以管理多个相关容器,我们需要配置nginx、php-fpm、数据库等服务的容器编排,以下是docker-compose.yml的示例内容:
version: '3.8'
services:
# nginx服务
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./:/var/www/symfony_project
- ./docker/nginx/conf.d:/etc/nginx/conf.d
depends_on:
- php-fpm
networks:
- symfony_network
# php-fpm服务
php-fpm:
build:
context: .
dockerfile: Dockerfile
volumes:
- ./:/var/www/symfony_project
networks:
- symfony_network
# MySQL数据库服务
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: symfony_db
MYSQL_USER: symfony_user
MYSQL_PASSWORD: symfony_password
volumes:
- mysql_data:/var/lib/mysql
networks:
- symfony_network
# 自定义网络
networks:
symfony_network:
# 数据卷,持久化MySQL数据
volumes:
mysql_data:
Nginx配置
还需要配置nginx的站点配置文件,让nginx能够正确转发请求到php-fpm处理,在docker/nginx/conf.d目录下创建symfony.conf文件,内容如下:
server {
listen 80;
server_name localhost;
root /var/www/symfony_project/public;
index index.php;
location / {
try_files $uri /index.php$is_args$args;
}
location ~ .php$ {
fastcgi_pass php-fpm:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
启动容器并验证项目运行
完成所有配置文件编写后,在项目根目录下执行以下命令启动所有容器:
docker-compose up -d
容器启动后,需要修改Symfony项目的.env配置文件,将数据库连接地址修改为容器内MySQL的服务名,示例如下:
# 修改数据库连接配置,mysql是docker-compose中MySQL服务的服务名 DATABASE_URL="mysql://symfony_user:symfony_password@mysql:3306/symfony_db?serverVersion=8.0"
然后进入php-fpm容器执行数据库迁移命令,初始化项目数据库:
docker-compose exec php-fpm php bin/console doctrine:migrations:migrate
打开浏览器访问http://127.0.0.1,如果可以看到Symfony项目的正常页面,说明迁移已经成功完成。
常见迁移问题排查
- 如果访问页面出现404错误,首先检查nginx配置中的root路径是否正确,确认
public目录是否存在。 - 如果数据库连接失败,检查
.env文件中的数据库配置是否正确,确认MySQL容器是否已经正常启动。 - 如果项目依赖安装失败,检查Dockerfile中是否安装了项目需要的全部php扩展,可进入php-fpm容器手动执行
composer install查看具体错误。
注意:如果是生产环境迁移,还需要额外配置php的opcache优化、nginx的缓存策略,同时不要将开发环境的配置直接用于生产环境。