Docker镜像原理

@TOC

1.Docker镜像是什么?

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

1.1联合文件系统(UnionFS)

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

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

1.2Dcoker镜像加载原理

docker的镜像实际上由一层一层的文件系统【文件系统UnionFS】组成的。
【bootis】==主要包含bootloader和kernel,bootioader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统==,在Docker镜像的最底层是bootfs。这一层与我们典型的LinuxUnix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

【rootfs】在bootfs之上。包含的就是典型Linux系统中的l/dev, /proc, /bin, letc等标准目录和文件。roots就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
rootfs-bootfs
对于一个精简的OS,rootis可以很小,==只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就行了==。由此可见对于不同的linux发行版, bootfs基本是一致的,rootfs会有差剔,因此不同的发行版可以==共用bootfs==

1.3分层镜像

由一下这张图可以看出镜像的分层结构
分层
为什么Docker中的tomcat镜像有600M大?(见下图结构)
tomcat镜像底层

1.4为什么Docker镜像要采用这种分层结构

==优点:==
资源的有效利用和资源的利用率高,因为docker中的很多镜像都是从相同的base镜像构建而来的,则宿主机只需要保存一份base镜像,同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且每一层都是可以被共享的。
越到上层,文件越大,因为要依赖的文件越多

2.Docker镜像的特点

Docker镜像是只读的,当容器启动时,一个新的【可写层】被加载到镜像的顶部。这一层通常被称作是【容器层】,“容器层”之下的都叫做【镜像层】。

3.Docker镜像commit操作补充

镜像前台运行
docker run -it -p 8888:8080 tomcat 【-p指定端口映射】
虚拟机运行tomcat
虚拟机访问localhost:8888
docker run -it -P tomcat【-P随机分配端口】
==注意==
区分前面的-p,这里为大写的-P
随机分配端口
在这里插入图片描述
随机分配端口
镜像后台运行
docker run -d -p 7777:8080 tomcat:8.5.32
后台运行

3.1 docker commit提交容器副本使之成为一个新的镜像

解释: 用户提交对原始容器的修改,并生成新的镜像
用法: docker commit -m=”提交的描述信息” -a=”作者” 容器ID 要创建的目标镜像名:[标签名(即版本信息)]
==目的:通过提交新的副本可以生成我们所需要的应用,比如说以往比较大的应用但是里面有好多东西我们都用不到因此我们可以修改源文件对不需要以及不常用的内容删除将应用进行“瘦身”,之后重新发布此应用就变成了我们需要的“浓缩的”应用,这样可以减小存储的负载,加大对存储空间的利用率==
docker commit
参数解释

参数 意义
-a 提交的镜像作者
-c 使用Dockerfile指令来创建镜像
-m 提交时的说明文字
-p 提交期间暂停容器

Author: Lelege
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Lelege !
评论
 Previous
SpringBoot整合Swagger SpringBoot整合Swagger
@TOC 引言在前后端开发过程中,为了减少前后端程序员以及与其他团队之间的沟通成本,因此要定义一组公共的API接口文档来描述所有接口方法的信息。但是这种方式在某一方面也存在很大的弊端,如下: 如果开发人员所描写的接口数量众多,一方面编写A
2022-05-26
Next 
Docker基础(容器命令) Docker基础(容器命令)
@TOC 六、容器命令6.1新建并启动容器(启动交互式容器) docker run [OPTIONS] image [COMMAND][ARG...] //新建并启动容器 ORTIONS说明(常用):有的是一个减号有的是两个减
2022-05-26
  TOC