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

M1 Pro芯片MacBook Pro上Symfony 6.0 Docker项目卡顿优化咨询

M1 Pro MacBook Pro 上 Symfony 6.0 Docker 项目卡顿优化求助

我在搭载M1 Pro芯片的MacBook Pro上运行Symfony 6.0 Docker项目,此前在Ubuntu系统中运行一切正常,但现在即使使用arm64v8镜像,项目仍存在严重卡顿问题。以下是我的Docker配置文件,恳请提供优化建议:

docker-compose.yml

version: '3'
services:
    php:
        build: ./docker/php
        container_name: {PROJECT_NAME}_php
        environment:
            TZ: Europe/Vilnius
        volumes:
            - ./docker/php/config/www.conf:/usr/local/etc/php-fpm.d/www.conf:ro
            - ./docker/php/config/php.ini:/usr/local/etc/php/php.ini:ro
    web:
        build: ./docker/web
        environment:
            APP_PROJECT_DIR: {PATH_TO_PROJECT}
        volumes:
            - ./docker/web/config:/etc/nginx/config:ro
            - ./docker/web/nginx.conf:/etc/nginx/nginx.conf:ro
    mysql:
        image: arm64v8/mariadb:10.6.4
        build: ./docker/mysql

docker-compose.override.yml

version: '3'
services:
    php:
        hostname: {USER_NAME}-{PROJECT_NAME}-php
        working_dir: {PATH_TO_PROJECT}
        volumes:
            - {PATH_TO_PROJECT}:{PATH_TO_PROJECT}
            - ./docker/php/composer/:/var/www/.composer/
            - ./docker/php/composer/auth.json:/var/www/.composer/auth.json
            - {PATH_TO_PROJECT}/node_modules
    web:
        environment:
            APP_PROJECT_DIR: {PATH_TO_PROJECT}
            APP_HOST: {PROJECT_HOST}
        extra_hosts:
            - "{PROJECT_HOST}:host-gateway"
        volumes:
            - {PATH_TO_PROJECT}:{PATH_TO_PROJECT}/public
        networks:
            default:
                ipv4_address: 172.12.16.10
        ports:
            -  98:80
        depends_on:
            - php
            - mysql
    mysql:
        image: arm64v8/mariadb:10.6.4
        ports:
            - 4306:3306
        expose:
            - 3306
        environment:
            MYSQL_ROOT_PASSWORD: qwerty
        networks:
            default:
                ipv4_address: 172.12.16.30

networks:
    default:
        name: {PROJECT_NAME}
        driver: bridge
        ipam:
            driver: default
            config:
                -   subnet: 172.12.16.0/24

PHP Dockerfile

FROM arm64v8/php:8.0-fpm

USER root

# change user and groups ids
RUN usermod --uid=1000 www-data && \
    groupmod --gid=1000 www-data && \
    # fix permissions
    chown -R www-data:www-data /var/www/

# enable extensions
RUN echo 'START' && \
    docker-php-ext-install mysqli && \
    docker-php-ext-install bcmath && \
    docker-php-ext-install pdo_mysql && \
    docker-php-ext-enable opcache && \
    docker-php-source delete

RUN docker-php-ext-configure pcntl --enable-pcntl
RUN docker-php-ext-install pcntl

RUN apt-get update && \
    apt-get install -y libzip-dev && \
    docker-php-ext-install zip && \
    apt-get install -y libxml2-dev && \
    docker-php-ext-install soap && \
    apt-get install -y libicu-dev && \
    docker-php-ext-install intl && \
    apt-get install -y libgmp-dev && \
    docker-php-ext-install gmp && \
    apt-get install -y libcurl4 libcurl4-openssl-dev && \
    docker-php-ext-install -j$(nproc) curl && \
    apt-get install -y libpq-dev && \
    docker-php-ext-install pdo_pgsql && \
    apt-get install -y libpng-dev libfreetype6-dev libjpeg62-turbo-dev && \
    docker-php-ext-install gd && \
    rm -r /var/lib/apt/lists/* && \
    docker-php-source delete

RUN apt-get update && \
    apt-get install -y git zip gnupg && \
    rm -r /var/lib/apt/lists/* && \
    docker-php-source delete

RUN apt-get update && \
    apt-get install -y wget && \
    rm -r /var/lib/apt/lists/* && \
    docker-php-source delete

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list  && \
    apt update && apt install -y yarn  && \
    rm -r /var/lib/apt/lists/* && \
    docker-php-source delete

RUN apt update && apt install -y libxrender1 && apt install -y libfontconfig1 && apt install -y libfontconfig

RUN apt install -y wget fontconfig fontconfig-config xfonts-75dpi xfonts-base

RUN wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.buster_arm64.deb
RUN dpkg -i wkhtmltox_0.12.6-1.buster_arm64.deb

ADD ./includes/install-composer.sh /usr/bin
RUN /usr/bin/install-composer.sh && \
    mv composer.phar /usr/bin/composer

RUN apt-get update && \
    ## zip
    apt-get install -y iputils-ping && \
    ## cleanup
    rm -r /var/lib/apt/lists/* && \
    docker-php-source delete

USER www-data

MySQL Dockerfile

FROM arm64v8/mariadb:10.6.4

COPY ./config/my.cnf /etc/mysql/conf.d/my.cnf

ENV TZ=Europe/Vilnius

Web Dockerfile

FROM nginx:1.11.0-alpine

COPY docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]

优化建议

1. 优化文件系统挂载性能

  • 替换本地目录挂载为Docker卷,避免macOS文件系统的性能瓶颈:将{PATH_TO_PROJECT}:{PATH_TO_PROJECT}替换为命名卷,仅挂载需要实时同步的目录(如src/、templates/)到容器,而非整个项目目录;node_modules直接用卷挂载,避免宿主机与容器间的文件频繁同步:
    volumes:
      - symfony_project:{PATH_TO_PROJECT}
      - symfony_node_modules:{PATH_TO_PROJECT}/node_modules
    
  • 启用Docker Desktop的VirtioFS(设置>Features in development>启用VirtioFS),这是针对Apple Silicon优化的文件系统,能大幅提升挂载性能。

2. 优化PHP配置

  • 调整php.ini中的OPcache参数,提升代码缓存效率:
    opcache.enable=1
    opcache.enable_cli=1
    opcache.memory_consumption=256
    opcache.max_accelerated_files=20000
    opcache.revalidate_freq=60
    opcache.validate_timestamps=0 ; 开发环境可设为1,生产环境设为0
    
  • 调整www.conf中的PHP-FPM进程数,匹配M1 Pro的核心数:
    pm = dynamic
    pm.max_children = 16 ; M1 Pro有10核,可设为12-16
    pm.start_servers = 4
    pm.min_spare_servers = 2
    pm.max_spare_servers = 8
    

3. 优化MySQL性能

  • 修改my.cnf,针对ARM架构和Docker环境调整参数:
    [mysqld]
    innodb_buffer_pool_size=512M ; 根据可用内存调整,M1 Pro至少分配512M
    innodb_log_file_size=128M
    innodb_flush_log_at_trx_commit=2 ; 提升写入性能,生产环境需权衡一致性
    query_cache_type=1
    query_cache_size=64M
    
  • 将MySQL数据目录挂载为Docker卷,而非本地目录:
    volumes:
      - mariadb_data:/var/lib/mysql
    

4. 调整Docker设置

  • 分配足够的资源给Docker Desktop:设置>Resources>Advanced,CPU分配8核以上,内存分配8GB以上,避免资源不足导致卡顿。
  • 移除固定IP设置,使用Docker默认网络模式,减少网络开销:删除networks.default.ipv4_address配置。

5. 优化镜像构建

  • 合并PHP Dockerfile中的apt-get update命令,减少镜像层数,提升构建速度和运行效率:
    RUN apt-get update && \
        apt-get install -y libzip-dev libxml2-dev libicu-dev libgmp-dev libcurl4-openssl-dev libpq-dev libpng-dev libfreetype6-dev libjpeg62-turbo-dev git zip gnupg wget libxrender1 libfontconfig1 fontconfig-config xfonts-75dpi xfonts-base iputils-ping && \
        rm -r /var/lib/apt/lists/*
    
  • 使用最新的arm64镜像,比如arm64v8/php:8.0-fpm-bookworm而非旧版本,获得更好的兼容性和性能。

内容的提问来源于stack exchange,提问作者Scorpioniz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:50:37