写点什么

3. Docker 镜像详解

作者:鱼书
  • 2022 年 8 月 30 日
    北京
  • 本文字数:5766 字

    阅读完需:约 19 分钟

Docker 镜像详解

🌕镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容包括代码、运行时、库、环境变量和配置文件。所有的应用,直接打包 docker 镜像,就可以直接跑起来!如何得到镜像:

  • 从远程仓库下载

  • 朋友拷贝给你

  • 自己制作一个镜像 DockerFile

🌕Docker 镜像加载原理

UnionFS:(联合文件系统)

我们在拉取 hello world 的时候,看到的一层层的就是这个!

用来记录每一次修改,查看是否是新增或者叠加

  • UnionFS(联合文件系统):Union 文件系统(UnionFS)是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(uniteseveral directories into a single virtual filesystem)。

  • Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

  • 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

类似于 Git 版本控制系统


1661158780370.png


例如都要下载 Tomcat 和 MySQL,其中 Tomcat 已经下载了 centos,那么在下载 MySQL 时就不用单独下载,而是他们共用一个 centos


1661158809146.png


Docker 镜像加载原理

  • docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统 UnionFS.

  • bootfs(boot file system)主要包含 bootioader 和 kenel,bootloader 主要是引导加载 kemel,Linux 刚启动时会加载 bootfs 文件系统,在 Docker 镜像的最底层是 bootfs。这一层与我们典型的 Linux/Unix 系统是一样的,包含 boot 加载器和内核。当 boot 加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs 转交给内核,此时系统也会卸载 bootfs

  • rootfs (root file system),在 bootfs 之上。包含的就是典型 Linux 系统中的/dev/proc,/bin/etc 等标准目录和文件。rootfs 就是各种不同的操作系统发行版,比如 Ubuntu,Centos 等等。

bootfs:系统启动引导需要加载。黑屏———>开机(加载)这一部分就是公用的,相当于文件联合系统的概念


1661158834674.png


平时我们安装进虚拟机的 Centos 都是好几个 G,而 Docker 才 200M

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

🌕分层理解

下载一个镜像,查看下载的日志输出,可以看到是一层一层的在下载


1661158862967.png


#用docker image inspect redis:latest 查看下载redis信息
[root@VM-16-15-centos ~]# docker image inspect redis:latest[ //...... "RootFS": { "Type": "layers", "Layers": [ "sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f", "sha256:9b24afeb7c2f21e50a686ead025823cd2c6e9730c013ca77ad5f115c079b57cb", "sha256:4b8e2801e0f956a4220c32e2c8b0a590e6f9bd2420ec65453685246b82766ea1", "sha256:529cdb636f61e95ab91a62a51526a84fd7314d6aab0d414040796150b4522372", "sha256:9975392591f2777d6bf4d9919ad1b2c9afa12f9a9b4d260f45025ec3cc9b18ed", "sha256:8e5669d8329116b8444b9bbb1663dda568ede12d3dbcce950199b582f6e94952" ] }, "Metadata": { "LastTagTime": "0001-01-01T00:00:00Z" } }]

复制代码

分层信息:


1661158876381.png


🌗分层的优点

资源共享是最大的优点!比如有多个镜像都从相同的 Base 镜像构建而来,那么宿主只需要在磁盘上保留一份 base 镜像,同时内存中只需要加载一份 base 镜像,这样就可以为所有容器服务了,而且镜像的每一层都可以被共享。

查看镜像分层可以通过:docker image inspect命令!!

[root@VM-16-15-centos ~]# docker image inspect redis:latest[   //......        "RootFS": {            "Type": "layers",            "Layers": [                            "sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f",                            "sha256:9b24afeb7c2f21e50a686ead025823cd2c6e9730c013ca77ad5f115c079b57cb",                            "sha256:4b8e2801e0f956a4220c32e2c8b0a590e6f9bd2420ec65453685246b82766ea1",                               "sha256:529cdb636f61e95ab91a62a51526a84fd7314d6aab0d414040796150b4522372",                            "sha256:9975392591f2777d6bf4d9919ad1b2c9afa12f9a9b4d260f45025ec3cc9b18ed",                            "sha256:8e5669d8329116b8444b9bbb1663dda568ede12d3dbcce950199b582f6e94952"            ]        },        "Metadata": {            "LastTagTime": "0001-01-01T00:00:00Z"        }    }]
复制代码

🌗理解分层

  • 所有的 Docker 镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上创建新的镜像层。

  • 举一个简单的例子,假如基于 UbuntuLinux16.04 创建一个新的镜像,这就是新镜像的第一层:如果在该镜像中添加 Python 包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。

  • 该镜像当前已经包含 3 个镜像层,如下图所示(这只是一个用于演示的很简单的例子)。


1661158891193.png


  • 在添加额外的镜像层同时,镜像始终保持是当前所有镜像的组合,每个每个镜像层包含 3 个文件,而镜像包含了来自来个镜像层的 6 个文件


1661158904151.png


  • 下图,在外部看来整个镜像只有 6 个文件,这是因为最上层的文件 7 是文件 5 的一个更新版本。


1661158915180.png


这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。

Docker 通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。

Linux 上可用的存储引擎有 AUFS、Overlay2DeviceMapperBtrfs 以及 ZFS。顾名思义,每种存储引擎都基于 Linux 中对应的文件系统或者块设备技术,并且每种存储引整都有其种有的性能特点。

Docker 在 Windows 上仅支持 windowsfilter 一种存储引擎,该引擎基于 NTFS 文件系统之上实现了分层和 CoW[1]。

下图屏示了与系统易示相同的三层镜像,所有镜像层堆叠并合并,对外提供统一的视图。


1661158925940.png


🌗特点

  • 假设有些层是相同的,我们就可以直接复用

  • Docker 镜像是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!

  • 这一层就是我们通常说的容器层,容器层之下的都叫镜像层!


1661158936626.png


🌗commit 镜像

docker commit  #命令提交容器成为一个新的版本#命令和git一样docker commit -m=“提交的描述信息”  -a="作者" 容器id 目标镜像名:[TAG] 
复制代码
🌗实战测试
  • 默认的官方 Tomcat 镜像的 webapps 文件夹中没有任何内容,需要从 webapps.dist 中拷贝文件到 webapps 文件夹。

  • 下面自行制作镜像:就是从 webapps.dist 中拷贝文件到 webapps 文件夹下,并提交该镜像作为一个新的镜像。使得该镜像默认的 webapps 文件夹下就有文件。具体命令如下:

# 将我们操作过的容器通过commit提交为一个镜像!这就是以后使用我们修改过的镜像即可。这就是我们自己的一个修改的镜像
#1.启动tomcat[root@VM-16-15-centos ~]# docker run -it -p 3355:8080 tomcat

#打开一个新的命令窗口 进入tomcat[root@VM-16-15-centos ~]# docker exec -it 4f7d099bd5ec /bin/bashroot@4f7d099bd5ec:/usr/local/tomcat# lsBUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.distCONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps workroot@4f7d099bd5ec:/usr/local/tomcat# cd webappsroot@4f7d099bd5ec:/usr/local/tomcat/webapps# lsroot@4f7d099bd5ec:/usr/local/tomcat/webapps# cd ..root@4f7d099bd5ec:/usr/local/tomcat# lsBUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.distCONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
#3.将webapps.dist下面的全部文件拷贝到webapps下root@4f7d099bd5ec:/usr/local/tomcat# cp webapps.dist/* webapps

#4. 提交自己的镜像[root@VM-16-15-centos ~]# docker commit -a="dainiao" -m="add webapps app" 176c3aef6cdd romcat02:1.0sha256:66f12723b8138fcb1a81576012cb7597e19bb65dd8e0af4d5aeb156eaaae3f43
#5.查看发现自己的镜像多了一个tomcat02[root@VM-16-15-centos ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEromcat02 1.0 66f12723b813 11 seconds ago 684MBnginx latest 605c77e624dd 5 months ago 141MBtomcat latest fb5657adc892 5 months ago 680MBredis latest 7614ae9453d1 5 months ago 113MBcentos latest 5d0da3dc9764 9 months ago 231MB
复制代码


1661158949783.png


如果你你想要保存当前容器状态,就可以通过commit来提交,获得一个镜像,就好比我们学习的虚拟机VM的快照!!!
复制代码

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

存储

 关系型数据库 MySQL Linux 应用服务中间件 开发工具 git Docker Python 容器

Docker镜像开发者社区

 > 开发与运维 > 文章

评论

小呆鸟

评论

相关文章



auqbllxiuDocker之 - 使用镜像和仓库(三)

上一篇文章中,我们学习了包括 docker run 在内的许多对容器进行操作的基本指令,那么在本节中,我们主要探讨 Docker 镜像的一些概念,比如什么是镜像,如何对镜像进行管理,如何修改镜像,如何创建、存储、共享自己创建的镜像等,那么就开始我们的学习

21 0



auqbllxiuDocker之 - 使用镜像和仓库(一)

上一篇文章中,我们学习了包括 docker run 在内的许多对容器进行操作的基本指令,那么在本节中,我们主要探讨 Docker 镜像的一些概念,比如什么是镜像,如何对镜像进行管理,如何修改镜像,如何创建、存储、共享自己创建的镜像等,那么就开始我们的学习

28 0



游客xaubllxwtvaquDocker之 - 使用镜像和仓库(一)

上一篇文章中,我们学习了包括 docker run 在内的许多对容器进行操作的基本指令,那么在本节中,我们主要探讨 Docker 镜像的一些概念,比如什么是镜像,如何对镜像进行管理,如何修改镜像,如何创建、存储、共享自己创建的镜像等,那么就开始我们的学习

156 0



游客xaubllxwtvaquDocker之 - 使用镜像和仓库(二)

上一篇文章中,我们学习了包括 docker run 在内的许多对容器进行操作的基本指令,那么在本节中,我们主要探讨 Docker 镜像的一些概念,比如什么是镜像,如何对镜像进行管理,如何修改镜像,如何创建、存储、共享自己创建的镜像等,那么就开始我们的学习

72 0



游客xaubllxwtvaquDocker之 - 使用镜像和仓库(三)

上一篇文章中,我们学习了包括 docker run 在内的许多对容器进行操作的基本指令,那么在本节中,我们主要探讨 Docker 镜像的一些概念,比如什么是镜像,如何对镜像进行管理,如何修改镜像,如何创建、存储、共享自己创建的镜像等,那么就开始我们的学习

58 0


优惠码优惠Docker之- 使用Docker 镜像和仓库

Docker 之- 使用 Docker 镜像和仓库目录 使用 Docker 镜像和仓库什么是 Docker 镜像列出 Docker 镜像 tag 标签 Docker Hub 拉取镜像查找镜像构建镜像创建 Docker Hub 账号使用 Docker 的 commit 命令创建镜像使用 Dockerfile 构建镜...

5587 0


hiekay使用Docker镜像和仓库

使用 Docker 镜像和仓库

1592 0



游客3fxpohbdpoqm2什么,容器太多操作不过来?我选择Docker Compose梭哈(下)

什么,容器太多操作不过来?我选择 Docker Compose 梭哈(下)

198 0


技术小阿哥Docker容器学习梳理--手动制作系统镜像

795 0


技术小阿哥Docker容器学习梳理-容器时间跟宿主机时间同步

1636 0


小呆鸟

你只管努力,剩下的交给时间

60

文章

0

问答

文章排行榜

最热

最新

1阿里云 Lindorm联合EMQ ,构建新一代 IoT 全链数据解决方案2522842当我们谈论不可变基础设施时,我们在谈论什么2453643云上自动化运维CloudOps系列沙龙 第二弹——自动化,才高效2456304业务中台之上的低代码应用开发平台2426895【AI征文】对DeepRec认识以及了解955866十分钟生成影视级室内设计效果,红星美凯龙设计云如何升级传统家居行业1052517【AI征文】初识DeepRec591648云上解锁Web3.0 阿里云XR平台助力彼真科技呈现沉浸式演唱会682299“穿越”到虚拟世界笑风生,网易瑶台沉浸式活动平台创新云端活动体验7969610镜像站体验官新一期任务发布,完善镜像站配置信息拿天猫精灵音箱3598311揭秘!真假美猴王与如来的那起运维事故3442812阿里云联合平行云推出云XR平台,支持沉浸式体验应用快速落地 | 电子书免费下载3511413初识Serverless函数计算2839514Lindorm CDC技术解析2464115为什么我要迁移 SpringBoot 到函数计算2205516你真的会在函数计算FC上部署springboot云上博客吗2459517云端舞蹈——阿里云Serverless函数计算测评3049418SaaS厂商数据库设计(2)-租户路由3106119“智物智造”杯2022物联网创新应用大赛,你的idea 改变世界!5332720有奖互动|7.19数据库升舱计划实战峰会:行业领袖齐聚,他们因何而来?11725

推荐文章

参与评测免费使用模型库赢取AirPods等好礼寻找百位乘风者伯乐,邀约新博主入驻可获乘风者定制周边及重力星球蓝牙音箱!参与云效评测赢取机械键盘大礼乘风者计划邀您入驻社区,精彩权益即刻享

相关电子书

更多










90.ppt[a0zy].1486651922.ppt

立即下载

目录

Docker镜像详解🌕镜像是什么🌕Docker 镜像加载原理🌕分层理解🌗分层的优点🌗理解分层🌗特点

用户头像

鱼书

关注

还未添加个人签名 2022.08.29 加入

还未添加个人简介

评论

发布
暂无评论
3. Docker镜像详解_c++_鱼书_InfoQ写作社区