插件窝 干货文章 Symfony框架的Docker部署与安装指南

Symfony框架的Docker部署与安装指南

Docker Symfony Compose 配置 250    来源:    2025-04-10

Symfony框架的Docker部署与安装指南

简介

本指南将详细介绍如何使用Docker容器化部署Symfony应用程序。Docker提供了一种轻量级、可移植的解决方案,可以简化Symfony应用的开发和生产环境配置。

前提条件

  • 已安装Docker和Docker Compose
  • 基本的Symfony框架知识
  • 命令行操作经验

1. 创建Symfony项目

首先创建一个新的Symfony项目:

# 使用Composer创建新项目
docker run --rm -v $(pwd):/app composer create-project symfony/skeleton:"6.4.*" my-symfony-app

cd my-symfony-app

2. 创建Docker配置文件

2.1 Dockerfile

在项目根目录创建Dockerfile

# 使用官方PHP镜像作为基础
FROM php:8.2-fpm

# 安装系统依赖和PHP扩展
RUN apt-get update && apt-get install -y \
    git \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip \
    libzip-dev

RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip

# 安装Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# 设置工作目录
WORKDIR /var/www

# 复制项目文件
COPY . .

# 安装项目依赖
RUN composer install --no-dev --optimize-autoloader

# 设置权限
RUN chown -R www-data:www-data /var/www

2.2 docker-compose.yml

创建docker-compose.yml文件:

version: '3.8'

services:
  app:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - .:/var/www
    depends_on:
      - db
    environment:
      DATABASE_URL: "mysql://symfony:password@db:3306/symfony?serverVersion=8.0"

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: symfony
      MYSQL_USER: symfony
      MYSQL_PASSWORD: password
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - .:/var/www
      - ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - app

volumes:
  mysql_data:

2.3 Nginx配置

创建docker/nginx.conf文件:

server {
    listen 80;
    server_name localhost;
    root /var/www/public;

    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/index\.php(/|$) {
        fastcgi_pass app:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        internal;
    }

    location ~ \.php$ {
        return 404;
    }

    error_log /var/log/nginx/symfony_error.log;
    access_log /var/log/nginx/symfony_access.log;
}

3. 配置Symfony环境

3.1 配置数据库连接

编辑.env文件:

DATABASE_URL="mysql://symfony:password@db:3306/symfony?serverVersion=8.0"

3.2 安装必要的Symfony组件

docker-compose run --rm app composer require symfony/orm-pack
docker-compose run --rm app composer require --dev symfony/maker-bundle

4. 构建并运行容器

# 构建并启动容器
docker-compose up -d --build

# 创建数据库
docker-compose exec app php bin/console doctrine:database:create

# 运行迁移(如果有)
docker-compose exec app php bin/console doctrine:migrations:migrate

5. 访问应用程序

现在可以通过以下URL访问Symfony应用程序: - http://localhost

6. 开发工作流

6.1 运行命令

# 在容器内运行Symfony命令
docker-compose exec app php bin/console [command]

# 例如清除缓存
docker-compose exec app php bin/console cache:clear

6.2 调试

# 查看日志
docker-compose logs -f

# 进入容器
docker-compose exec app bash

7. 生产环境优化

对于生产环境,建议进行以下优化:

  1. 使用.env.prod文件存储生产环境变量
  2. 配置OPcache
  3. 启用HTTPS
  4. 设置适当的文件权限
  5. 实现CI/CD流程

8. 常见问题解决

8.1 权限问题

如果遇到文件权限问题,可以运行:

docker-compose exec app chown -R www-data:www-data var

8.2 数据库连接问题

确保.env文件中的数据库配置与docker-compose.yml中的一致。

8.3 缓存问题

开发时如果修改未生效,尝试清除缓存:

docker-compose exec app php bin/console cache:clear

9. 扩展配置

9.1 添加Redis

docker-compose.yml中添加:

redis:
  image: redis:alpine
  ports:
    - "6379:6379"

然后在Symfony中配置Redis连接。

9.2 添加Elasticsearch

elasticsearch:
  image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
  environment:
    - discovery.type=single-node
  ports:
    - "9200:9200"

10. 清理

停止并删除所有容器:

docker-compose down -v

结论

通过Docker部署Symfony应用程序可以确保开发和生产环境的一致性,简化依赖管理,并提高可移植性。本指南提供了基本的Docker配置,您可以根据项目需求进一步定制和扩展。