创建docker镜像的开销是多少?

时间:2017-03-05 02:14:56

标签: docker dockerfile

我正在探索使用docker,以便我们部署新的docker镜像而不是特定的文件更改,因此应用程序的所有需求都伴随着每个部署等。

问题1:

如果我在部署新映像时使用Docker工具箱中的工具向docker镜像添加一个新的应用程序文件(例如10 MB),这是否需要在我的容器中部署全新的映像或者使用docker部署只取2之间的差异,类似于git版本控制?

另一种说法,我查看了一个docker基础图像列表,看到了一个188 MB的ubuntu版本。如果我使用这个基本映像将新应用程序提交到docker映像,我的docker容器是否需要提取它们已经运行的完整188 MB,以及应用程序,或者是否有一种不同的方式来获取已更改的内容?

补充问题

我在假设使用docker时是否正确,部署图像是预期的方法?意味着任何新的更改都需要新的映像部署,以便将映像视为不可变的?当我使用AWS时,我们采用AMI(亚马逊机器映像)这种方法,但存储AMI的开销很低,对于我还不知道的docker。

或者更好的做法是部署dockerfiles并在容器本身上构建新映像?

2 个答案:

答案 0 :(得分:2)

Docker使用分层联合文件系统,只有一个层的副本将由docker引擎拉出并存储在其文件系统中。构建映像时,docker将检查其层缓存,以查看是否已使用相同的父层和相同的命令构建现有层,如果是,则重用缓存而不是构建新层。一旦构建中的任何步骤创建了一个新图层,所有后续步骤都将创建新图层,因此Dockerfile的顺序很重要。您应该将经常更改的步骤添加到Dockerfile的末尾,以便可以缓存前面的步骤。

因此,如果您使用200MB基本映像,添加50MB,但Dockerfile末尾只有10MB新增功能,您首次将250MB推送到docker引擎,但只有10MB到引擎已经拥有该图像的先前副本,或50MB到一个只有200MB基本图像的引擎。

图像的最佳实践是将它们构建一次,将它们推送到注册表(使用注册表映像自托管,由AWS等人托管或在Docker Hub上托管),然后将该图像提取到每个引擎需要运行它。

有关分层文件系统的更多详细信息,请参阅https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/

答案 1 :(得分:2)

您也可以稍微工作,以创建更小的图像。 您可以使用Alpine或Busybox而不是使用更大的Ubuntu,Debian或Bitnami(Debian light)。

较小的图像更安全,因为可用的工具更少。

一些阅读

http://blog.xebia.com/how-to-create-the-smallest-possible-docker-container-of-any-image/

https://www.dajobe.org/blog/2015/04/18/making-debian-docker-images-smaller/

你有两个很棒的工具来制作更小的泊坞窗图像

https://github.com/docker-slim/docker-slim

https://github.com/mvanholsteijn/strip-docker-image

docker-slim的一些例子

https://hub.docker.com/r/k3ck3c/grafana-xxl.slim/

显示

size before -> 357.3 MB

using docker-slim -> 18.73 MB

或关于simh

https://hub.docker.com/r/k3ck3c/simh_bitnami.slim/

size 5.388 MB

当原来的

k3ck3c/simh_bitnami 88.86 MB

流行的netcat图片

chilcano / netcat是135.2 MB

当基于Alpine的netcat为7.812 MB

并且基于busybox将需要2或3 MB