Docker镜像加载原理

news2024/11/18 2:48:45

文章目录

    • 什么是镜像 ?
    • Docker镜像加载原理
      • UnionFS (联合文件系统)
      • Docker镜像加载原理
      • 分层理解
    • 镜像Commit

什么是镜像 ?

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含
运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

Docker镜像加载原理

UnionFS (联合文件系统)

UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,
它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系
统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基
础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件
系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启
动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是
一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已
由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标
准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

在这里插入图片描述

平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才200M?

在这里插入图片描述

对于一个精简的OS,rootfs 可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。

分层理解

我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层一层的在下载!

在这里插入图片描述

思考:为什么Docker镜像要采用这种分层的结构呢?
最大的好处,我觉得莫过于是资源共享了!比如有多个镜像都从相同的Base镜像构建而来,那么宿主机
只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服
务了,而且镜像的每一层都可以被共享。
查看镜像分层的方式可以通过 docker image inspect 命令!

 docker image inspect redis:latest
[
    "RootFS": {
      "Type": "layers",
      "Layers": [
      
 "sha256:c2adabaecedbda0af72b153c6499a0555f3a769d52370469d8f6bd6328af9b13",
      
 "sha256:744315296a49be711c312dfa1b3a80516116f78c437367ff0bc678da1123e990",
      
 "sha256:379ef5d5cb402a5538413d7285b21aa58a560882d15f1f553f7868dc4b66afa8",
      
 "sha256:d00fd460effb7b066760f97447c071492d471c5176d05b8af1751806a1f905f8",
      
 "sha256:4d0c196331523cfed7bf5bafd616ecb3855256838d850b6f3d5fba911f6c4123",
      
 "sha256:98b4a6242af2536383425ba2d6de033a510e049d9ca07ff501b95052da76e894"
     ]
   },
    "Metadata": {
      "LastTagTime": "0001-01-01T00:00:00Z"
   }
 }
]

理解:

所有的 Docker 镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之
上,创建新的镜像层。
举一个简单的例子,假如基于 Ubuntu Linux 16.04 创建一个新的镜像,这就是新镜像的第一层;如果
在该镜像中添加 Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就
会创建第三个镜像层。
该镜像当前已经包含 3 个镜像层,如下图所示(这只是一个用于演示的很简单的例子)。

在这里插入图片描述

在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要。下图中举了
一个简单的例子,每个镜像层包含 3 个文件,而镜像包含了来自两个镜像层的 6 个文件。
在这里插入图片描述

上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件。
下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有 6 个文件,这是因为最上层中的文件
7 是文件 5 的一个更新版本。

在这里插入图片描述

这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新
镜像层添加到镜像当中。
Docker 通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统
一的文件系统。
Linux 上可用的存储引擎有 AUFS、Overlay2、Device Mapper、Btrfs 以及 ZFS。顾名思义,每种存储
引擎都基于 Linux 中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker 在 Windows 上仅支持 windowsfilter 一种存储引擎,该引擎基于 NTFS 文件系统之上实现了分
层和 CoW[1]。
下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。

在这里插入图片描述

特点

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下的都叫镜像层!

镜像Commit

docker commit 从容器创建一个新的镜像。

docker commit 提交容器副本使之成为一个新的镜像!# 语法
docker commit -m="提交的描述信息" -a="作者" 容器id 要创建的目标镜像名:[标签名]

测试

从Docker Hub 下载tomcat镜像到本地并运行 -it 交互终端 -p 端口映射

docker run -it -p 8080:8080 tomcat

注意:启动docker官方tomcat镜像的容器,发现404是因为使用了加速器,而加速器里的tomcat的webapps下没有root等文件!

解决方式
进入tomcat查看cd到webapps下发现全部空的,反而有个webapps.dist里有对应文件, cp-r到webapps下

 cp -r webapps.dist/* webapps

删除上一步镜像产生的tomcat容器的文档

docker ps     # 查看容器id
docker exec -it 容器id /bin/bash
/usr/local/tomcat # cd webapps/
/usr/local/tomcat/webapps # ls -l # 查看是否存在 docs文件夹
/usr/local/tomcat/webapps # curl localhost:8080/docs/  # 可以看到 docs 返回的内容
/usr/local/tomcat/webapps # rm -rf docs # 删除它
/usr/local/tomcat/webapps # curl localhost:8080/docs/  # 再次访问返回404

当前运行的tomcat实例就是一个没有docs的容器,我们使用它为模板commit一个没有docs的tomcat新镜像, tomcat02

查看容器的id 注意:commit的时候,容器的名字不能有大写,否则报错:invalid reference format

docker ps -l   
docker commit -a="kuangshen" -m="no tomcat docs" 1e98a2f815b0 tomcat02:1.1
sha256:cdccd4674f93ad34bf73d9db577a20f027a6d03fd1944dc0e628ee4bf17ec748

查看,我们自己提交的镜像已经OK了!

 docker images
REPOSITORY     TAG         IMAGE ID      CREATED   				 SIZE
tomcat02       1.1         cdccd4674f93    About a minute ago  649MB
redis        latest       f9b990972689     9 days ago   		104MB
tomcat       latest       927899a31456     2 weeks ago   		647MB
centos       latest       470671670cac     3 months ago  		237MB

这个时候,我们的镜像都是可以使用的,大家可以启动原来的tomcat,和我们新的tomcat02来测试看看!

docker run -it -p 8080:8080 tomcat02:1.1

如果你想要保存你当前的状态,可以通过commit,来提交镜像,方便使用,类似于 VM 中的快照!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/160186.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言-自定义类型-枚举和联合(11.3)

目录 思维导图: 1.枚举 1.1 枚举类型的定义 1.2 枚举的优点 1.3 枚举的使用 2. 联合(共用体) 2.1 联合类型的定义 2.2 联合的特点 2.3 联合大小的计算 写在最后: 思维导图: 1.枚举 1.1 枚举类型的定义 例&…

Spring复习(三)

AOP AOP(Aspect Oriented Programming)面向切面编程,aop是一种设计思想,是oop面向对象编程的一种补充和完善,它通过预编译方式和运行期间动态代理的方式达成在不修改源代码的情况下,实现对业务逻辑的增强。 相关术语 横切关注点…

论文投稿指南——中文核心期刊推荐(农业基础科学)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

【计组】存储器层次结构全景和局部性原理--《深入浅出计算机组成原理》(八)

课程链接:深入浅出计算机组成原理_组成原理_计算机基础-极客时间 目录 一、存储器层次结构全景 (一)SRAM (二)DRAM (三)存储器的层级结构 二、局部性原理 一、存储器层次结构全景 &…

Eureka读时加写锁,写时加读锁,到底是故意为之还是一个bug?

在对于读写锁的认识当中,我们都认为读时加读锁,写时加写锁来保证读写和写写互斥,从而达到读写安全的目的。但是就在我翻Eureka源码的时候,发现Eureka在使用读写锁时竟然是在读时加写锁,写时加读锁,这波操作…

uni-app | 从零创建一个新项目以及关于网络请求配置和分包

一、uni-app简介uni-app 是一个使用 Vue.js 开发所有前端应用的框架。开发者编写一套代码,可发布到 iOS、Android、H5、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)、快应用等多个平台。二、开发工具uni-app官方推荐使用HBuilderX来…

【JS 逆向百例】X-Bogus 逆向分析,JSVMP 纯算法还原

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未…

72小时灵感冲刺,创意就该这么玩 | LigaAI Hackathon特别策划

2023 年 1 月 9 日至 12 日,LigaAI 团队全员出逃:放下迭代,暂缓需求,处处充斥着「可以摸鱼➕卷死他们」的矛盾又欢乐的气息。职场和远程的伙伴们无一不在热烈讨论、积极组队、抢占会议室、搜刮零食饮料…… 是什么让矜持内敛的技…

微信小程序的启动和渲染过程(加组件分类和组件的基本使用以及API分类)

小程序的启动过程 把小程序的代码包下载到本地解析app.json全局配置文件执行app.js小程序入口文件,调用App()创建小程序实例渲染小程序首页小程序启动完成 小程序页面渲染的过程 加载解析页面的.json配置文件加载页面的.wxml模板和.wxss样式执行页面的.js文件,调用page(创建…

网站建设的具体流程

有网站制作需求的朋友想了解一下网站建设的具体流程,防止不良的网站制作公司的业务人员用虚假的工作量欺骗自己报出高价,米贸搜详细给你整理一下一个网站的建设有哪些流程:1.在线或当面沟通网站制作需求,详细沟通网站的功能需求、设计风格以及…

功率放大模块的作用是什么(功率放大器模块的应用范围)

功率放大模块是一种能够把开关电源、数字功放集成到一起的放大模块。很多人对于功率放大模块的作用是什么以及功率放大模的应用范围都不清楚,下面就来详细的为大家介绍下什么是功率放大模块以及功率放大模块的基础知识。 一、什么是功率放大模块 功率放大模块是一种…

谷歌AR应用挑战赛上那些富有创意的AR项目集锦

前不久,谷歌面向全球100多个国家和地区的开发者们推出ARCore Geospatial API挑战赛,获奖的AR应用可得到1000美元到1.2万美元的奖金,支持多种不同的内容类别,比如AR导航、AR游戏、AR娱乐等等。据悉,Geospatial API是谷歌…

贵阳某小区一次HC小区管理系统自研道闸故障解决记录

一次HC小区管理系统自研道闸故障解决记录,方便其他小伙伴出现问题的时候提供解决思路 早上九点钟 客户说道闸用不了,这个客户不是物业,而是科技公司,他们给物业安装的道闸。 问题描述是,mqtt 也重启了,物…

Allegro如何打开锁定走线线宽的功能操作指导

Allegro如何打开锁定走线线宽的功能操作指导 在做PCB设计的时候,有时需要用到锁定线宽的功能,让走线一直保持固定的线宽不变化,例如下图 任何网络的走线在任何地方都是固定20mil的线宽 具体操作如下 选择菜单的Setup选择User Preferences

解决IE页面打不开及白屏问题

IE浏览器控制台报错如下: 解决办法: ① public文件下新建TextEncoder.js /* eslint-disable */ ; var textEncoder (function(window) {if (undefined ! window.TextEncoder) { return }function _TextEncoder() {// --DO NOTHING}_TextEncoder.prot…

steam搬砖项目详细介绍

一、项目介绍 其实,Steam就是一个全球的游戏平台,搬砖主要是搬的一款火遍全球的游戏CSGO的装备和饰品。CS听说过吧,这款游戏就是CS的一个系列。(通俗易懂的理解就是,从国外steam游戏平台购买装备,再挂到国内…

分销商城小程序开发

武汉微驱动科技有限公司 目前电商行业正在蓬勃发展,越来越多的商家想要利用各种社交关系,用社交软件扩大经营规模,小程序分销是最近很火爆的流行趋势,不过有不少商家还不清楚“什么是小程序分销模式?小程序分销商城是什…

gerapy部署项目报错:ModuleNotFoundError: No module named ...

使用gerapy部署我的项目,rebuild的时候是成功的,但是deploy的时候失败了,报错: Client 1 Failed to Deploy 没有显示具体的错误,只能到gerapy的部署目录找日志。 根据 ll 命令,找到了最新的日志文件&…

AutoSAR Crypto_UtilizationOfCryptoServices-AUTOSAR加密服务使用

1 Stack Architecture The Crypto Service Manager (CSM) CSM控制一个或者多个Client对一个或者多个同步或异步加密服务。它提供了优先级队列来管理专用CRYPTO不能直接处理的作业 CSM的功能如下: ● HASH计算; ● 消息认证码的生成和校验; ●…

Centos6源码安装Haproxy进行四层代理

一.背景 公司使用专线与第三方公司进行系统交互,给定了我们业务IP的使用范围,防火墙策略只开放业务IP范围之内的IP地址才能访问,如果源IP不在业务IP范围之内,那么通过互联IP过去是访问不了的。我们的做法是为了不影响现有业务&…