本文章主要记录博主近几年的使用, 去除知识冗余 以最简单直接方式是记录如何打造最小化 docker 容器镜像以 提高构建速度 以及 容器优化 ,本次实验我们使用典型的 PHP镜像 为实验目标其他类型类似可以参考。

1751943110

概述

 打造最小化docker容器镜像的几个步骤

  1. 尽可能选择 alpine tag 类型镜像
  2. 减少构建层数
  3. 清理无用缓存数据
  4. 分阶段构建

alpine 镜像

 如果是为了保持镜像最小化建议使用 alpine 镜像 本身 alpine 系统大小只有 5M 所有基于 alpine 系统构建的镜像要比基于其他系统镜像要小的多

### 一、核心差异对比

维度AlpineUbuntu/DebianCentOS
镜像体积≈5 MBUbuntu: ≈72-188 MB
Debian: ≈47-125 MB
≈200-230 MB
包管理器apk(轻量高效)apt(功能全面)yum(企业级支持)
C库musl libc(轻量)glibc(兼容性强)glibc
安全性默认最小化安装,攻击面小依赖较多,需手动精简企业级安全策略
启动速度极快(资源消耗低)中等较慢

1751942119

减少构建层数

在构建 dockerfile 是我们尽可能合并多个RUN指令层如:

  • 原始构建文件 dockerfile
# 设置阿里云镜像源
RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories

# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
    echo "Asia/Shanghai" > /etc/timezone &&\

# 更新安装依赖
RUN apk update

RUN apk add --no-cache zip unzip libzip-dev libstdc++ libpng-dev libwebp-dev libjpeg-turbo-dev freetype-dev tzdata
  • 优化dockerfile 构建文件
# 设置阿里云镜像源
RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories && \
     # 设置时区
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
    echo "Asia/Shanghai" > /etc/timezone &&\
    # 更新安装依赖
    apk update &&\
    apk add --no-cache zip unzip libzip-dev libstdc++ libpng-dev libwebp-dev libjpeg-turbo-dev freetype-dev tzdata

清理无用缓存数据

 在安装构建的过程中因为我们安装了一些环境程序所以我们在构建完成最后可以将清理缓存和临时文件放到最后

RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories && \
     # 设置时区
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
    echo "Asia/Shanghai" > /etc/timezone &&\
    # 更新安装依赖
    apk update &&\
    apk add --no-cache zip unzip libzip-dev libstdc++ libpng-dev libwebp-dev libjpeg-turbo-dev freetype-dev tzdata &&\
     # 清理缓存和临时文件
    apk del .build-deps && \
    rm -rf /var/cache/apk/* /tmp/*

分阶段构建

 最后我们分享下分阶段构建,在 Docker 中,使用阶段化构建(也称为 多阶段构建多阶段 Dockerfile )是一种有效的方式来 减少最终镜像的大小 ,同时保持镜像的 可维护性和安全性 。这种方式通常用在构建过程中需要安装多个构建依赖,而这些依赖在最终的运行镜像中并不需要。通过将构建过程和最终运行过程分开,可以 显著减少 最终镜像的大小。

FROM php:8.3.19-fpm-alpine as base

# 设置阿里云镜像源
RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories && \
     # 设置时区
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
    echo "Asia/Shanghai" > /etc/timezone &&\
    # 更新安装依赖
    apk update &&\
    apk add --no-cache zip unzip libzip-dev libstdc++ libpng-dev libwebp-dev libjpeg-turbo-dev freetype-dev tzdata


FROM base as base-builder

# 更新安装依赖
RUN apk add --no-cache --virtual .build-deps curl git autoconf  \
    build-base gd-dev libmcrypt-dev libmemcached-dev


FROM base-builder as stable-ext

# 安装有限的扩展,可以通过docker-php-ext-install --help查看 \
RUN docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp && \
    docker-php-ext-install -j$(nproc) pdo_mysql opcache bcmath pcntl zip gd

# 编译扩展
RUN pecl channel-update pecl.php.net &&\
    pecl install xlswriter &&\
    pecl install igbinary &&\
    pecl install redis &&\
    pecl install psr


RUN docker-php-ext-enable pdo_mysql opcache bcmath pcntl zip gd redis psr xlswriter igbinary


FROM base-builder as dynamic-ext

COPY --from=stable-ext /usr/local/lib/php/extensions/ /usr/local/lib/php/extensions/
COPY --from=stable-ext /usr/local/etc/php/conf.d/ /usr/local/etc/php/conf.d/

# 编译扩展
RUN pecl install swoole

RUN docker-php-ext-enable swoole


FROM base

COPY --from=composer /usr/bin/composer /usr/bin/composer
COPY --from=dynamic-ext /usr/local/lib/php/extensions/ /usr/local/lib/php/extensions/
COPY --from=dynamic-ext /usr/local/etc/php/conf.d/ /usr/local/etc/php/conf.d/

WORKDIR /var/www/html/

 这样我们就得到了相对安全以及最小化的容器镜像。

以上就是分享的如何打造最小化docker容器镜像的几种方法以及教程,有兴趣的同学可以根据以上的方法将自己的容器镜像进行优化把。