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. MinIO Linux 数据迁移

    目录 安装 下载 安装Minio客户端 备份数据 数据还原 数据迁移 设置别名 迁移 从A服务器,迁移致B服务器,前提,需要两边的 Bucket 相同,如果B服务器没有A服务器里的 Bucket 需要 ...

  2. ShardingSphere分组聚合,数据异常问题

    在使用ShardingSphere分组聚合时是,出现了数据汇总不正确问题.我这里只进行了分表,未进行分库.使用的是广播查询,因为是定时任务统计,无法使用到分片键.进行分组的字段是两个 1. SQL查询 ...

  3. Windows Terminal 调整默认终端

    Windows Terminal 打开时默认的是 PowerShell, 如下图: 但是, 我希望默认的是更轻快的 cmd... 打开设置 调整 defaultProfile 为 cmd.exe 配置 ...

  4. golang实现命令行程序的使用帮助

    通过flag包我们可以很方便的实现命令行程序的参数标志, 接下来我们来看看如何实现命令行程序的使用帮助, 通常以参数标志-h或--help的形式来使用. 自动生成使用帮助 我们只需要声明其他参数标志, ...

  5. nrm

    nrm npm install -g nrm nrm ls nrm use taobao Tips:不要使用cnpm,会有些奇怪的问题,导致npm install失败. 参考

  6. Win10隐藏托盘图标-注册表

    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer NoTrayItemsDisplay(类型: ...

  7. HashMap 批量添加

    需要初始化一个常量HashMap,并希望在一行语句中完成.避免像这样的事情: hashMap.put("One", new Integer(1)); // adding value ...

  8. java泛型简单入门

    泛型 泛型 泛指某一种类型 ( 必须是 引用类型 ) 明确时机: 1.有时候 创建对象的时候, 明确泛型 2.有时候 调用一个方法时, 明确泛型 3.有时候 创建一个类型,然后实现一个接口的时候 明确 ...

  9. 关于用nw(node-webkit)开发windows桌面软件遇到的问题,包括nw项目打包、win10 C盘读写文件没权限等问题的解决方法

    原文: 关于用nw(node-webkit)开发windows桌面软件遇到的问题,包括nw项目打包.win10 C盘读写文件没权限等问题的解决方法 - 搜栈网 (seekstack.cn)https: ...

  10. 利用Edge浏览器扩展获取账号密码等敏感性信息

    免责声明:本文所涉及的技术仅供学习和参考,严禁使用本文内容从事违法行为和未授权行为,如因个人原因造成不良后果,均由使用者本人负责,作者及本博客不承担任何责任. 前言 edge扩展作为edge浏览器丰富 ...