什么是Docker镜像"layers"?

12 浏览
0 Comments

什么是Docker镜像"layers"?

我对Docker还是一窍不通,正试图弄清楚Docker镜像到底是什么。每个对Docker镜像的定义都使用了\"层\"这个术语,但似乎没有明确定义\"层\"是指什么。\n来自官方Docker文档的解释如下:\n

\n我们已经看到Docker镜像是只读模板,用于启动Docker容器。每个镜像由一系列层组成。Docker利用联合文件系统将这些层合并成一个单一的镜像。联合文件系统允许透明叠加来自不同文件系统的文件和目录,形成一个统一的文件系统。\n

\n所以我想问,\"层\"到底是什么?有人可以给出一些具体的例子吗?这些层如何\"组合\"形成一个镜像?

0
0 Comments

Docker镜像的层是什么?

Docker镜像的层是指在构建镜像过程中,每个运行的命令都会生成一个临时容器,并在每个容器中创建、修改或删除文件。每个容器的文件系统变更都会生成一个层,当你将镜像作为容器运行时,所有的层都会被组装在一起。每个层都是不可变的,通过sha256哈希进行标识,这使得镜像可以安全地构建和派生。如果两个Dockerfile具有相同的初始行,并在同一台服务器上构建,它们将共享相同的初始层,从而节省磁盘空间。此外,只有最后几行Dockerfile发生更改时,只需要重新构建这些层,其余层可以从层缓存中重用,这可以使重新构建Docker镜像非常快速。

在容器内部,你可以看到镜像文件系统,但该文件系统并不是复制的。在镜像层之上,容器会挂载自己的读写文件系统层。每次对文件的读取都会通过所有层进行,直到找到标记该文件为删除的层、在该层中找到文件的副本,或者读取超出层的范围。每次写操作都会在容器特定的读写层中进行修改。

然而,镜像层也存在一些问题,例如构建镜像时可能会重复复制文件或者在后续层中删除的文件。为了解决这个问题,通常可以将多个命令合并为一个RUN命令。特别是在修改现有文件或删除文件时,可以将这些步骤放在最初创建它们的同一个命令中。这样做可以减少镜像的大小,避免重复复制和删除文件,提高构建效率。

Docker镜像的层是构建镜像过程中每个运行命令所生成的临时容器中的文件系统变更,这些层在容器运行时被组装在一起。通过合并命令、减少层的数量,可以减小镜像的大小,提高构建效率。

0
0 Comments

什么是Docker镜像“层”?

Docker容器镜像是使用Dockerfile创建的。Dockerfile中的每一行都会创建一个层。考虑以下虚拟的例子:

FROM ubuntu             #这有自己的层数,假设为“X”
MAINTAINER FOO          #这是一层
RUN mkdir /tmp/foo      #这是一层
RUN apt-get install vim #这是一层

这将创建一个最终的镜像,其中总的层数将是X+3。

尽管我没有点踩,但我猜想这解释了如何创建层,但并没有回答关于层是什么的问题。

我同意Karlsen和ashishjain的观点。我没有点踩你,实际上还给你点赞(+1),因为你试图帮助我,但为了我能够给你打上对勾,我需要理解层到底是什么!再次感谢,继续努力!

在我看来,这是最好的答案。对于我们这些开始“利用Docker”的人来说,它给了我们层是如何工作的概要。

“Dockerfile中的每一行都会创建一个层”——这对我来说非常有帮助。

但这并不是全部。大多数行都会创建一个层,但只有ADD、COPY或RUN指令会创建增加最终容器镜像大小的层。我说大多数行,因为如果你将命令链接在一起,或者用反斜杠转义换行符,链接的命令序列/转义的换行符将形成一个单独的命令。

0
0 Comments

Docker镜像“层”是什么?

Docker镜像“层”是指在镜像中的更改,或者说是中间镜像。在Dockerfile中的每个指令(如FROM、RUN、COPY等)都会导致前一个镜像发生变化,从而创建一个新的层。可以将其类比为使用git时的暂存更改:你添加一个文件的更改,然后再添加另一个文件的更改,以此类推。

考虑以下Dockerfile:

FROM rails:onbuild
ENV RAILS_ENV production
ENTRYPOINT ["bundle", "exec", "puma"]

首先,我们选择一个起始镜像:rails:onbuild,该镜像本身有许多层。然后,我们在起始镜像的基础上添加另一层,使用ENV命令设置环境变量RAILS_ENV。接下来,我们告诉Docker运行bundle exec puma(启动rails服务器)。这是另一层。

层的概念在构建镜像时非常有用。因为层是中间镜像,如果你对Dockerfile进行更改,Docker将仅重新构建被更改的层及其之后的层。这被称为层缓存。

你可以在这里阅读更多相关信息:https://www.ctl.io/developers/blog/post/caching-docker-images。

如果你改变或添加了一个层,Docker还会构建任何在其之后的层,因为它们可能受到更改的影响。

在上面的示例中,会添加多少个层呢?是2个还是1个?

应该是2个。改变ENV也是一种改变。看起来层就像是git的提交。

0