Docker为Symfony开发提供了以下优势: - 一致的开发环境(避免"在我机器上能运行"问题) - 快速配置和启动 - 易于团队共享配置 - 隔离的服务依赖管理
mkdir symfony-docker-project
cd symfony-docker-project
docker-compose.yml
version: '3.8'
services:
php:
build:
context: .
target: symfony_php
args:
SYMFONY_VERSION: 6.3.*
container_name: symfony_php
volumes:
- ./:/srv/app
working_dir: /srv/app
networks:
- symfony-network
nginx:
image: nginx:alpine
container_name: symfony_nginx
ports:
- "8080:80"
volumes:
- ./:/srv/app
- ./docker/nginx/conf.d:/etc/nginx/conf.d
depends_on:
- php
networks:
- symfony-network
mysql:
image: mysql:8.0
container_name: symfony_mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: symfony
MYSQL_USER: symfony
MYSQL_PASSWORD: symfony
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
networks:
- symfony-network
mailhog:
image: mailhog/mailhog
container_name: symfony_mailhog
ports:
- "8025:8025"
networks:
- symfony-network
volumes:
mysql-data:
networks:
symfony-network:
driver: bridge
Dockerfile
# 基础镜像
FROM php:8.2-fpm-alpine AS symfony_php
# 持久化环境变量
ARG SYMFONY_VERSION=6.3.*
# 安装系统依赖
RUN apk add --no-cache \
acl \
fcgi \
file \
gettext \
git \
mysql-client \
unzip \
nginx \
supervisor
# 安装PHP扩展
RUN set -eux; \
docker-php-ext-install -j$(nproc) \
pdo \
pdo_mysql \
opcache
# 安装Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
# 安装Symfony CLI
RUN wget https://get.symfony.com/cli/installer -O - | bash && \
mv /root/.symfony5/bin/symfony /usr/local/bin/symfony
# 配置工作目录
WORKDIR /srv/app
# 复制配置文件
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
COPY docker/supervisor/conf.d/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# 暴露端口
EXPOSE 9000
# 启动命令
CMD ["supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
docker/nginx/conf.d/symfony.conf
server {
listen 80;
server_name localhost;
root /srv/app/public;
location / {
try_files $uri /index.php$is_args$args;
}
location ~ ^/index\.php(/|$) {
fastcgi_pass php: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"
[opcache]
opcache.enable=1
opcache.optimization_level=-1
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0
opcache.save_comments=1
opcache.enable_file_override=1
docker-compose up -d
docker exec -it symfony_php sh
symfony new . --version=6.3 --webapp
或者使用Composer:
composer create-project symfony/website-skeleton:"6.3.*" .
composer require symfony/maker-bundle --dev
composer require annotations
composer require twig
composer require symfony/orm-pack
composer require --dev symfony/profiler-pack
编辑.env
文件:
DATABASE_URL="mysql://symfony:symfony@mysql:3306/symfony?serverVersion=8.0"
# 启动服务
docker-compose up -d
# 停止服务
docker-compose down
# 查看日志
docker-compose logs -f
# 进入PHP容器
docker exec -it symfony_php sh
# 进入MySQL容器
docker exec -it symfony_mysql mysql -usymfony -psymfony
symfony serve -d
在Dockerfile中添加:
RUN apk add --no-cache $PHPIZE_DEPS \
&& pecl install xdebug \
&& docker-php-ext-enable xdebug
创建docker/php/conf.d/xdebug.ini
:
zend_extension=xdebug.so
xdebug.mode=develop,debug
xdebug.start_with_request=yes
xdebug.client_port=9003
xdebug.client_host=host.docker.internal
xdebug.idekey=PHPSTORM
在docker-compose.yml
中添加:
redis:
image: redis:alpine
container_name: symfony_redis
ports:
- "6379:6379"
networks:
- symfony-network
然后安装Redis扩展:
RUN apk add --no-cache pcre-dev $PHPIZE_DEPS \
&& pecl install redis \
&& docker-php-ext-enable redis
权限问题:
sudo chown -R $USER:$USER .
端口冲突:
docker-compose.yml
中的端口映射数据库连接失败:
.env
中的连接字符串缓存问题:
php bin/console cache:clear
Composer速度慢:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
通过以上步骤,你已经建立了一个完整的Symfony Docker开发环境,可以开始高效开发了!