Symfony是一个流行的PHP框架,使用Docker可以方便地创建一致的开发环境。以下是详细的安装步骤:
# 创建新项目
symfony new my_project --version=6.4 --docker
# 进入项目目录
cd my_project
# 创建新项目
composer create-project symfony/skeleton:"6.4.*" my_project
# 进入项目目录
cd my_project
如果使用方法B创建项目或需要自定义Docker配置:
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
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
mkdir -p docker/nginx/conf.d docker/php/conf.d docker/php/php-fpm.d
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;
}
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
# 构建并启动容器
docker-compose up -d
# 查看运行中的容器
docker-compose ps
# 进入app容器
docker-compose exec app bash
# 在容器内安装依赖
composer install
.env
:DATABASE_URL="postgresql://app:app@database:5432/app?serverVersion=15&charset=utf8"
# 在容器内执行
php bin/console doctrine:database:create
php bin/console doctrine:migrations:migrate
# 停止容器
docker-compose stop
# 启动容器
docker-compose start
# 停止并删除容器
docker-compose down
# 重建容器(修改配置后)
docker-compose up -d --build
# 查看日志
docker-compose logs -f
# 进入容器
docker-compose exec app bash
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
.env
中的数据库连接:DATABASE_URL="mysql://app:app@database:3306/app?serverVersion=8.0"
Dockerfile
中的PHP扩展:RUN docker-php-ext-install -j$(nproc) pdo_mysql
docker-compose.yaml
中添加:redis:
image: redis:alpine
ports:
- "6379:6379"
networks:
- symfony
RUN apk add --no-cache --virtual .build-deps $PHPIZE_DEPS; \
pecl install redis; \
docker-php-ext-enable redis; \
apk del .build-deps
端口冲突:如果8080端口被占用,修改docker-compose.yaml
中的端口映射。
权限问题:如果遇到文件权限问题,可以在容器内执行:
chown -R www-data:www-data var
数据库连接问题:确保数据库服务已启动并检查.env
中的连接字符串。
缓存问题:开发时可以禁用缓存:
APP_ENV=dev
通过以上步骤,您应该已经成功使用Docker容器化安装了Symfony框架。这个配置提供了PHP-FPM、Nginx、PostgreSQL和MailCatcher的完整开发环境。