赞
踩
镜像的理解:
Docker 镜像采用分层结构来构建和管理,这是其轻量、高效和可复用性的关键。镜像的分层结构使得 Docker 镜像在构建、部署和更新过程中非常灵活,同时节省存储空间和下载时间。下面是 Docker 镜像分层的详细介绍。
总的来说,Docker 镜像的分层结构是一种高效、灵活和可复用的设计,它使得 Docker 容器化应用程序在不同的环境中可以轻松部署和运行,同时节省了存储空间和提高了构建和下载速度。这种设计也促进了 Docker 生态系统的发展和镜像的共享,使得 Docker 成为一种广泛使用的容器化技术。
通过 docker pull 命令拉取指定的镜像时,每个 Pull complete 结尾的行就代表下载完毕了一个镜像层。
- # docker pull nginx
- Using default tag: latest
- latest: Pulling from library/nginx
- a2abf6c4d29d: Already exists
- a9edb18cadd1: Pull complete
- 589b7251471a: Pull complete
- 186b1aaa4aa6: Pull complete
- b4df32aa5a72: Pull complete
- a0bcbecc962e: Pull complete
- Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
- Status: Downloaded newer image for nginx:latest
- docker.io/library/nginx:latest
有些版本不一样,但是他们的镜像分层有些是一样的。即不同镜像对相同下层镜像的复用
- # docker pull zookeeper:3.7.1-temurin
- 3.7.1-temurin: Pulling from library/zookeeper
- 9d19ee268e0d: Already exists
- 32db0ad82863: Already exists
- e01bb55fbcae: Already exists
- 297c6e3f57ee: Already exists
- 49c4f235b5f6: Already exists
- 82b2637e3748: Already exists
Docker 镜像是由一系列只读的文件系统层构成的,这些层会按特定顺序叠加在一起,构成一个完整的镜像。镜像层的设计使得 Docker 具有轻量、高效和可复用的特性。下面是 Docker 镜像层构成的详细介绍:
每个镜像层由两部分构成:镜像文件系统与镜像 json 文件。这两部分具有相同的 ImageID。镜像文件系统就是对镜像占有的磁盘空间进行管理的文件系统,拥有该镜像所有镜像层的数据内容。而镜像 json 文件则是用于描述镜像的相关属性的集合,通过 docker inspect [镜像]就可以直观看到。
Docker 镜像的 FS(文件系统)构成是指镜像是如何由多个只读文件系统层叠加在一起的。镜像的 FS 构成具有联合文件系统(UnionFS)的特点,这使得 Docker 镜像可以共享和重用底层层,并且能够快速高效地创建新的镜像。
下面是 Docker 镜像 FS 构成的详细介绍:
一个 docker 镜像的文件系统 FS 由多层只读的镜像层组成,每层都完成了特定的功能。而这些只读镜像层根据其位置与功能的不同可分为两类:
Docker 的基础镜像层是构成 Docker 镜像的核心组成部分之一。Docker 镜像是由多个只读的文件系统层叠加在一起构成的,基础镜像层是这些层中的第一层。下面是基础镜像层的详细介绍:
基础镜像的选择对于 Docker 镜像的大小、性能、安全性和可维护性都有重要影响。因此,在选择基础镜像时,需要考虑以下几点:
所有镜像的最下层都具有一个可以看得到的基础镜像层 Base Image,基础镜像层的文件系统称为根文件系统 rootfs。而 rootfs 则是建立在 Linux 系统中**“看不到的”引导文件系统bootfs 之上。
在 Docker 中,“扩展镜像层” 是指在一个现有的基础镜像上构建新的镜像层,以添加或修改容器所需的内容和配置。Docker 使用分层文件系统的方式来管理镜像,每个镜像层都包含一个或多个文件或目录的更改。当你在现有的镜像上进行更改时,Docker 会在原有的镜像层之上创建一个新的镜像层,这个过程就是所谓的 “扩展镜像层”。
下面是扩展镜像层的详细介绍:
在基础镜像层之上的镜像层称为扩展镜像层。顾名思义,其是对基础镜像层功能的扩展。在 Dockerfile 中,每条指令都是用于完成某项特定功能的,而每条指令都会生成一个扩展镜像层。
Docker 的容器层是 Docker 容器的一个核心概念,它是 Docker 镜像的运行实例。当你从 Docker 镜像创建一个容器时,Docker 在镜像的基础上添加了一个可写的容器层,用于存储容器运行时的变更和数据。容器层与镜像层相互结合,使得容器能够在镜像的基础上添加或修改文件、运行进程,并保留这些更改,而不影响基础镜像的原始内容。
下面是容器层的详细介绍:
一旦镜像运行了起来就形成了容器,而容器就是一个运行中的 Linux 系统,其也是具有文件系统的。容器的这个文件系统是在 docker 镜像最外层之上增加了一个可读写的容器层,对文件的任何更改都只存在于容器层。因此任何对容器的操作都不会影响到镜像本身。
容器层如果需要修改某个文件,系统会从容器层开始向下一层层的查找该文件,直到找到为止。任何对于文件的操作都会记录在容器层。例如,要修改某文件,容器层会首先把在镜像层找到的文件 copy 到容器层,然后再进行修改。删除文件也只会将存在于容器层中的文件副本删除。
可以看出,Docker 容器就是一个叠加后的文件系统,而这个容器层称为 Union File System,联合文件系统。
每个镜像都有一个长度为 64 位的 16 进制字符串作为其摘要 digest。
Docker 镜像摘要是指镜像的摘要信息,通常被称为镜像的 Digest。它是镜像内容的唯一标识符,类似于 Git 中的 SHA 值,用于确保镜像的完整性和唯一性。摘要是一个由算法计算得出的长字符串,它代表了镜像内容的具体信息,包括镜像层和配置信息。
以下是 Docker 镜像摘要的详细介绍:
通过 docker inspect 命令可以查看指定镜像的详细信息。其中就包含该镜像的摘要信息。
# docker inspect nginx
通过 docker images --digests 命令也可以查看到镜像的摘要信息。
- # docker images nginx --digests
- REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
- nginx latest sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31 605c77e624dd 18 months ago 141MB
-
在 push 或 pull 镜像时,都会对镜像进行压缩以减少网络带宽和传输时长。但压缩会改变镜像内容,会导致经过网络传输后,镜像内容与其 digest 不相符。出现问题。(也就是在自己机器上进行压缩的hash值和传输到docker hub后hsah值不相同了,因为传输的时候还会压缩)
为了避免该问题,Docker 又为镜像配置了 Distribution Hash(分发散列值)。在镜像被压缩后立即计算分发散列值,然后使该值随压缩过的镜像一同进行发送。在接收方接收后,立即计算压缩镜像的分发散列值,再与携带的分发散列值对比。如果相同,则说明传输没有问题
镜像的hsah值和压缩后的hash值会一起传输到docker hub。
Docker 多架构镜像(Multi-architecture Images)是指一种能够在不同硬件架构上运行的 Docker 镜像。传统上,Docker 镜像是为特定的硬件架构(如x86、ARM等)构建的,而多架构镜像则允许在不同的硬件架构上共享和使用相同的镜像。
下面是 Docker 多架构镜像的详细介绍:
Multi-architecture Image,即多架构镜像,是某中的某镜像针对不同操作系统/系统架构的不同镜像实现。即多架构镜像中包含的镜像的:都是相同的,但它们针对的操作系统/系统架构是不同的
Docker 的多架构镜像(Multi-architecture Images)是指在同一个镜像中包含了多个不同硬件架构的二进制文件,使得同一个镜像可以在多个不同架构的计算机上运行。这种机制使得在不同硬件平台上部署和运行容器变得更加灵活和便捷。下面是 Docker 多架构镜像的工作原理的详细介绍:
在 Docker Hub 中,镜像的多架构信息保存在 Manifest 文件中。在拉取镜像时,Docker会随着 pull 命令将当前 Docker 系统的 OS 与架构信息一并提交给 Docker Hub。Docker Hub 首先会根据镜像的:查找是否存在 Manifest。如果不存在,则直接查找并返回:镜像即可;如果存在,则会在 Manifest 中查找是否存在指定系统/架构的镜像。如果存在该系统/架构,则根据 Manifest 中记录的地址找到该镜像的位置。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。