假设我将在一台机器上托管两个项目,并且它们都将使用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
) !