Docker拉取镜像时的疑惑

不知道你在拉取镜像的时候会不会有这样的疑惑——我不是只拉取了一个镜像嘛,为什么会出现这么多的东西

Docker中Layer(层)的概念

在 Docker 中,镜像(Image)是由多个层(Layer)组成的。这些层就像文件系统的快照,每一层都记录了从上一层开始的一系列变化。我们上面下载时候出现的ec99f8b99825就属于一个层。

诸如 ec99f8b99825 的字符串是层的唯一标识符(Layer ID)。每一层都有一个独特的 ID,用来识别和引用这一层。拉取镜像时,Docker 会逐层下载这些层,并最终组合成一个完整的镜像。

使用层对于Docker镜像有以下好处:

  1. 共享和复用:如果不同的镜像共享相同的基础层,那么这些层只需要下载和存储一次,节省了磁盘空间和下载时间。
  2. 分层构建:Dockerfile 中的每一条指令(如 RUN, COPY, ADD 等)都会创建一个新的层。这样如果你对 Dockerfile 进行了一些小的修改,Docker 只需要重建修改后的部分,而不需要重新构建整个镜像。

Layer的建立

当你使用 Dockerfile 创建镜像时,Docker 会按照 Dockerfile 中的每一条指令逐步构建镜像。每一条指令都会生成一个新的层,这个层记录了指令执行后文件系统的变化。最终镜像是由这些层按顺序叠加而成。

例如你现在有一个Dockerfile

FROM ubuntu:20.04
RUN apt-get update
RUN apt-get install -y python3
COPY . /app
  • FROM ubuntu:20.04:这条指令会拉取一个基础镜像(ubuntu:20.04)。这个镜像已经包含了操作系统的基本文件系统,它是整个镜像的基础层。
  • RUN apt-get update:这条指令会更新包管理器的索引,并生成一个新的层,记录了更新后的系统状态。
  • RUN apt-get install -y python3:这条指令安装 Python3,同样会生成一个新的层,记录安装 Python3 后文件系统的变化。
  • COPY . /app:这条指令将当前目录下的所有文件复制到镜像中的 /app 目录,生成一个新的层,记录这些文件的添加。

最终生成的镜像由这几层叠加而成,每一层都记录了自上一个层以来的文件系统的变化。

Cached layers (缓存层)

当你运行构建时,构建器会尝试重用早期构建中的层。如果图像的某个图层未更改,则构建器会从构建缓存中选取它。如果自上次构建以来某个层发生了更改,则必须重新构建该层以及后续的所有层。

这样如果你对 Dockerfile 进行了一些小的修改,Docker 只需要重建修改后的部分,而不需要重新构建整个镜像。

Layer的复用

这个其实算比较常见了,如果你拉取的镜像共用同一Layer,那么它不必重新拉取,而是可以复用。

每个层都有一个唯一的 ID,用来标识这一层。这个 ID 是通过对层内容进行哈希计算生成的,因此相同内容的层总是会生成相同的 ID。

当你拉取一个镜像时,Docker 会显示每个层的 ID。例如,诸如 ec99f8b99825 的字符串就是层的 ID。Docker 会逐层检查本地是否已经有该层,如果有就会跳过下载,直接复用本地已有的层。如果没有,则会从镜像仓库下载该层。

Layer的合并与文件系统

当你拉取一个镜像时,Docker 会从远程仓库逐层下载组成该镜像的所有层。每个层下载完成后,Docker 会显示该层的状态,如 “下载完成”、“拉取完成”等。最终,这些层会在本地组合起来,形成完整的镜像。

虽然镜像由多个层组成,但在容器内,这些层会合并为一个统一的文件系统。容器看到的文件系统是这些层的叠加结果,每一层的更改会覆盖上层的内容。例如,如果在后面的层中删除或修改了文件,容器内的文件系统会反映这些变化,而不会看到原始的文件。

如果你对类似的文章感兴趣的话,欢迎访问:小树 | Docker拉取镜像时的疑惑——Layer

参考文章:Docs Docker | Layer

Docker拉取镜像时的疑惑的更多相关文章

  1. Docker拉取镜像时错误解决办法

    拉取docker中的镜像时报错: [root@master ~]# docker pull docker.io/centos:latest Trying to pull repository dock ...

  2. docker拉取镜像报错:net/http: TLS handshake timeout.

    docker拉取镜像报错:net/http: TLS handshake timeout. 启动一个后台的busybox容器 [yunva@node1 network-scripts]$ docker ...

  3. Docker拉取镜像加速

    关于Docker拉取镜像加速 打开桌面 docker 小图标 选中框框 根据下图 添加国内的加速源即可 Docker加速源 #网易 http://hub-mirror.c.163.com #Docke ...

  4. Docker 拉取镜像速度太慢

    Docker Hub 是我们分发和获取 Docker 镜像的中心,但由于服务器位于海外,经常会出现拉取/上传镜像时速度太慢或无法访问的情况.再加上运营方不断对 Docker Hub 的免费使用进行限制 ...

  5. 【docker】【mysql】docker安装mysql,阿里云docker镜像加速器,docker搜索查看远程仓库上的镜像,docker拉取镜像,查看本地所有镜像,查看容器的运行状况,查看容器的详细信息

    在docker上安装mysql有两种方式 1.通过Dockerfile构建 2.直接在docker hub上拉取镜像安装 =================本篇采用方法2=============== ...

  6. 【docker】解决docker pull镜像 拉取镜像龟速的问题,docker拉取镜像使用阿里云docker镜像加速器

    在docker拉取mysql镜像过程中,出现龟速的问题,解决这个问题的方法: 这个页面 停留了好久好久,依旧没有下载完成. 碰上这种情况 1.先退出Ctrl+C 2.在浏览器上进入阿里云docker库 ...

  7. 使用 docker 拉取镜像和创建容器-nginx

    本文主要分享通过从docker  hub上获取nginx镜像 1.首先查找nginx镜像 [root@node1 ~]# docker search nginx NAME DESCRIPTION ST ...

  8. docker学习笔记(1)——ubuntu16.04安装docker(含如何彻底卸载docker,docker拉取镜像失败解决)

    参考博客: 1.官网教程:https://docs.docker.com/engine/install/   根据本机不同的信息选择不同的安装方式:  https://docs.docker.com/ ...

  9. 使用阿里云对docker拉取镜像加速

    使用docker的时候,总是需要去search镜像,使用国外的源下载太慢,还有诸多的限制,无意中发现可以使用阿里云进行加速,实测有用,废话少说,操作如下: 1.打开阿里云控制台,没有的可以用淘宝账号或 ...

  10. [日常] 解决docker拉取镜像速度慢的问题

    将docker修改为国内镜像源 在/etc/docker/daemon.json文件中添加下面参数 此处使用的是中国科技大学的docker镜像源 {    "registry-mirrors ...

随机推荐

  1. Set Cover问题的贪心近似算法分析

    问题描述 全集 \(U = \{ e_1, e_2, ... , e_n \}\) 被划分为一系列的子集 \(S = \{ S_1, S_2, ... , S_k \}\).且存在一个cost函数\( ...

  2. Android 实现人脸识别 活体检测以及人脸搜索

    关于「保护伞FaceAI SDK」 Umbrella FaceAI SDK is on_device Offline Android Face Detection .Recognition .Live ...

  3. 数据库自增 ID 用完了会怎么样?

    前言 数据库中的自增 ID 用完了该怎么办? 这个问题可以分为有主键 & 无主键两种情况回答. 有主键 如果你的表有主键,并且把主键设置为自增. 在 MySQL 中,一般会把主键设置成 int ...

  4. Go map字典排序

    前言 我们已经知道 Go 语言的字典是一个无序集合,如果你想要对字典进行排序,可以通过分别为字典的键和值创建切片,然后通过对切片进行排序来实现. 按照键进行排序 如果要对字典按照键进行排序,可以这么做 ...

  5. 编写你的第一个 Django 应用程序,第7部分

    本教程从教程 6 停止的地方开始.我们将继续使用网络投票应用程序,并将专注于自定义 Django 自动生成的管理站点,这是我们在教程 2 中首次探索的. 一.自定义管理表单 通过用 admin.sit ...

  6. 批量操作DB

    批量操作DB 记录一次批量操作数据库,sqlServer服务器参数过多问题. 1.案例引入 对接另一个批发系统B,B需要把订单那些数据弄到系统A中.就是一个批量插入,批量更新的问题.系统保密需要,本文 ...

  7. Docker,vs2019下 使用.net core创建docker镜像 遇到的一些问题

      步骤主要分为以下几步: 1.创建docker for linux 的.netcore 项目(vs 自动创建了dockerfile 如果没有需要自己创建在根目录下) 2.编译项目到指定目录下 3.b ...

  8. [.net core] 创建和发布NuGet包 (dotnet CLI)

    [原文] :https://docs.microsoft.com/zh-cn/nuget/quickstart/create-and-publish-a-package-using-the-dotne ...

  9. Web前端入门第 25 问:CSS 中 11 种颜色写法

    曾经,CSS 颜色的写法很专一,就只有十六进制写法(#ff0000)和关键字写法(red). 现在,它变了,变得花样多了,各种招式眼花缭乱. 以红色(red)为例: 1. 颜色关键字 直接使用预定义的 ...

  10. HTB打靶记录-TheFrizz

    信息收集 nmap -sV -sC -O 10.10.11.60 Nmap scan report for 10.10.11.60 Host is up (0.63s latency). Not sh ...