轻松瘦身:揭秘 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,同时保持了应用的完整性和性能。这个过程中,我们遇到了一些挑战,比如如何确保多阶段构建的正确性和如何保持镜像的安全性。通过不断的测试和调整,我们最终成功地解决了这些问题。

优化前体积

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

优化前 dockerfile

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"]

优化后体积

轻松瘦身:揭秘 Docker 镜像优化之旅
第一次优化后体积

优化后 dockerfile


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 库是精简的,需要安装特殊适配的包
轻松瘦身:揭秘 Docker 镜像优化之旅
遇到问题的解决方案

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

优化后的测试与验证

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

持续维护与监控

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

总结与展望

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


原文始发于微信公众号(有追求的开发者):轻松瘦身:揭秘 Docker 镜像优化之旅

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/260484.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!