构建并推送自定义 PHP 8.2 FPM 镜像(适用于 Typecho)

本文档介绍如何在本地构建一个适用于 Typecho 的自定义 PHP 8.2 FPM 镜像,并将其推送至 Docker Hub。


准备工作目录

mkdir -p /opt/php
cd /opt/php

创建 Dockerfile

创建并编辑 Dockerfile 文件:

vim Dockerfile

添加以下内容:

FROM php:8.2-fpm

# 安装系统依赖和 PHP 扩展依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
    git unzip libzip-dev libpng-dev libjpeg62-turbo-dev \
    libfreetype6-dev libwebp-dev libxml2-dev libicu-dev \
    libonig-dev libpq-dev libcurl4-openssl-dev sqlite3 libsqlite3-dev \
 && rm -rf /var/lib/apt/lists/*

# 配置并安装 PHP 扩展
RUN docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \
 && docker-php-ext-install \
    gd \
    pdo_mysql \
    mysqli \
    pdo_sqlite \
    zip \
    bcmath \
    exif \
    intl \
    opcache \
    sockets \
    mbstring \
    xml \
    curl

# 安装 Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

# 设置工作目录
WORKDIR /var/www/html

# 配置 php.ini 参数优化
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" \
 && sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/' "$PHP_INI_DIR/php.ini" \
 && sed -i 's/memory_limit = .*/memory_limit = 128M/' "$PHP_INI_DIR/php.ini" \
 && sed -i 's/upload_max_filesize = .*/upload_max_filesize = 32M/' "$PHP_INI_DIR/php.ini" \
 && sed -i 's/post_max_size = .*/post_max_size = 32M/' "$PHP_INI_DIR/php.ini" \
 && echo "opcache.enable=1" >> "$PHP_INI_DIR/php.ini" \
 && echo "opcache.enable_cli=1" >> "$PHP_INI_DIR/php.ini" \
 && echo "opcache.memory_consumption=128" >> "$PHP_INI_DIR/php.ini" \
 && echo "opcache.interned_strings_buffer=8" >> "$PHP_INI_DIR/php.ini" \
 && echo "opcache.max_accelerated_files=10000" >> "$PHP_INI_DIR/php.ini" \
 && echo "opcache.validate_timestamps=1" >> "$PHP_INI_DIR/php.ini" \
 && echo "opcache.revalidate_freq=2" >> "$PHP_INI_DIR/php.ini"

# 设置文件权限
RUN chown -R www-data:www-data /var/www/html

# 暴露端口
EXPOSE 9000

# 启动 php-fpm
CMD ["php-fpm"]

构建镜像

在包含 Dockerfile 的目录下执行以下命令:

docker build --no-cache -t php-8.2-fpm-typecho .

推送镜像到 Docker Hub

1. 登录 Docker Hub

docker login

2. 标记(Tag)镜像

将镜像打上你的 Docker Hub 用户名标签:

docker tag php-8.2-fpm-typecho YOUR_USERNAME/php-8.2-fpm-typecho:1.0

3. 推送镜像

执行推送操作:

docker push YOUR_USERNAME/php-8.2-fpm-typecho:1.0

后续操作(可选)

可以将该镜像用于 Nginx + PHP-FPM 的 Typecho 部署,结合 Docker Compose 使用将更方便。


验证与自查

  1. docker images | grep php-8.2-fpm-typecho 确认镜像已构建
  2. 检查关键扩展已启用:docker run --rm php-8.2-fpm-typecho php -m | grep -E 'gd|pdo_mysql|pdo_sqlite|intl|zip'
  3. 验证 php.ini 优化参数:docker run --rm php-8.2-fpm-typecho php -i | grep -E 'memory_limit|upload_max_filesize|opcache.enable'
  4. 推送后在其他机器执行 docker pull YOUR_USERNAME/php-8.2-fpm-typecho:1.0 能拉取成功

参考