Ubuntu下Docker PHP(Symfony)容器较WSL环境运行缓慢求助
解决Ubuntu Docker容器Symfony命令性能差异问题
以下是针对你遇到的Ubuntu Docker栈性能明显落后于Windows+WSL环境的排查和优化方向:
1. 优化Docker存储驱动与挂载配置
- 确保Docker使用overlay2存储驱动(Ubuntu默认应为该驱动,可通过
docker info | grep Storage Driver确认)。若当前驱动不是overlay2,修改/etc/docker/daemon.json设置"storage-driver": "overlay2"后重启Docker服务。 - 针对Symfony应用,将缓存、日志等频繁读写的目录从bind mount分离,改用Docker卷存储。卷的性能远优于bind mount,示例
docker-compose.yml配置:services: php-cli: image: php:7.4-cli volumes: # 代码仍用bind mount ./src:/var/www/html # 缓存和日志用独立卷 symfony-cache:/var/www/html/var/cache symfony-log:/var/www/html/var/log volumes: symfony-cache: symfony-log:
2. 启用并优化PHP OPcache
CLI模式下PHP默认未启用OPcache,这会导致每次执行Symfony命令都重新解析所有PHP文件,是性能差异的核心原因之一。修改PHP配置文件(如/usr/local/etc/php/php.ini):
opcache.enable = 1 opcache.enable_cli = 1 opcache.memory_consumption = 256 opcache.max_accelerated_files = 10000 opcache.revalidate_freq = 60 opcache.validate_timestamps = 0 ; 生产环境可关闭,开发环境按需调整
修改后重启PHP容器,再测试命令执行时长。
3. 调整Symfony环境配置
- 若使用开发环境,将缓存驱动改为
array(无需磁盘IO),修改config/packages/dev/framework.yaml:framework: cache: app: cache.adapter.array - 提前预热缓存:执行
php bin/console cache:warmup --env=dev(或prod环境),避免命令执行时重复生成缓存。
4. 排查宿主机系统瓶颈
- 用
htop检查CPU、内存占用,确认无其他进程抢占资源; - 用
iostat -x 1查看磁盘IO情况,重点关注%util指标,若接近100%说明磁盘IO存在瓶颈(即使是M.2 SSD,大量随机读写也可能受限); - 检查宿主机文件系统是否为
ext4,部分文件系统(如btrfs)在Docker挂载场景下性能不如ext4。
5. 优化Docker Daemon配置
修改/etc/docker/daemon.json添加以下优化项,减少磁盘IO和资源消耗:
{ "storage-opts": [ "overlay2.metacopy=on" ], "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }
执行sudo systemctl restart docker生效。
内容的提问来源于stack exchange,提问作者Sebus
相关产品推荐
相关产品推荐

