在开始之前,请确保您已经安装了以下软件: - Docker (最新稳定版) - Docker Compose (通常与Docker一起安装)
# 使用Symfony CLI创建新项目
symfony new my_project --full
# 或者使用Composer
composer create-project symfony/website-skeleton my_project
在项目根目录下创建以下文件:
docker-compose.yaml
version: '3.8'
services:
app:
build:
context: .
target: symfony_php
args:
SYMFONY_VERSION: ${SYMFONY_VERSION:-}
restart: unless-stopped
volumes:
- ./:/srv/app:rw,cached
networks:
- symfony-network
depends_on:
- db
- redis
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
networks:
- symfony-network
depends_on:
- app
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DATABASE_ROOT_PASSWORD:-root}
MYSQL_DATABASE: ${DATABASE_NAME:-symfony}
MYSQL_USER: ${DATABASE_USER:-symfony}
MYSQL_PASSWORD: ${DATABASE_PASSWORD:-symfony}
volumes:
- db_data:/var/lib/mysql
ports:
- "3306:3306"
networks:
- symfony-network
redis:
image: redis:alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- symfony-network
mailer:
image: mailhog/mailhog:latest
ports:
- "1025:1025" # SMTP server
- "8025:8025" # Web UI
networks:
- symfony-network
volumes:
db_data:
redis_data:
networks:
symfony-network:
driver: bridge
Dockerfile
# 多阶段构建
# PHP基础镜像
FROM php:8.2-fpm-alpine AS symfony_php
# 持久化 /usr/src/php目录
VOLUME /var/run/php
# 安装系统依赖
RUN apk add --no-cache \
acl \
fcgi \
file \
gettext \
git \
gnupg \
g++ \
make \
mysql-client \
openssh-client \
postgresql-dev \
rabbitmq-c-dev \
zlib-dev \
libzip-dev \
libpng-dev \
libjpeg-turbo-dev \
freetype-dev \
icu-dev \
oniguruma-dev
# 安装PHP扩展
RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd \
&& docker-php-ext-install \
intl \
mbstring \
pdo \
pdo_mysql \
zip \
opcache
# 安装并启用Xdebug (仅开发环境)
ARG APP_ENV=dev
RUN if [ "$APP_ENV" = "dev" ]; then \
pecl install xdebug && docker-php-ext-enable xdebug; \
fi
# 安装Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
# 配置工作目录
WORKDIR /srv/app
# 复制项目文件
COPY . .
# 安装项目依赖
RUN if [ "$APP_ENV" = "prod" ]; then \
composer install --prefer-dist --no-dev --no-scripts --no-progress --no-suggest; \
else \
composer install --prefer-dist --no-scripts --no-progress --no-suggest; \
fi
# 设置权限
RUN chown -R www-data:www-data var
docker/nginx/conf.d/default.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/project_error.log;
access_log /var/log/nginx/project_access.log;
}
创建 .env
文件(Symfony项目已包含)并添加以下Docker相关配置:
# Docker数据库配置
DATABASE_URL="mysql://symfony:symfony@db:3306/symfony?serverVersion=8.0"
# Mailer配置
MAILER_DSN=smtp://mailer:1025
docker-compose up -d
# 进入PHP容器
docker-compose exec app bash
# 在容器内安装依赖
composer install
# 创建数据库(如果不存在)
php bin/console doctrine:database:create
# 运行迁移
php bin/console doctrine:migrations:migrate -n
# 退出容器
exit
# 启动服务
docker-compose up -d
# 停止服务
docker-compose down
# 查看日志
docker-compose logs -f
# 进入PHP容器
docker-compose exec app bash
# 清除缓存(在容器内)
php bin/console cache:clear
如果在Linux上遇到权限问题,可以运行:
sudo chown -R $USER:$USER .
sudo chmod -R 777 var
如果8080端口已被占用,可以在docker-compose.yaml
中修改nginx服务的端口映射:
ports:
- "8081:80"
确保.env
文件中的DATABASE_URL
与docker-compose.yaml
中的配置匹配。
如果需要Xdebug,确保在Dockerfile
中APP_ENV
设置为dev
,并在PHP容器中检查Xdebug是否已启用:
php -m | grep xdebug
对于生产环境,建议:
1. 使用APP_ENV=prod
构建
2. 移除Xdebug
3. 配置适当的SSL/TLS
4. 使用更严格的安全设置
5. 设置适当的资源限制
希望这个指南能帮助您顺利在Docker环境中安装和运行Symfony应用!