【云原生 | 从零开始学Docker】四、Docker镜像深度解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 相信大家经过前面的练习都掌握了基本的指令,在实战操作之后我们就要进行镜像的详解来帮助大家对于docker有一个更深层次的理解,并且会介绍一下我们的容器卷,后面也会用到容器卷进行数据同步!

镜像原理


镜像是什么


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


容器与镜像的关系


容器是一个动态的环境,每一层镜像中的文件属于静态内容,然而 Dockerfile 中的ENV、VOLUME、CMD等内容最终都需要落实到容器的运行环境中,而这些内容均不可能直接坐落到每一层镜像所包含的文件系统内容中,那此时每一个docker镜像还会包含json文件记录与容器之间的关系。


镜像加载原理


UnionFS(联合文件系统)


联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。


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


举个例子,比如一个mysql,一个tomcat,tomcat下载了centos,mysql就不用下载了 ,过去就用,并且他是一层一层叠加的。


分层加载


Docker的镜像实际由一层一层的文件系统组成:


bootfs


主要包含bootloader和kernel。bootloader主要是引导加载kernel,完成后整个内核就都在内存中了。此时内存的使用权已由bootfs转交给内核,系统卸载bootfs。可以被不同的Linux发行版公用。


bootfs 启动的时候都要引导加载,加载linux的东西几乎不变,一个内核一个加载器,加载完之后会自动卸载卸载bootfs并把权限交给内核。


rootfs


包含典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同操作系统发行版(Ubuntu,Centos等)。因为底层直接用Host的kernel,rootfs只包含最基本的命令,工具和程序就可以了。


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


49.png


所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的容器层,比如centos是第一层,python是第二层。这样有一个最大的一个好处就是共享资源


比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像, 同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。实现了资源共用,所以pull是分层下载,避免重复下载,简单的类比就是虚拟机,你多个虚拟机用同一个镜像。


并且在添加额外的镜像层时,它会始终保持所有镜像组合,比如一个镜像两层,每层三个文件,最终拼起来是六个文件,但是突然来了个新需求,新加了一层,但是这个新加的文件是第二层的一个升级版,此时系统会覆盖一下低级版本,所以还是六个文件。


5.png


我们pull了一个tomcat,本来的tomcat是只读的,我们启动之后它会在上面加一层,所有操作都在这里,叫容器层。然后再两个一起打包成一个大的镜像(也是新的)底层的东西不会变的,你的操作实际上就是在新加操作。


特点


容器在启动时会在镜像最外层上建立一层可读写的容器层(R/W),而镜像层是只读的(R/O),“容器层”之下的都叫“镜像层”。


如何提交自己的镜像


docker commit 提交容器成为新的副本
docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]


通过上篇文章下载的tomcat来示范


50.png


51.png


这样就完成了镜像上传,也算是docker的精华,整个环境打包,类似于快照,想保存就commit打包就可以了。

目录
相关文章
|
8天前
|
关系型数据库 TensorFlow 算法框架/工具
Docker技术概论(4):Docker CLI 基本用法解析
Docker技术概论(4):Docker CLI 基本用法解析
37 1
|
21小时前
|
缓存 Docker 容器
在Docker中,docker commit生成的镜像和dockerfile生成镜像有什么区别?
在Docker中,docker commit生成的镜像和dockerfile生成镜像有什么区别?
|
1天前
|
缓存 开发者 Docker
Dockerfile是Docker容器化过程中的核心组件,它允许开发者以一种可重复、可移植的方式自动化地构建Docker镜像
【8月更文挑战第19天】Dockerfile是构建Docker镜像的脚本文件,含一系列指令定义镜像构建步骤。每条大写指令后跟至少一个参数,按序执行,每执行一条指令即生成新的镜像层。常用指令包括:FROM指定基础镜像;RUN执行构建命令;EXPOSE开放端口;CMD指定容器启动行为等。优化策略涉及减少镜像层数、选择轻量基础镜像、利用缓存及清理冗余文件。示例:基于Python应用的Dockerfile包括设置工作目录、复制文件、安装依赖等步骤。掌握Dockerfile有助于高效自动化构建镜像,加速应用部署。
|
18小时前
|
缓存 运维 安全
在Docker中,构建镜像应该遵循哪些原则?
在Docker中,构建镜像应该遵循哪些原则?
|
18小时前
|
Docker 容器
在Docker中,如何批量清理临时镜像文件?
在Docker中,如何批量清理临时镜像文件?
|
18小时前
|
存储 Ubuntu 应用服务中间件
在Docker中,怎么快速查看本地的镜像和容器?
在Docker中,怎么快速查看本地的镜像和容器?
|
18小时前
|
JSON Shell 数据格式
在Docker中,如何查看镜像支持的环境变量?
在Docker中,如何查看镜像支持的环境变量?
|
18小时前
|
Shell Docker 容器
在Docker中,如何退出一个镜像的bash,而不终止它?
在Docker中,如何退出一个镜像的bash,而不终止它?
|
21小时前
|
安全 Ubuntu Linux
在Docker中,镜像内没有curl,kill,ipconfig等指令如何添加?
在Docker中,镜像内没有curl,kill,ipconfig等指令如何添加?
|
1天前
|
弹性计算 Java Maven
阿里云云效操作报错合集之在构建Docker镜像时提示拉取次数达到限制,该怎么解决
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。