首页 > 其他分享 >Docker拉取镜像时的疑惑

Docker拉取镜像时的疑惑

时间:2024-08-11 12:05:49浏览次数:9  
标签:Layer 文件系统 拉取 镜像 Docker ID

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

标签:Layer,文件系统,拉取,镜像,Docker,ID
From: https://www.cnblogs.com/juniortree/p/18353235

相关文章

  • Docker移动数据目录
    生产环境规范部署docker#!/bin/bash#定义旧的和新的Docker数据目录old_dir="/var/lib/docker"new_dir="/data/docker"#确保脚本以root权限运行if["$(id-u)"!="0"];thenecho"这个脚本需要以root权限运行"1>&2exit1fi#......
  • 从Docker拉取镜像一直失败超时?这些解决方案帮你解决烦恼
    解决目前无法访问,超时连接方法解决方案1:配置加速地址配置加速地址:适用于Ubuntu16.04+、Debian8+、CentOS7+方式一:使用以下命令设置registrymirror:但是需要重启docker服务sudomkdir-p/etc/dockersudotee/etc/docker/daemon.json<<-'EOF'{"registry-mirrors":......
  • linux系统CENTOS 7安装docker
    前言:使用阿里云镜像,在CENTOS7版本上安装docker容器,方便使用docker容器安装其他软件。前置准备如果已经安装了docker,先将其卸载。yumremovedocker安装docker安装docker依赖的软件包。sudoyuminstall-yyum-utilsdevice-mapper-persistent-datalvm2添加阿里......
  • Docker简单使用MySQL
    前提安装好Docker下载Mysql镜像在这个网址搜索Mysql并选择合适的镜像https://hub.atomgit.com/详情页就有拉取镜像的命令查看Docker所有镜像​ dockerimages镜像重命名​ dockertag镜像id仓库:标签​ dockertag8a709252ac32mysql:5.7镜像启动(容器)dockerrun......
  • stable diffusion webui docker 离线部署
    AI绘图工具StableDiffusionStableDiffusion是一种基于扩散技术的深度学习文本到图像模型,于2022年发布,该项目由StabilityAI、CompVis、Runway合作开发,它主要用于文生图,但也可以应用于其他任务,如Inpainting(补画、Outpainting(扩画)、图生图等。Inpainting称......
  • 你必须掌握的Docker指令
    镜像查看所有镜像dockerimages拉取镜像dockerpull用户名/镜像名:版本号#一般镜像注意点:官方镜像无需用户名虽然不加版本号默认会选择latest标签,但强烈建议加上,否则可能会拉取失败(仓库未指定latest标签)导入导出镜像一般而言,在服务器上直接拉取镜像可能因......
  • Docker学习
    1.初识Docker1.1.什么是Docker微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署,环境不一定一致,会遇到各种问题1.1.1.应用部署的环境问题大型项目组......
  • portainer控制多个docker
    打开docker的远程访问(参考下方博客)觉得不安全可以配置使用TLS加密https://www.cnblogs.com/hongdada/p/11512901.html使用新版本portainer和我这个操作相同最后需要点击左上角Home切换Docker......
  • 10分钟学会Docker的安装和使用
    前言在现代软件开发中,Docker作为一种轻量级的容器化技术,已成为开发者必备的工具之一。本文将带您在10分钟内快速掌握Docker的安装和基本使用方法。1.Docker是什么?Docker是一种开源的容器化平台,它通过将应用程序及其所有依赖项打包到一个标准化的单元中,使应用程序能够在......
  • Ubuntu 通过 docker 安装 Nginx 镜像 + 创建并运行 nginx01 容器
    一、安装nginx:精简版镜像1.查找有什么类型的nginx镜像yammie@my-pc>/home/yammie$dockersearchnginx2.下载精简版nginx镜像yammie@my-pc>/opt$dockerpullnginx:alpinealpine:Pullingfromlibrary/nginx46b060cc2620:Alreadyexists21af147d2ad5:......