轻松瘦身:揭秘 Docker 镜像优化之旅

轻松瘦身:揭秘 Docker 镜像优化之旅

引言

在当今快速发展的软件开发领域,Docker 以其轻量级和高效的容器化技术,已经成为开发者和系统管理员的得力助手。然而,随着项目规模的扩大和应用的复杂化,Docker 镜像的体积问题逐渐凸显,成为影响部署效率和成本控制的关键因素。本文旨在分享一次 Docker 镜像体积优化的实践经验,帮助读者轻松实现镜像的"瘦身"。

Docker 镜像基础知识

Docker 镜像是由一系列只读层组成的,这些层通过联合文件系统(UnionFS)叠加在一起,形成一个完整的容器文件系统。每一层都代表了构建过程中的一个步骤,因此,镜像层数越多,其体积往往越大。优化 Docker 镜像的关键在于减少这些层的数量和大小。

优化前的准备工作

在着手优化之前,我们首先对现有的 Docker 镜像进行了彻底的测试和备份。选择一个合适的基础镜像是优化的第一步,因为它直接影响到最终镜像的大小和性能。我们通过分析现有的镜像结构,确定了优化的目标和方向。

优化策略与方法

  1. 清理不必要的文件

    我们通过验证程序依赖库、非必要文件拷贝等,如临时文件、编译输出等,从而减少了镜像的体积。

  2. 合并镜像层

    通过采用多阶段构建的方法,我们将编译和运行阶段分离,大大减少了最终镜像的层数。此外,我们还利用了一些工具,如buildahdockerSlim,来进一步合并和压缩镜像层。

  3. 优化基础镜像和压缩软件包和依赖

    在构建过程中,我们使用了像Alpine Linux这样的轻量级基础镜像,并移除了不必要的软件包和依赖,以减少镜像体积。 选择合适的基础镜像可以减小镜像大小,并确保基础镜像的安全性和更新性。Alpine、Ubuntu Minimal 等轻量级基础镜像是常用选择。

  4. 优化软件配置

    我们还对容器内运行的软件进行了配置优化,关闭了不必要的服务和功能,以减少资源占用和提高安全性。

实践案例分析

在一次针对 Web 应用的 Docker 镜像优化中,我们通过上述方法将后端镜像大小从 464MB 减少到了 315MB,Nginx 镜像从 135MB 减少到了 13.1MB,同时保持了应用的完整性和性能。这个过程中,我们遇到了一些挑战,比如如何确保多阶段构建的正确性和如何保持镜像的安全性。通过不断的测试和调整,我们最终成功地解决了这些问题。

优化前体积

优化前体积

优化前 dockerfile

bash 复制代码
FROM python:3.9.16-slim
RUN sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list && set -ex \
  &&apt-get update\
  &&apt-get install gcc -y\
  &&apt-get install git curl -y
# 设定时区
#ENV TZ=Asia/Shanghai
#RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY backend/ /app
COPY config/ /config

# 再次切换工作目录为Django主目录
WORKDIR /app

# 安装项目所需python第三方库
# 指定setuptools的版本,必须指定,新版本有兼容问题
RUN set -ex \
    &&pip install --upgrade pip \
    &&pip install setuptools_scm -i https://mirrors.aliyun.com/pypi/simple/ \
    &&pip install  --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ \
    && rm -rf /var/cache/yum/* \
    && python manage.py collectstatic --noinput
EXPOSE 8001
EXPOSE 8000
EXPOSE 5555
CMD ["sh", "start.sh", "web"]

优化后体积

第一次优化后体积

优化后 dockerfile

bash 复制代码
FROM python:3.9.16-alpine3.16
RUN  apk --update add gcc g++ git curl build-base musl-dev linux-headers
COPY backend/ /app
COPY config/ /config

# 再次切换工作目录为Django主目录
WORKDIR /app

# 安装项目所需python第三方库
# 指定setuptools的版本,必须指定,新版本有兼容问题
RUN set -ex \
    &&pip install --upgrade pip \
    &&pip install setuptools_scm==7.1.0 -i https://mirrors.aliyun.com/pypi/simple/ \
    &&pip install  --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ \
    && rm -rf /var/cache/yum/* \
    && python manage.py collectstatic --noinput
EXPOSE 8001
EXPOSE 8000
EXPOSE 5555
CMD ["sh", "start.sh", "web"]

做了哪些工作?

本次优化过程中,我们仅仅优化了基础镜像,后端从python:3.9.16-slim 改成了 alpine 版本的python:3.9.16-alpine3.16 ,nginx 从nginx:1.20.1改成了 alpine 版本的nginx:stable-alpine3.17-slim

遇到的问题

  1. 因 linux 发行版的不一致,安装命令也做了一些调整,apt 调整成 apk
  2. alpine 发行版的很多 linux 库是精简的,需要安装特殊适配的包

遇到问题的解决方案

使用 apk 安装如下包 apk --update add gcc g++ git curl build-base musl-dev linux-headers

优化后的测试与验证

优化完成后,我们对新的镜像进行了详尽的测试,包括功能测试、性能测试和安全测试。这些测试确保了优化后的镜像不仅体积更小,而且运行稳定,满足了生产环境的要求。

持续维护与监控

为了确保镜像的长期健康和性能,我们将优化过程整合到了 CI/CD 流程中,并建立了一套监控系统,用于跟踪镜像的性能指标和安全状态。

总结与展望

通过本次实践,我们不仅学会了如何优化 Docker 镜像,还意识到了持续优化的重要性。随着技术的不断进步,我们相信未来会有更多高效和自动化的工具和方法出现,帮助我们更好地管理和优化 Docker 镜像。

相关推荐
程序那点事儿1 小时前
k8s 之安装busybox
云原生·容器·kubernetes
-$_$-1 小时前
【黑马点评】 使用RabbitMQ实现消息队列——1.Docker与RabbitMQ环境安装
分布式·docker·rabbitmq
芯的一天1 小时前
windows下DockerDesktop命令行方式指定目录安装
windows·docker
是芽芽哩!2 小时前
【Kubernetes】常见面试题汇总(五十八)
云原生·容器·kubernetes
帅气的人1232 小时前
使用 docker-compose 启动 es 集群 + kibana
elasticsearch·docker
獨枭2 小时前
Ubuntu 通过 Docker 搭建 GitLab
ubuntu·docker·gitlab
zixingcai3 小时前
dockertop提示Failed to fetch extensions
docker
雪域迷影12 小时前
PostgreSQL Docker Error – 5432: 地址已被占用
数据库·docker·postgresql
福大大架构师每日一题13 小时前
22.1 k8s不同role级别的服务发现
容器·kubernetes·服务发现
莹雨潇潇13 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器