将docker共享二进制文件或不?

假设我将在一台机器上托pipe两个项目,并且他们都将使用apache。 然后我需要创build两个容器来分离它们。 我需要在两个容器中运行apt-get install apache2 。 会花费两倍的空间多达apache2的大小?

不,Apache将在两个容器之间共享。 如果你创build一个图像,每一步将被保存在一个自己的图层。 因此,例如,你从Ubuntu(第1层)开始,并安装Apache(第2层)。 然后,将项目A添加到图像(图层3)。 在另一个Docker镜像中,你也从Ubuntu(第1层)开始,安装Apache(第2层)。 但是,然后你添加项目B的图像(第3层)。 这两个图像将一直到第3层。这意味着Apache的安装将被共享。

这里是一个例子:

项目A的Dockerfile:

 FROM ubuntu RUN apt-get update RUN apt-get install -y apache2 RUN touch /opt/a.txt 

项目B的Dockerfile:

 FROM ubuntu RUN apt-get update RUN apt-get install -y apache2 RUN touch /opt/b.txt 

除了最后一个命令,这两个文件都会创build非常类似的图像。 如果你看看这两个图像的历史,你会得到以下结果:

 vagrant@ubuntu-13:/vagrant/Apache/b$ docker history test/a IMAGE CREATED CREATED BY SIZE 4dc359259700 About a minute ago /bin/sh -c touch /opt/a.txt 8 B 9977b78fbad7 About a minute ago /bin/sh -c apt-get install -y apache2 54.17 MB e83b3bf07b42 2 minutes ago /bin/sh -c apt-get update 20.67 MB 9cd978db300e 3 months ago /bin/sh -c #(nop) ADD precise.tar.xz in / 204.4 MB 6170bb7b0ad1 3 months ago /bin/sh -c #(nop) MAINTAINER Tianon Gravi <ad 0 B 511136ea3c5a 10 months ago 0 B vagrant@ubuntu-13:/vagrant/Apache/b$ docker history test/b IMAGE CREATED CREATED BY SIZE c0daf4be2ed4 42 seconds ago /bin/sh -c touch /opt/b.txt 8 B 9977b78fbad7 About a minute ago /bin/sh -c apt-get install -y apache2 54.17 MB e83b3bf07b42 3 minutes ago /bin/sh -c apt-get update 20.67 MB 9cd978db300e 3 months ago /bin/sh -c #(nop) ADD precise.tar.xz in / 204.4 MB 6170bb7b0ad1 3 months ago /bin/sh -c #(nop) MAINTAINER Tianon Gravi <ad 0 B 511136ea3c5a 10 months ago 0 B 

您可以看到由Dockerfile A和Dockerfile B构build的图像的历史logging。您还可以看到不同的图层(每行都是图像中的一个图层)。 正如你所看到的,前两个图像中的前6层(!)完全一样。 只有最后一层是不同的(并有不同的ID)。 当你build立图像时,你会看到这个效果非常好。 当您构build第一张图片A时,需要花费几分钟时间,因为必须下载Apache等。 但是当你build立图像B后,只需要几秒钟,因为Apache不会再次下载,而是使用现有的层(这里ID为9977b78fbad7 )!