必须用Docker容器化交付Yii2.0.55项目,基础镜像限定php:7.4-apache,严格锁定依赖版本,禁用composer update,精简构建Dockerfile并显式配置gd扩展路径。

要让Yii2.0.55项目在生产环境稳定运行并支持弹性伸缩、快速回滚和跨平台一致部署,必须脱离XAMPP/WAMP等本地套件,改用Docker容器化交付。这一步不是可选项,而是云原生场景下的强制前提。
准备Yii2.0.55项目代码与依赖
确认项目根目录下存在composer.json且已声明"yiisoft/yii2": "2.0.55",否则后续构建将因版本不匹配直接失败。
进入项目根目录,执行composer install --no-dev --optimize-autoloader生成vendor/目录。这一步必须在宿主机完成,避免Docker构建时反复拉取依赖导致镜像层臃肿。
【注意:不要运行composer update】Yii2.0.55是特定小版本,更新会覆盖锁定的补丁级版本,引发兼容性断裂——比如yii\base\InvalidConfigException在2.0.56中被重构,但你的配置文件仍按55版语义编写。
编写精简型Dockerfile
在项目根目录新建Dockerfile,内容如下:
FROM php:7.4-apache
RUN apt-get update && apt-get install -y libpng-dev libjpeg-dev libfreetype6-dev && rm -rf /var/lib/apt/lists/*
RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/freetype2 --with-jpeg-dir=/usr/include --with-png-dir=/usr/include
RUN docker-php-ext-install gd mbstring pdo_mysql opcache && a2enmod rewrite
COPY . /var/www/html
RUN chown -R www-data:www-data /var/www/html && chmod -R 755 /var/www/html
使用 Python 脚本下载 Docker 镜像并打包为 tar 文件。用户说“下载镜像”“拉取镜像”“pull xxx”“帮我下载 nginx 镜像”等时触发。支持 SOCKS5 代理直连(推荐)和国内镜像站加速两种模式。
EXPOSE 80
关键点:基础镜像必须严格使用php:7.4-apache而非php:8.x,Yii2.0.55不兼容PHP8的类型系统变更;gd扩展编译参数必须显式指定路径,否则imagecreatefromjpeg()调用会静默失败。
配置Web服务器入口与权限
确保web/index.php存在且具备可执行权限。若缺失,手动创建该文件,内容为Yii标准引导代码:
<?php defined('YII_DEBUG') or define('YII_DEBUG', false); defined('YII_ENV') or define('YII_ENV', 'prod'); require __DIR__ . '/../vendor/autoload.php'; require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php'; $config = require __DIR__ . '/../config/web.php'; (new yii\web\Application($config))->run();
Apache虚拟主机配置需禁用.htaccess解析以提升性能:编辑/etc/apache2/sites-available/000-default.conf,在<Directory "/var/www/html">块内添加AllowOverride None。
【重要:删除web目录外的所有敏感文件】构建前务必从项目中移除environments/、.env、config/db-local.php等含数据库密码的文件,否则镜像一旦推送至私有仓库,密钥即永久泄露。
构建并运行容器
第一步:执行docker build -t yii2-prod:2.0.55 .构建镜像。观察输出末尾是否出现Successfully built xxxxxxxx,若卡在composer install步骤,说明vendor/未提前生成。
第二步:创建专用网络docker network create yii-net,隔离Yii容器与其他服务。
第三步:启动容器docker run -d --name yii-app --network yii-net -p 8080:80 -v $(pwd)/runtime:/var/www/html/runtime yii2-prod:2.0.55。其中runtime目录必须挂载为卷,否则日志和缓存写入失败会导致500 Internal Server Error。
第四步:验证服务可用性curl -I http://localhost:8080,返回状态码200 OK且Content-Type: text/html; charset=UTF-8即表示部署成功。

















