本文章主要记录博主近几年的使用, 去除知识冗余 以最简单直接方式是记录如何打造最小化 docker 容器镜像以 提高构建速度 以及 容器优化 ,本次实验我们使用典型的 PHP镜像 为实验目标其他类型类似可以参考。
概述
打造最小化docker容器镜像的几个步骤
- 尽可能选择 alpine tag 类型镜像
- 减少构建层数
- 清理无用缓存数据
- 分阶段构建
alpine 镜像
如果是为了保持镜像最小化建议使用 alpine 镜像 本身 alpine 系统大小只有 5M 所有基于 alpine 系统构建的镜像要比基于其他系统镜像要小的多
### 一、核心差异对比
维度 | Alpine | Ubuntu/Debian | CentOS |
---|---|---|---|
镜像体积 | ≈5 MB | Ubuntu: ≈72-188 MB Debian: ≈47-125 MB | ≈200-230 MB |
包管理器 | apk (轻量高效) | apt (功能全面) | yum (企业级支持) |
C库 | musl libc(轻量) | glibc(兼容性强) | glibc |
安全性 | 默认最小化安装,攻击面小 | 依赖较多,需手动精简 | 企业级安全策略 |
启动速度 | 极快(资源消耗低) | 中等 | 较慢 |
减少构建层数
在构建 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容器镜像的几种方法以及教程,有兴趣的同学可以根据以上的方法将自己的容器镜像进行优化把。
评论已关闭