本篇内容介绍了“怎么精简Docker镜像”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前段时间网易蜂巢曾经推出蜂巢 Logo
T恤,用的正是 Docker 镜像制作,最神奇的是,它最终的镜像大小只有 585
字节。点击此处,可以了解该镜像的制作过程,这其中就用到了不少精简镜像的技术,尤其是针对 C 程序的优化和精简。但我们平常开发肯定不止用 C 语言,甚至有些镜像都不是我们自己来打包的(比如下载公共镜像),那是否有一些通用的精简 Docker 镜像的手段呢? 答案是肯定的 ,甚至有的镜像可以精简 98%。精简镜像大小的好处不言而喻,既节省了存储空间,又能节省带宽,加快传输。那好,接下来就请跟随我来学习怎么一步步精简 Docker 镜像吧。在开始制作镜像之前,首先了解下镜像的原理,而这其中最重要的概念就是镜像层(Layers)
。镜像层依赖于一系列的底层技术,比如文件系统(filesystems)、写时复制(copy-on-write)、联合挂载(union mounts)等,幸运的是你可以在很多地方学习到这些技术,这里就不再赘述技术细节。总的来说,你最需要记住这点:举例来说:以上 Dockerfile 干了这几件事:基于一个官方的基础镜像 busybox(只有1M多)创建一个文件夹(/tmp/foo)和一个文件(bar)为该文件分配了100M大小再把这个大文件删除事实上,它最终什么也没做,我们把它构建成镜像看看(构建可以参考一期):再让我们来对比下原生的 busybox 镜像大小和我们生成的镜像大小:出乎意料的是,却生成了 106 MB 的镜像。多出了 100 M,这是为何?这点和 git 类似(都用到了Copy-On-Write技术),我用 git 做了如下两次提交(添加了又删除),请问 A_VERY_LARGE_FILE
还在 git 仓库中吗?答案是: 在的 ,并且会占用仓库的大小。Git 会保存每一次提交的文件版本,而 Dockerfile 中每一条指令都可能增加整体镜像的大小,即使它最终什么事情都没做。了解了镜像层知识,有助于我们接下来制作精简镜像。这里开始,以最常用的开源缓存软件 Redis
为例,从一步步试验,来介绍如何制作更精简的 Docker 镜像。直接上 Dockerfile
:结合注释,读起来并不困难,用到的都是常规的几个命令,简要介绍如下:FROM:顶头写,指定一个基础镜像,此处基于 ubuntu:trusty
ENV:设置环境变量,这里设置了 VER
和 TARBALL
两个环境变量RUN:最常用的 Dockerfile 指令,用于运行各种命令,这里调用了 8 次 RUN 指令WORKDIR:指定工作目录,相当于指令 cd
CMD:指定镜像默认执行的命令,此处默认执行 redis-server 命令来启动 redis执行构建:注:国内网络,更新下载可能会较慢查看大小:动辄就有 300多 M 的大小,不能忍,下面我们开始一步步优化。方法:选用更小的基础镜像。常用的 Linux 系统镜像一般有 ubuntu
、centos
、debian
,其中debian
更轻量,而且够用,对比如下:替换 debian:jessie
作为我们的基础镜像。优化 Dockerfile:执行构建:查看大小:减少了42M,稍有成效,但并不明显。细心的同学应该发现,只有 122 MB 的 debian
基础镜像,构建后增加到了 305 MB开发云主机域名,看来这里面肯定有优化的空间,如何优化就要用到我们开头说到的 Image Layer
知识了。方法: 串联你的 Dockerfile 指令(一般是 RUN
指令)。Dockerfile 中的 RUN 指令通过 &&
和 /
支持将命令串联在一起,有时能达到意想不到的精简效果。优化 Dockerfile:构建:查看大小:哇!一下子减少了 50%,效果明显啊!这是最常用的一个精简手段了。方法:试着用命令或工具压缩你的镜像。docker 自带的一些命令还能协助压缩镜像,比如 export
和 import
但麻烦的是需要先将容器运行起来,而且这个过程中你会丢失镜像原有的一些信息,比如:导出端口,环境变量,默认指令。所以一般通过命令行来精简镜像都是实验性的,那么这里再推荐一个小工具: docker-squash。用起来更简单方便,并且不会丢失原有镜像的自带信息。下载安装:压缩操作:注: 该工具在 Mac 下并不好使,请在 Linux 下使用对比大小:“怎么精简Docker镜像”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注开发云网站,小编将为大家输出更多高质量的实用文章!
相关推荐: Standalone cluster模式下怎么生成一个DriverDescription类型的消息
这篇文章主要讲解了“Standalone cluster模式下怎么生成一个DriverDescription类型的消息”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Stand开发云主机域名alone clust…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。