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

简介: 相信大家经过前面的练习都掌握了基本的指令,在实战操作之后我们就要进行镜像的详解来帮助大家对于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打包就可以了。

目录
相关文章
|
1月前
|
前端开发 关系型数据库 MySQL
IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】
IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】
|
1月前
|
消息中间件 Cloud Native Java
【Spring云原生系列】SpringBoot+Spring Cloud Stream:消息驱动架构(MDA)解析,实现异步处理与解耦合
【Spring云原生系列】SpringBoot+Spring Cloud Stream:消息驱动架构(MDA)解析,实现异步处理与解耦合
|
10天前
|
应用服务中间件 Docker 容器
docker 镜像常用命令
docker 镜像常用命令
30 0
|
10天前
|
Linux Shell 虚拟化
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
14 0
|
17天前
|
存储 Kubernetes API
Docker拉取镜像或者kubectl出现的这个解决方案x509: certificate signed by unknown authority
Docker拉取镜像或者kubectl出现的这个解决方案x509: certificate signed by unknown authority
48 2
|
18天前
|
Linux Docker 容器
Linux彻底卸载Docker包括运行拉取的镜像
Linux彻底卸载Docker包括运行拉取的镜像
22 1
|
22天前
|
NoSQL 关系型数据库 MySQL
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
99 1
|
23天前
|
Docker 容器
docker删除镜像
docker删除镜像
51 0
|
1月前
|
网络安全 Docker 容器
docker 拷贝本地镜像
【2月更文挑战第27天】
|
1月前
|
SQL 关系型数据库 数据库
docker如何进入镜像其他的SQL
【2月更文挑战第25天】

热门文章

最新文章