Docker 镜像体积优化实践:从基础镜像重建到层压缩的全流程指南
由于最近在发布的时候发现docker镜像体积变得越来越大,导致整个打包发布流程变得非常耗时了。所以又接到一个差事,优化最终镜像体积。顺便也记录一下docker镜像体积优化的一些步骤。
大概步骤可以分为以下几个步骤:
- 重做基础镜像,因为原基础镜像提交就已经占用了500M,所以计划使用alpine重新制作。
- 优化Dockerfile文件,合并一些指令来减小镜像层数,删除一些临时文件等。
- 最后是对基于重制的基础镜像打包发布镜像后进行镜像层数压缩(docker-squash)。
一、重做基础镜像
文件目录如下:
Dockerfile-alpine-openjdk
我这基础镜像需要安装 jdk8、 python2、系统级cron组件(supercronic)
FROM docker.m.daocloud.io/alpine:3.14
LABEL maintainer="傲寒 <wanngziyi@gmail.com>"
# 设置工作目录
WORKDIR /opt/aohan
COPY ./get-pip.py /opt/aohan/
COPY ./supercronic /usr/local/bin/supercronic
# 替换 Alpine 的默认镜像源为国内源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
# 安装openjdk8 python2
&& apk add --no-cache openjdk8 python2 shadow bash curl tzdata \
&& ln -sf /bin/bash /bin/sh \
&& chmod +x /usr/local/bin/supercronic \
# 安装pip
&& python get-pip.py -i https://pypi.tuna.tsinghua.edu.cn/simple \
&& rm get-pip.py \
&& pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ \
&& python2 -m pip install six requests jinja2
# 设置 环境变量
ENV JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk
ENV PATH=$JAVA_HOME/bin:$PATH
ENV PS1='[\u@\h \W]\$ '
# 默认命令
CMD ["/bin/bash"]
使用docker build 命令镜像制作
# 不使用缓存
docker build --no-cache -f ./Dockerfile-alpine-openjdk -t openjdk8-python2:v1.0.0 .
效果还不错只有200M 比之前的小了快300M
二、Dockerfile优化
我们自己的不方便展示主要就是
-
使用上边新的基础镜像。
-
优化指令减少层数。
-
删除临时文件。
三、压缩镜像
1、docker-squash是什么?
- 定义
docker-squash
是一个用于压缩 Docker 镜像的工具。Docker 镜像是由一系列的层(layers)组成的,在构建和使用过程中,这些层会逐渐累积。docker-squash
可以将这些多层的 Docker 镜像压缩成一个单一层的镜像,从而减小镜像的大小。
- 工作原理
- 当构建 Docker 镜像时,每一个指令(如
RUN
、COPY
等)都会在基础镜像之上创建一个新的层。随着时间的推移和构建步骤的增加,镜像会包含许多层。docker-squash
通过将这些层合并,消除了层与层之间的冗余部分。例如,如果一个镜像有多个层,其中有些层可能包含相同的文件或者依赖,docker-squash
会把这些重复的部分整合,生成一个更紧凑的镜像。
- 当构建 Docker 镜像时,每一个指令(如
2、安装使用
pip install docker-squash
然后直接使用,其他参数可以查阅一下文档。
docker-squash -t 新镜像名称 原镜像名称
以下是压缩结果 压缩了36.9% 一下减少600M 效果还是非常不错的。
效果不错这下又可以交差,又能开开心心划水。