此时 , 您可能已经得出以下(非常合逻辑的)结论:"那么 , 我将永远使用Alpine!" 。如果在软件中只有那么清楚的话 。
您会发现 , Alpine linux背后的家伙还没有发现Ubuntu或Debian家伙仍在寻找的特殊秘密调味料 。为了能够创建比Debian小(例如)小的数量级的Docker映像 , 他们必须对Alpine映像中要包含的内容和不包含的内容做出一些决定 。在选择Alpine作为默认基本映像之前 , 应检查它是否提供了所需的所有环境 。此外 , 即使Alpine随附了软件包管理器 , 您也可能会发现Alpine中不提供您在(例如)基于Ubuntu的开发环境中使用的特定软件包或软件包版本 。在为项目选择最合适的基础映像之前 , 您应该了解这些权衡并进行测试 。
最后 , 如果您确实需要使用一个较胖的基础镜像 , 则可以使用镜像最小化工具(例如免费和开源DockerSlim)来减小最终映像的大小 。
注意:在尝试减小尺寸时 , 为自己的镜像选择适当的基础镜像很重要 。评估您的选择并选择一张镜像 , 该镜像可提供您所需的工具 , 以确保您可以承受的尺寸 。
完全不选择基础镜像如果您的应用程序可以在没有基础映像提供任何其他环境的情况下运行 , 则可以选择完全不使用基础映像 。当然 , 由于FROM在Dockerfile中是强制性的 , 因此您仍然必须拥有它并将其指向某个内容 。在这种情况下 , 您应该使用什么?
从头开始 , 即:
"一个明显为空的图像 , 特别是对于构建图像"从零开始" 。在构建基础映像(例如debian和busybox)或超小型映像(仅包含一个二进制文件以及它所需要的任何内容 , 例如hello-world)的上下文中 , 此映像最有用 。从头开始是Dockerfile中的一项禁止操作 , 并且不会在映像中创建额外的层 。"
注意:如果您的应用程序包含可以以独立方式运行的自包含可执行文件 , 则选择暂存基础映像可以使您尽可能减少容器的占用空间 。
多阶段构建当Docker 17.05可用时 , 多阶段构建成为关注的焦点 。期待已久的功能 , 多阶段构建允许镜像构建器将自定义镜像构建脚本抛在后面 , 并将所有内容集成到众所周知的Dockerfile格式中 。
用高级术语来说 , 您可以将多阶段构建视为将多个Dockerfile合并在一起 , 或者简单地将一个具有多个FROM的Dockerfile合并 。
在进行多阶段构建之前 , 如果要构建项目的工件并使用Dockerfile将其分发到容器中 , 则可能必须遵循一个构建过程 , 最终以一个如下图所示的容器结束:

文章插图
Building and distributing your Application without multi-stage builds (Image by the author)
尽管上述过程在技术上没有任何问题 , 但最终镜像和生成的容器在构建/准备项目人工制品时创建的层上都layers肿了 , 这些层对于项目的运行时环境不是必需的 。
多阶段构建使您可以将创建/准备阶段与运行时环境分开:

文章插图
Multi-stage builds, separation creation/preparation from runtime (image by author)
您仍然可以使用单个Dockerfile定义完整的构建工作流程 。但是 , 您可以将文物从一个阶段复制到另一个阶段 , 同时将数据丢弃在不需要的层中 。
注意:多阶段构建允许您创建跨平台的可重复构建 , 而无需使用特定于操作系统的自定义构建脚本 。通过有选择地包括在构建的前几个阶段中生成的伪像 , 可以使镜像的最终大小保持最小 。
结论为容器创建Docker镜像是现代软件工程师必须经常处理的过程 。有大量在线资源和示例向您展示如何创建Dockerfile , 但是 , 您应注意生成的映像的大小 。
在本文中 , 我们回顾了一些方法和技巧 , 以最大程度地减少Docker镜像的最终大小 。通过精心制作仅包含必要工件的Dockerfile , 选择合适的基础映像并使用多阶段构建 , 可以大大减少Docker映像的最终大小 。
(本文翻译自Nassos Michas的文章《Super-Slim Docker Containers》 , 参考:
https://medium.com/better-programming/super-slim-docker-containers-fdaddc47e560)
推荐阅读
- 快速搞定docker部署Filebeat、ELK全家桶
- Jenkins与Docker的自动化CI/CD流水线实战
- 在没有网络的环境下离线安装docker
- Docker容器网络实操教程
- EFK 日志系统收集K8s日志 之 容器标准输出日志
- 借助工具优化Dockerfile分层
- Docker命令大全
- docker下拉取tomcat镜像以及配置,亲测可用
- 云计算核心技术Docker教程:docker-compose控制服务启动和关闭顺序
- 基于SpringBoot的微服务架构与K8S容器部署实践
