如何调整Docker里面的Image 大小?

在过去几年的发展过程中,Docker获得业界的高度认可。因其能够简化部署,被广泛应用于企业应用开发场景中。

Docker给开发者带来的最直接好处是,可以打包他们的应用,将所有应用都捆绑在一个封套中,然后发布到任何流行的Linux机器上。并且,Docker能实现虚拟化,各种应用之间不需要任何接口。也就是,我们常说的“开箱即用”,无需大量安装或者配置相关的软件、硬件等。

而Docker Image就是Docker 镜像。Docker镜像是一个只读的模板。比如一个镜像可以包含Ubuntu系统以及安装在Ubuntu上的Apache Web服务器和你自己的应用。镜像是用来创建容器的。Docker提供了一个简单的方式用以创建新的镜像或者更新现存的镜像,甚至你可以下载其他地方提供的镜像。
由于Docker使用一个统一文件系统,Docker镜像其实就是一堆文件的集合,并不是像VM那样的是一个操作系统。镜像可以简单到只有一个程序文件,比如如果你写了一个简单的hello world程序放到一个空的镜像中,那么整个镜像的大小,就是你编译后的二进制文件的大小。

Docker Image 小是很有好处的,可以不用不浪费自己的SSD空间,来处理数十亿字节的Docker数据。

有时候,因企业业务规模化发展,Docker Image 变得非常大。技术开发人员不得不想办法,调整Image 大小。如何不断优化应用,最终让Image 大小减少到原来的一半?
第一步,Image 分层。使用Ubuntu作为基础镜像,搭建一个 Java运行环境。如果你有相关应用,还要整合第三方的结果检查工具。比如:安装Mono,通过NPM安装 TSLint和 ESLint,以便于我们获得更大的镜像处理能力。

第二步,核查BUG。之前,Image 的大小为1GB大。然而,在一次常规的拉取中,技术人员希望下载的数据量与源数据大小大相同,因为基本Image (Ubuntu、Java、…)还要保持稳定。但我的控制台显示,出现了异样:

如何调整Docker里面的Image 大小?_第1张图片

貌似有数据被多次下载。因为这是最后一层,所以这些都是真正的分发文件。检查Dockerfile后发现,所有目录都是经过编辑的。在传统的部署设置中,安全的操作方式是,Docker必须添加一个新的映镜像层,并且包含所有分发文件以及所有权信息。
在实际的Docker构建之前,通过调整所有权信息,很容易摆脱chown调用,从而让最终的Image 节省了300MB。

第三步,继续删减字节。文件产生的大小是670 MB,这只是开始,还有一定的删减空间。当OpenJDK被用于Java运行时,它附带了一些开发和GUI工具。把没有用的OpenJRE替换掉,可以立即节省将近100 MB的内存。然后运行StyleCop,并从Mono中的 .NET PDB 文件中阅读信息。Mono已经被安装在mono-complete 包中,通过强依赖关系,例如通过一个完整的MonoDevelop,来实现更多兆字节的删减。不管是ESLint,还是TSLint,都只是在NodeJS运行时才能启动。

最终,我们把所有应用分别添加到Docker Image中,图像大小由1GB减少到480MB。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31547898/viewspace-2213088/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31547898/viewspace-2213088/

你可能感兴趣的:(如何调整Docker里面的Image 大小?)