瀹瑰櫒闀滃儚鍒嗗眰瀛樺偍(瀹瑰櫒瀹炵幇鍘熺悊)

lxf2023-03-17 13:25:58
摘要

本文主要介绍Docker容器的加载分层原理和提交镜像,可供有需要的朋友参考,希望有所帮助。祝你进步很大,早日升职加薪。

目录
  • Docker容器的加载原则、分层原则和提交镜像。
  • 第一,什么是镜像?
  • 二、docker图像加载原理
  • 1.联合文件系统。空军上士
  • 2.镜像加载的原理
  • 第三,分层原则
  • 第四,提交镜像
  • Docker容器的加载原则、分层原则和提交镜像。

    第一,什么是镜像?

  • 镜像是一个轻量级的、可执行的、独立的软件包,用于封装软件运行环境和基于运行时环境开发的软件。
  • 它包含运行软件所需的一切,包括代码、运行时环境、库、环境变量和配置文件。
  • 所有直接打包到docker映像中的应用程序都可以直接运行。
  • 如何获得镜像:

  • 从远程仓库下载
  • 从其他地方复制
  • 自己做一个镜像docker文件。
  • 二、docker图像加载原理

    1.联合文件系统。空军上士

    Unio & # 110FS是一个分层的、轻量级的、高性能的文件系统。支持将文件系统的修改作为一次提交的层层叠加,同时将不同的目录挂载到同一个虚拟文件系统。这可以在我们下载图像时看到。

    瀹瑰櫒闀滃儚鍒嗗眰瀛樺偍(瀹瑰櫒瀹炵幇鍘熺悊)

    比如涉及到相同的文件,可以共享,大大节省了资源。

    Unio & # 110FS是docker镜像的基础,可以通过分层继承。基于基本映像(无父映像),可以制作各种具体的应用映像

    特点:同时加载多个文件系统,但是从外面看,只能看到一个文件系统。联合加载将堆叠所有级别的文件系统,因此最终的文件系统将包含所有底层文件和目录。

    2.镜像加载的原理

    docker的镜像其实是由一个一层一层的文件系统组成的,就是上面提到的Unio & # 110FS .然后,在内部,它分为两部分:

  • Bootfs(引导文件系统):Docker镜像的底层是Boot FS,主要包括bootloader和内核。Bootloader主要加载内核,linux启动时会加载bootfs文件系统。这一层和典型的linux/Unix系统一样,包括引导装载程序和内核。
    加载引导时,整个内核都在内存中。此时内存的使用权已经从bootfs转移到内核,系统也会卸载bootfs。
    这里的加载可以理解为我们的windows电脑开机时,从黑屏到进入操作系统的过程。
  • Rootfs(根文件系统):在bootfs之上,它包含标准目录和文件,如典型linux系统中的/dev、/proc、/bin、/等。
  • Rootfs是各种操作系统发行版,比如ubuntu,Centos等等。

    如图所示:

    瀹瑰櫒闀滃儚鍒嗗眰瀛樺偍(瀹瑰櫒瀹炵幇鍘熺悊)

    以debian系统为例,图中从左到右分为三个进程:

  • 图1,初始状态,下载了一个debian系统。
  • 图2,安装了eMacs。这时,你可以看到在图1的基础上增加了一层图像。
  • 图3,安装了另一个Apache。此时,在图2的基础上增加一个图像层。
  • 说明docker的映像实际上是由文件系统一层一层组成的。对于不同的linux发行版,bootfs基本相同,rootfs会有所不同,所以不同的发行版可以共享bootfs。

    此外,docker上的操作系统通常是简化版。安装在VM上的centos映像的大小超过1 g,而docker上的centos映像的大小只有200M。

    因为底层直接使用主机的内核,只需要提供rootfs,所以rootfs可以很小,只需要包含最基本的命令、工具和库。

    这样启动速度也快,因为最耗时的引导加载过程也没有了。

    第三,分层原则

    知道了图像加载的原理,我们不妨回头看看图像分层的原理。如前所述,下载图片时,是分层下载的。如果某些图层已经存在,则无需再次下载。

    比如我下载了Redis的镜像。

    瀹瑰櫒闀滃儚鍒嗗眰瀛樺偍(瀹瑰櫒瀹炵幇鍘熺悊)

    这种方式最大的优势在于资源共享。例如,如果从同一个基本映像构建多个映像,那么主机只需要在磁盘上保留一个基本映像,并且只需要在内存中加载一个基本映像,这样就可以使用所有容器。此外,图像的每一层都可以共享。

    您可以通过docker image inspect查看映像的分层,例如查看刚刚下载的redis映像:

    docker image inspect redis:latest

    瀹瑰櫒闀滃儚鍒嗗眰瀛樺偍(瀹瑰櫒瀹炵幇鍘熺悊)

    所有docker图像都从基本图像层开始。当修改或添加新内容时,将在当前图像层之上创建一个新的图像层。

    例如:

    瀹瑰櫒闀滃儚鍒嗗眰瀛樺偍(瀹瑰櫒瀹炵幇鍘熺悊)

    我现在想做一个镜像。

  • 此映像基于Ubuntu linux 16.04,这是映像的第一层。
  • 如果您继续安装python包,您将在第一层之上创建第二个镜像层。
  • 如果继续修补,将会创建第三个镜像层。
  • 应该指出的是:

    添加额外的镜像层时,镜像始终是所有当前镜像的组合,如下图所示:

    瀹瑰櫒闀滃儚鍒嗗眰瀛樺偍(瀹瑰櫒瀹炵幇鍘熺悊)

    这里,每个镜像层包含三个文件,镜像包含来自两个镜像层的六个文件。

    现在,如果第二层的文件5需要升级。此时,上层图像中的文件将覆盖下层图像中的相应文件,以便文件中的更新版本可以作为新的图像层添加到图像中。

    瀹瑰櫒闀滃儚鍒嗗眰瀛樺偍(瀹瑰櫒瀹炵幇鍘熺悊)

    Docker通过存储引擎的方式实现镜像层堆栈,并确保多个镜像层作为一个统一的文件系统公开。

    瀹瑰櫒闀滃儚鍒嗗眰瀛樺偍(瀹瑰櫒瀹炵幇鍘熺悊)

    第四,提交镜像

    通过以上的了解,我们现在知道了镜像的结构原理,所以我们可以自己制作一个镜像。

    例如,现在拉一个Tomcat图像作为基本层。在我开始这个图像之后,我在容器中做了一些改变。我觉得我的改变很好,形象变得更有用了。然后我需要保存这个容器的状态,并通过commit命令提交图像。

    docker commit -m="提交描述信息" -a="作者" 容器id 目标镜像名称:版本标签

    运行tomcat后进入WEBapps,发现没有项目,因为被阉割了。

    瀹瑰櫒闀滃儚鍒嗗眰瀛樺偍(瀹瑰櫒瀹炵幇鍘熺悊)

    现在我把webapps.dist下的东西都复制到webapps。

    瀹瑰櫒闀滃儚鍒嗗眰瀛樺偍(瀹瑰櫒瀹炵幇鍘熺悊)

    现在我可以访问ip:8080的项目。

    瀹瑰櫒闀滃儚鍒嗗眰瀛樺偍(瀹瑰櫒瀹炵幇鍘熺悊)

    现在我提交这个修改过的容器。

    docker commit -m="pingguo first commit image" -a="pingguo" 03844ff66434 tomcatpingguo:1.0

    提交成功后,docker images查看图片,发现已经保存在本地。

    瀹瑰櫒闀滃儚鍒嗗眰瀛樺偍(瀹瑰櫒瀹炵幇鍘熺悊)

    通过自己提交镜像操作,再回来体验镜像的层次感,是不是更深刻?

    以上是Docker容器的加载分层原理和提交镜像的细节。关于Docker加载分层提交镜像的更多信息,请关注编程网其他相关文章!