Docker容器如何构建?

时间:2018-09-05 19:39:37

标签: docker

当我注意到一些有趣的输出时,我正在将一些图像推送到云集群:

$ docker push serviceD 
37794ab1f6ab: Mounted from serviceA 
a481fcabd5ce: Pushed 
6386b9576417: Pushed 
7b130cab9651: Pushed 
21981e3c578d: Pushed 
9d19b6b6a1f0: Mounted from serviceB
3e590131f755: Mounted from serviceB 
fd77fd1b66f8: Mounted from serviceB 
522caa449807: Mounted from serviceB 
8dfad2055603: Mounted from serviceA

这让我感到奇怪,当输出显示Mounted from serviceX时意味着什么?顺便说一下,这些是我已经推送的服务。我最初以为是因为某些服务(例如serviceD)与其他服务通信,所以事情是共享的。但是,由于我正在构建单个微服务,因此在构建此容器时,其他微服务就不会出现问题。

所以...我想我的问题是构建的具体步骤是什么?这些泊坞窗(假设是哈希值)从哪里来,为什么几个哈希值可能相同?老实说,我不确定该输出的含义是什么。这些哈希代表什么?

1 个答案:

答案 0 :(得分:1)

要了解构建过程,您必须熟悉Docker映像 layers 。每个图像都是在彼此之上构建的许多层。假设我们的Docker镜像是从Dockerfile构建的,在构建镜像时,我们会执行一组命令。 Dockerfile中的某些命令(例如ADD,RUN等)创建了所谓的 layer 。最后生成的图像是所有图层组合在一起的。如果要基于其他映像构建映像,则该映像将是基础映像的各个层,再加上Dockerfile中指定的层。

输出的每一行记录特定层的状态。哈希是这些层的ID。看起来您的映像是建立在serviceA或serviceB之上的,并且它们也相关。在这种情况下,您的映像将是您定义的层加上基本映像中的层(serviceA和ServiceB)的组合。当您将新生成的映像推送到远程Docker注册表时,该注册表已经具有serviceA和serviceB,Docker将仅复制您的层。注册表中已经存在其他层,它们将为您的新映像重复使用(装载)。