假设我将在一台机器上托管两个项目,并且它们都将使用apache。然后我需要创建两个容器来分隔它们。我需要在两个容器中运行apt-get install apache2
。它会占用apache2大小的两倍空间吗?
答案 0 :(得分:3)
不,Apache将在两个容器之间共享。如果您创建图像,则每个步骤都将保存在自己的图层中。例如,您从Ubuntu(第1层)开始并安装Apache(第2层)。然后将项目A添加到图像(第3层)。在另一个Docker镜像中,您还可以从Ubuntu(第1层)开始并安装Apache(第2层)。但随后您将项目B添加到图像(第3层)。两个图像将相同,直到第3层。这意味着将共享Apache的安装。
FROM ubuntu
RUN apt-get update
RUN apt-get install -y apache2
RUN touch /opt/a.txt
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
)!