php 的 dockerfile 一直优化使用中
目前最好用的版本:

FROM php:8.3.30-fpm-alpine3.22
# FROM php:8.1.33-fpm-alpine3.22
# FROM php:8.2.30-fpm-alpine3.22
# 更换阿里云镜像源
RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories
# 安装扩展
RUN apk add --no-cache --virtual .build-deps \
$PHPIZE_DEPS \
freetype-dev \
libpng-dev \
libjpeg-turbo-dev \
libzip-dev \
icu-dev \
oniguruma-dev \
&& apk add --no-cache \
freetype \
libpng \
libjpeg-turbo \
libzip \
icu \
oniguruma \
tzdata \
libstdc++ \
# 设置时区
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone \
# 安装 PECL 扩展
&& pecl install redis-6.1.0 \
&& docker-php-ext-enable redis \
# 配置 GD
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
# 安装 PHP 扩展
&& docker-php-ext-install -j$(nproc) \
gd \
pdo_mysql \
mysqli \
zip \
intl \
opcache \
bcmath \
mbstring \
# 清理编译依赖
&& apk del .build-deps \
&& rm -rf /var/cache/apk/* /tmp/* /var/tmp/*
# ============ 使用国内源安装 Composer ============
RUN php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');" \
&& php composer-setup.php \
&& php -r "unlink('composer-setup.php');" \
&& mv composer.phar /usr/local/bin/composer \
&& chmod +x /usr/local/bin/composer
# 配置 Composer 使用国内镜像
RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
WORKDIR /var/www/html
USER www-data
编译命令参考:
docker build -f ./Dockerfile83 -t php8.3.30-fpm-alpine .

如果是 Dockerfile 不是 Dockerfile83 在当前目录直接使用:
docker build -t php8.3.30-fpm-alpine .
这个方式很顺畅,没有卡住的情况,制作好之后push到自己的阿里云上,很方便使用
docker tag a752adbfac26 registry.cn-hangzhou.aliyuncs.com/xxx/lnmp:php8.3.30-fpm-alpine
docker push registry.cn-hangzhou.aliyuncs.com/xxx/lnmp:php8.3.30-fpm-alpine
指定平台:
docker build --platform linux/arm64 -f Dockerfile83 -t php8.3.30-fpm-alpine .
这样效率高多了:

以下是deepseek给的redis的:
你的这个 Dockerfile 思路很清晰,已经是一个非常优秀的配置了。Redis 官方本身也推荐使用 Alpine 版本,因为它体积小、安全漏洞少 。
在它的基础上,我根据搜索结果中的生产环境最佳实践,为你整理了一个包含优化细节的版本。主要是增加了健康检查、更精细的权限和初始化处理,让它更适合直接用于生产 。
dockerfile
# 使用官方轻量级 Redis Alpine 镜像 FROM redis:8.2-alpine3.22 # 1. 设置时区 (可选,便于排查问题) RUN apk add --no-cache tzdata \ && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo "Asia/Shanghai" > /etc/timezone \ && apk del tzdata # 2. 创建配置目录并复制自定义配置文件 # 建议将下方完整的 redis.conf 放在 Dockerfile 同级目录 RUN mkdir -p /usr/local/etc/redis COPY redis.conf /usr/local/etc/redis/redis.conf # 3. 确保数据目录权限正确,并创建初始化脚本 (解决权限问题) RUN mkdir -p /data && chown -R redis:redis /data /usr/local/etc/redis \ && echo -e '#!/bin/sh\n\ chown -R redis:redis /data\n\ exec docker-entrypoint.sh "$@"' > /usr/local/bin/custom-entrypoint.sh \ && chmod +x /usr/local/bin/custom-entrypoint.sh # 4. 切换到 redis 用户 (官方镜像默认创建) USER redis # 5. 配置容器健康检查 (确保服务真正可用) [citation:3][citation:8] HEALTHCHECK --interval=10s --timeout=5s --start-period=10s --retries=3 \ CMD redis-cli ping || exit 1 # 6. 暴露端口 EXPOSE 6379 # 7. 使用自定义入口脚本,通过配置文件启动 ENTRYPOINT ["/usr/local/bin/custom-entrypoint.sh"] CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]
配套的 redis.conf 核心配置
你需要在 Dockerfile 同级目录下创建一个 redis.conf 文件,并建议包含以下生产环境的关键配置 :
conf
# 网络配置 (在容器内绑定所有接口,依赖宿主机防火墙/Docker网络策略控制) bind 0.0.0.0 port 6379 protected-mode no # 安全性 (强烈建议设置密码) requirepass your-very-strong-password-here # 持久化配置 (防止数据丢失,建议开启混合持久化) [citation:8] appendonly yes appendfsync everysec # RDB 快照 (作为持久化的补充) save 900 1 save 300 10 save 60 10000 # 内存管理 maxmemory 512mb maxmemory-policy allkeys-lru # 工作目录 dir /data