插件窝 干货文章 教程:使用Docker容器化安装Symfony

教程:使用Docker容器化安装Symfony

Docker Symfony PHP database 458    来源:    2025-04-10

使用Docker容器化安装Symfony教程

Symfony是一个流行的PHP框架,使用Docker可以方便地创建一致的开发环境。以下是详细的安装步骤:

前提条件

  • 已安装Docker和Docker Compose
  • 基本的命令行操作知识

步骤1:创建Symfony项目

方法A:使用Symfony CLI(推荐)

# 创建新项目
symfony new my_project --version=6.4 --docker

# 进入项目目录
cd my_project

方法B:使用Composer

# 创建新项目
composer create-project symfony/skeleton:"6.4.*" my_project

# 进入项目目录
cd my_project

步骤2:配置Docker环境

如果使用方法B创建项目或需要自定义Docker配置:

  1. 创建docker-compose.yaml文件:
version: '3.8'

services:
  app:
    build:
      context: .
      target: symfony_php
      args:
        SYMFONY_VERSION: ${SYMFONY_VERSION:-6.4}
    restart: unless-stopped
    volumes:
      - .:/srv/app:rw,cached
    networks:
      - symfony

  nginx:
    image: nginx:alpine
    restart: unless-stopped
    ports:
      - "8080:80"
    volumes:
      - ./docker/nginx/conf.d:/etc/nginx/conf.d:ro
      - ./public:/srv/app/public:ro
    depends_on:
      - app
    networks:
      - symfony

  database:
    image: postgres:15-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: ${DATABASE_NAME:-app}
      POSTGRES_USER: ${DATABASE_USER:-app}
      POSTGRES_PASSWORD: ${DATABASE_PASSWORD:-app}
    volumes:
      - db_data:/var/lib/postgresql/data:rw
    ports:
      - "5432:5432"
    networks:
      - symfony

  mailer:
    image: schickling/mailcatcher:latest
    restart: unless-stopped
    ports:
      - "1080:1080"
    networks:
      - symfony

volumes:
  db_data:

networks:
  symfony:
    driver: bridge
  1. 创建Dockerfile
# 多阶段构建 - 第一阶段:构建
FROM php:8.2-fpm-alpine AS symfony_php

# 持久化 /var/www 目录
VOLUME /var/www

WORKDIR /srv/app

# 安装系统依赖
RUN apk add --no-cache \
    acl \
    fcgi \
    file \
    gettext \
    git \
    postgresql-dev \
    ;

# 安装PHP扩展
RUN set -eux; \
    docker-php-ext-install -j$(nproc) \
    intl \
    pdo_pgsql \
    opcache \
    ; \
    \
    runDeps="$( \
    scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions \
    | tr ',' '\n' \
    | sort -u \
    | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
    )"; \
    apk add --no-cache --virtual .api-phpexts-rundeps $runDeps;

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

# 复制PHP配置
COPY docker/php/conf.d/app.ini $PHP_INI_DIR/conf.d/
COPY docker/php/php-fpm.d/zz-docker.conf /usr/local/etc/php-fpm.d/zz-docker.conf

# 健康检查
HEALTHCHECK --interval=10s --timeout=3s --retries=3 \
    CMD REDIRECT_STATUS=true SCRIPT_NAME=/ping SCRIPT_FILENAME=/ping REQUEST_METHOD=GET \
    cgi-fcgi -bind -connect 127.0.0.1:9000 || exit 1

# 复制项目文件
COPY . .

# 第二阶段:开发环境
FROM symfony_php AS symfony_php_dev

RUN apk add --no-cache --virtual .build-deps $PHPIZE_DEPS; \
    pecl install xdebug; \
    docker-php-ext-enable xdebug; \
    apk del .build-deps

COPY docker/php/conf.d/xdebug.ini $PHP_INI_DIR/conf.d/xdebug.ini
  1. 创建必要的目录和配置文件:
mkdir -p docker/nginx/conf.d docker/php/conf.d docker/php/php-fpm.d
  1. 创建Nginx配置文件docker/nginx/conf.d/symfony.conf
server {
    server_name localhost;
    root /srv/app/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;
}
  1. 创建PHP配置文件docker/php/conf.d/app.ini
date.timezone = "UTC"

display_errors = On
error_reporting = E_ALL

opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=256
opcache.max_accelerated_files=20000

步骤3:启动Docker容器

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

# 查看运行中的容器
docker-compose ps

步骤4:安装依赖

# 进入app容器
docker-compose exec app bash

# 在容器内安装依赖
composer install

步骤5:配置Symfony

  1. 配置数据库连接.env
DATABASE_URL="postgresql://app:app@database:5432/app?serverVersion=15&charset=utf8"
  1. 创建数据库:
# 在容器内执行
php bin/console doctrine:database:create
php bin/console doctrine:migrations:migrate

步骤6:访问应用程序

  • 应用: http://localhost:8080
  • MailCatcher: http://localhost:1080

常用命令

# 停止容器
docker-compose stop

# 启动容器
docker-compose start

# 停止并删除容器
docker-compose down

# 重建容器(修改配置后)
docker-compose up -d --build

# 查看日志
docker-compose logs -f

# 进入容器
docker-compose exec app bash

自定义配置

使用MySQL替代PostgreSQL

  1. 修改docker-compose.yaml中的database服务:
database:
  image: mysql:8.0
  environment:
    MYSQL_DATABASE: ${DATABASE_NAME:-app}
    MYSQL_USER: ${DATABASE_USER:-app}
    MYSQL_PASSWORD: ${DATABASE_PASSWORD:-app}
    MYSQL_ROOT_PASSWORD: ${DATABASE_ROOT_PASSWORD:-root}
  volumes:
    - db_data:/var/lib/mysql:rw
  1. 更新.env中的数据库连接:
DATABASE_URL="mysql://app:app@database:3306/app?serverVersion=8.0"
  1. 更新Dockerfile中的PHP扩展:
RUN docker-php-ext-install -j$(nproc) pdo_mysql

添加Redis

  1. docker-compose.yaml中添加:
redis:
  image: redis:alpine
  ports:
    - "6379:6379"
  networks:
    - symfony
  1. 安装Redis PHP扩展:
RUN apk add --no-cache --virtual .build-deps $PHPIZE_DEPS; \
    pecl install redis; \
    docker-php-ext-enable redis; \
    apk del .build-deps

故障排除

  1. 端口冲突:如果8080端口被占用,修改docker-compose.yaml中的端口映射。

  2. 权限问题:如果遇到文件权限问题,可以在容器内执行:

    chown -R www-data:www-data var
    
  3. 数据库连接问题:确保数据库服务已启动并检查.env中的连接字符串。

  4. 缓存问题:开发时可以禁用缓存:

    APP_ENV=dev
    

通过以上步骤,您应该已经成功使用Docker容器化安装了Symfony框架。这个配置提供了PHP-FPM、Nginx、PostgreSQL和MailCatcher的完整开发环境。