本指南将详细介绍如何使用Docker容器化部署Symfony应用程序。Docker提供了一种轻量级、可移植的解决方案,可以简化Symfony应用的开发和生产环境配置。
首先创建一个新的Symfony项目:
# 使用Composer创建新项目
docker run --rm -v $(pwd):/app composer create-project symfony/skeleton:"6.4.*" my-symfony-app
cd my-symfony-app
在项目根目录创建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
创建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:
创建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;
}
编辑.env
文件:
DATABASE_URL="mysql://symfony:password@db:3306/symfony?serverVersion=8.0"
docker-compose run --rm app composer require symfony/orm-pack
docker-compose run --rm app composer require --dev symfony/maker-bundle
# 构建并启动容器
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
现在可以通过以下URL访问Symfony应用程序: - http://localhost
# 在容器内运行Symfony命令
docker-compose exec app php bin/console [command]
# 例如清除缓存
docker-compose exec app php bin/console cache:clear
# 查看日志
docker-compose logs -f
# 进入容器
docker-compose exec app bash
对于生产环境,建议进行以下优化:
.env.prod
文件存储生产环境变量如果遇到文件权限问题,可以运行:
docker-compose exec app chown -R www-data:www-data var
确保.env
文件中的数据库配置与docker-compose.yml
中的一致。
开发时如果修改未生效,尝试清除缓存:
docker-compose exec app php bin/console cache:clear
在docker-compose.yml
中添加:
redis:
image: redis:alpine
ports:
- "6379:6379"
然后在Symfony中配置Redis连接。
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
environment:
- discovery.type=single-node
ports:
- "9200:9200"
停止并删除所有容器:
docker-compose down -v
通过Docker部署Symfony应用程序可以确保开发和生产环境的一致性,简化依赖管理,并提高可移植性。本指南提供了基本的Docker配置,您可以根据项目需求进一步定制和扩展。