php 的 dockerfile 一直优化使用中

分类:PHP |

目前最好用的版本:

image.png

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 .

image.png


如果是 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 .


这样效率高多了:

image.png



以下是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