docker是否共享二进制文件



假设我将在一台机器上托管两个项目,并且它们都将使用apache。然后我需要创建两个容器将它们分开。我需要在两个容器中运行apt-get install apache2。它占用的空间是apache2的两倍吗?

不,Apache将在两个容器之间共享。如果你创建一个图像,每一步都将保存在一个单独的图层中。例如,你从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

两个文件将创建非常相似的图像,除了最后一个命令。如果您查看这两个映像的历史记录,您将看到以下内容:

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构建的图像的历史记录,您还可以看到不同的层(每一行是图像中的一个层)。正如你所看到的,前6层(!)在两个图像中是完全相同的。只有最后一层是不同的(并且具有不同的id)。当您构建图像时,您将看到这个效果非常好。当您构建第一个映像A时,它将花费一些时间,因为必须下载Apache等等。但是,当您之后构建映像B时,它只需要几秒钟,因为Apache不会再次下载,而是使用现有的层(此处id为9977b78fbad7) !

最新更新