docker容器的应用程序易于部署管理是基于docker镜像,一个优良的docker镜像是非常有必要的。
在多数情况下,我们处于无状态应用的快速部署,这个过程中,且不管你在dockerhub使用还是本地镜像仓库使用,合理的镜像的大小也是有必要的。除此之外,我们应该考虑那些?
Docker镜像大小的重要性?
- 网络带宽导致的空闲等待
除了镜像大小外,我们还需要考虑更新迭代的问题,更大的基础镜像意味着需要更多的开发时间。这里必然少不了网络带宽的问题,上传下载的等待时间问题。
- 磁盘空间问题
当然,镜像大小不单单影响了上传下载操作人员等待的时间。如果你留意过磁盘的使用,你会发现磁盘空间也是一个非常吃紧的事情。
- 安全问题
事实上,磁盘并不会耗费太多的金钱。在内网来讲,带宽也不是一个特别大的问题。更多的需要注意的是容器的安全性的问题。太大的镜像往往意味着有更大的攻击面
缩减镜像5个步骤
在开始之前,我想复述一个重要的问题:你应该妥善考虑将要部署的应用的语言,框架,扩展,工具和第三方包。因为所有安装的内容都会增加镜像大小,docker镜像只需要运行应用所需的环境足以,其他的能少尽量的减少。
安装适合的依赖工具包
对于从0构建来说,生产的镜像仅仅配置有必要的程序以来包,对于一些不必要的包应该全部删除。如:curl,wget等等。
更小的基础镜像
假如你要从0开始构建,通常,常见的基础镜像是ubuntu和centos以及debian,除此之外,我们可以考虑使用alpine,alpine的大小仅仅只有5M。使用alpine减小了镜像的大小,但是alpine和centos,debian有一定的差别
如果你之是运行一个python程序,或者php程序,你应该考虑使用官方的镜像,比如 : ptyhon:2.7-alpine3.8,这仅仅几十兆。你可以进行自己构建,假如你掌握了这些知识
更少的层
docker的层也决定了镜像的大小,我们应该尽可能的使用更少的层来构建。更少的层可能意味着更少的dockerfile命令,比如run命令,阅读dockerfile中的RUN指令对镜像大小的影响有助于你深入了解。
同时,在很多时候,更少的层解决不了过于繁琐复杂的镜像构建,这时候就需要多阶段构建来解决。
使用.dockerignore文件
.dockerignore在构建的时候,控制构建的上下文中的内容,对一些内容进行忽略,从而达到想要的预期效果。对于一些特别不需要的文件这特别有用,你可以参考linuxea:docker不能忽视的.dockerignore用法深入了解
压缩镜像
- docker-squash
最后一个方式是压缩镜像,docker-squash是一个实用程序,用于将多个层压缩成一个,以便创建具有更少和更小层的镜像。它保留了Dockerfile命令,如PORT,ENV等。这样压扁镜像的工作方式与最初构建时相同。此外,后续图层中删除的文件实际上是在压缩时从镜像中清除的。
延伸阅读
linuxea:docker不能忽视的.dockerignore用法linuxea:docker多阶段构建Multi-Stage与Builder对比总结docker-squashlinuxea:dockerfile中的RUN指令对镜像大小的影响
学习更多
学习如何使用Docker CLI命令,Dockerfile命令,使用这些命令可以帮助你更有效地使用Docker应用程序。查看Docker文档和我的其他帖子以了解更多信息。
- docker目录
- 白话容器
- docker-compose