You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 08:35:07