容器技术基本概念理解

网友投稿 646 2022-05-29

一种沙盒技术,

可以将应用运行在其中,与外界隔离

这个沙盒可以被方便地“转移”。

本质上,他就是一种特殊的进程。通过在创建容器进程的时候,指定了这个进程所需要启用的一组Namespace参数,进而让该容器进程只能看到当前Namespace所限定的资源、文件、设备、状态或者配置。--进程划分独立空间思想

一组联合挂载在/var/lib/docker/aufs/mnt上的rootfs,这部分被称为“容器镜像”(Container Image),是容器的静态视图

一个由Namespace + Cgroups构成的隔离环境,这部分被称为“容器运行时”,是容器的动态视图

docker framwork.PNG

在为待创建的用户进程

容器技术基本概念理解

启动Linux Namespace配置

设置指定的Cgroups参数

切换进程的根目录(change root, 配合namespace mount)

切换进程的根目录的时,Docker项目会在最后一步优先使用pivot_root的系统调用,如果系统不支持,才会使用chroot。

虚拟机在物理宿主机上存在一层Hypervisor的硬件虚拟化层,通过Hypervisor虚拟化出了CPU, 内存,I/O设备等,然后在这些虚拟设备上装了一个新的操作系统,即GuestOS,通过不同的操作系统,来实现同一个物理宿主机上的环境隔离。

因此,不能Docker engine放在和Hypervisor同样的地位,Docker Engine或任何容器管理工具都不对容器中的应用进程的隔离环境负责,而是由物理宿主机的操作系统本身直接负责的。Hypervisor是会虚拟出硬件设备,在这上面通过不同的GuestOS实现隔离的。而Docker Engine在这里扮演的角色,更多是的旁路式的辅助和管理工作。

基于虚拟化和独立内核技术的容器

容器和VM的对比

#TODO

容器编排.PNG

#TODO

狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。

广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

对进程来说,静态表现就是程序,未运行时存储在磁盘上;运行起来后,变成了计算机中数据和状态的总和,也是其动态表现。

容器技术的核心功能,是通过约束和修改进程的动态表现,从而为其制造出一个容器的边界。

虽然Docker容器可以通过Namespace改变进程视图可见性,但是本质上容器这个进程及其内部的应用进程,都是统一归宿主机的操作系统管理,这就意味着,这个容器内部的进程和容器外部的宿主机的进程时处于平等竞争关系的。那么问题来了,这些资源占用怎么去隔离?---Cgroups

限制一个进程族能够使用的资源上限,包括CPU,内存,磁盘,网络带宽等。此外还能够对进程进行优先级设置、审计、以及将进程挂起和恢复等操作。

详见《Linux Cgroups》

容器中执行top指令,显示的信息是宿主机的CPU和内存数据,不是当前容器的数据。因为/proc下的存储的信息是作为top指令的主要数据来源,而/proc文件系统是感知不Cgroups限制的存在

修改进程视图的主要方法。说白了,容器正是通过在起容器进程的时候,增加namespace的配置参数,使得在该容器内部可见的进程与容器外部(物理机OS)上看到的进程“隔离”开来。但是,在物理宿主机看来这些被“隔离”的进程与其他进程并没有太大区别。

namespace problem.PNG

RPC.jpg

简单理解:rpc调用能够通过类似本地调用的方式实现在分布式架构中Service A调用起Service B的方法。

在上图中,以左边的Client端为例,Application就是rpc的调用方,Client Stub就是代理对象,也就是那个看起来像是Calculator(这个类是实际实现在右侧Application中的)的实现类,其实内部是通过rpc方式来进行远程调用的代理对象,至于Client Run-time Library,则是实现远程调用的工具包,比如jdk的Socket,最后通过底层网络实现实现数据的传输。

这个过程中最重要的就是序列化和反序列化了,因为数据传输的数据包必须是二进制的,你直接丢一个Java对象过去,人家可不认识,你必须把Java对象序列化为二进制格式,传给Server端,Server端接收到之后,再反序列化为Java对象。

可以简单这么理解

如果容器镜像os支持某硬件的驱动,但是宿主机os如果不支持该硬件驱动的话,也白搭

可以理解为镜像只是提供了一套镜像文件系统中的各种文件,而各种内核相关的模块或者特性支持,完全依赖于宿主机

也正是通过容器镜像,打包了整个操作系统的文件和目录(虽然没打包内核),也就意味着,应用以及他所运行所需要的全部依赖都被封装在了一起,而对于一个应用来说,操作系统本身才是他运行所需要的完整的依赖库。也正是因为这样,才有了容器的一个重要特性:一致性。

一致性

优雅地解决云端和本地服务环境不同造成在应用打包过程中使用PaaS最“痛苦”的步骤。

为什么说容器通过mount namespace挂载不同版本的操作系统文件,但是不同的Docker还是使用的操作系统内核。(通俗理解就是不能通过容器技术在Windows宿主机上运行Linux容器,或者在低版本的Linux宿主机上运行高版本的Linux容器)

是为了解决在通过rootfs机制(打包了操作系统所包含的文件、配置和目录)和mount 那么space建立起了一个同宿主机完全隔离的文件环境系统同时引入的两个问题:

宿主机上的文件系统,怎么让容器的进程访问到

总而言之,是在隔离开宿主机和容器的文件系统之后,怎么进行文件共享操作。

允许用户将宿主机上指定的目录或者文件,挂载到容器里面进行读取和修改操作。

注意mount namespace在根目录下挂载rootfs和Volume机制挂载的区别

rootfs挂载到根目录是docker仓库中打包的操作系统的文件系统

Volume机制是把物理机上的卷挂载到通过rootfs和mount namespace隔离开的容器卷上以达到容器和宿主机的文件共享目的

// mount /home on host to /test in container filesystem  $ docker run -v /home:/test

云计算

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Xftp和Xshelll的安装—远程连接linux
下一篇:虚拟化的本质
相关文章