docker会不会共享二进制文件?

时间:2014-05-08 09:44:11

标签: docker

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

1 个答案:

答案 0 :(得分:3)

不,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)!