容器技术基础(一)|学习笔记

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 快速学习容器技术基础(一)

开发者学堂课程【现代应用容器技术快速入门:容器技术基础(一)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/830

容器技术基础(一)

------马永亮


目录:

一、课程简介

二、容器技术基础

三、容器技术


一、课程简介

由阿里云、Linux开源软件学园和那个教育联合推出

CNCF×Alibaba云原生技术公开课”的前置课程

★CKAD/CKA/CKS认证配套课程

内容涵盖

手把手实践Kibernetes云原生操控系统

阿里云Kibernetes托管服务ACK

二、容器技术基础

 image.png

目前来说应用程序的部署环境大体上分为三种:主机、虚拟器、容器化的作用,无论是哪一种,主机上通常都是运营的某一系统,现在的计算机系统多数情况下都是为了运行多人物,甚至是支持多用户的,那么底层用户资源向多个进程进行有效分配,需要一个计算机系统来负责完成。

所以现代的计算机系统都有两个不同的的、分离的区域,成为用户空间和内核空间;

内核充当用户空间和硬件的中间层,负责进程调度、内存管理、中断处理等,对系统资源具有完全的控制权;

用户空间通过“系统调用”与内核通信,系统调用通过API向应用程序提供系统级服务。image.png

事实上,也可以通过专用的软件模拟或者虚拟技术,将这一个独立的主机硬件给他虚拟化。

 

虚拟化技术

通过专用软件模拟或/和虚拟技术,将多个主机硬件虚拟为独立、完整且隔离的不同单元,每个单元可以作为一个主机被使用,这个用于帮忙把底层的硬件所提供的各种资源计算资源给虚拟,或者模拟出多组互相隔离的这种软件,就称之为虚拟机监视程序或称之为虚拟化软件

这个专用软件称为VMM,即虚拟机监视程序;

根据VMM运行的位置不同,可以将虚拟化技术划分为两种类型:

 直接运行于硬件之上:类型1虚拟化技术

 运行于操作系统之上:类型2虚拟化技术

不管是哪一种虚拟化技术他们最终都将能够提供一个接口,这个接口允许用户去管理VM的生命周期。

每个虚拟机直接暴露硬件接口虚拟化技术

有独立的内核空间和用户空间

跨虚拟机的进程之间完全隔离

资源开销较大,半虚拟化技术有助于降低开销

由于两个虚拟机之间互相隔着内核儿,每一个虚拟机都有自己独立的内核儿,所以彼此之间并不会产生任何一人的干扰,如果我们不考虑较为底层的这个Hypervisor级别的资源分配的话最终应用程序的一每一个虚拟机之上的应用程序的运行最终还是要靠底层的硬件设备来支持,所以他们的请求无论如何,无论是被其所在虚拟机的内核儿如何处理的,最终还是要交由哈Hypervisor,甚至还要交由底层的host OS就是宿主机的操作系统。


image.png

什么虚拟化技术呢,可以理解为就是资源开销有点大,所以后来就出现了各式各样的准虚拟化,或者称为叫半虚拟化技术及para virtual的机制来实现,来减少这种性能开销来,增强系统的资源利用利用率,但是比较主流的虚拟化技术像vmware workstationvmwserver vmware、vsphere等等解决方案也包括开源的主流产品中的KVM内核虚拟化还有ten等一系列的虚拟化技术,他们分别支持各种各样的不同特性,由于诞生的时期不同,对于底层硬件的要求也各有不同,事实上在十年前开始流行起来了,Issa云的虚拟化技术(云计算技术)当中,基本上对应的都是以KVM或者ten或者是其他的虚拟化技术作为底层运行虚拟机的核心,而后额外额外提供了一套集群级别的操作系统来实现在集群及统一管理容器统一管理虚拟机的生命周期来实现的,因而迄今为止,这仍然是一种主流的虚拟化技术,但是考虑到这种主流化的虚拟化技术过于消耗资源,后来人们就开始探索一种轻量的虚拟化技术,到今天为止,落地的结果就是容器技术。

三、容器技术

1、概念:他是类似于虚拟化技术,只不过他的软件的主要目的不是将宿主机的硬件进行虚拟化,或者说不是相对应的应用程序提供硬件级的虚拟化接口,而是将宿主机的操作系统所提供的用户空间隔离为多个用户空间,使得每一个用户空间就好像自己是唯一运行在该内核之上的用户空间一样,进而完成了类似于前面我们所提到的这种虚拟化机制,只不过每一个独立而隔离的空间,它由于被底层的container runtime,或者被容器引擎所输出的不是主机级的接口,而仅仅是内核机接口,所以这里虚拟出来的这个级别是操作系统的虚拟接口,由此以来就减少了传统的主机级虚拟化两级内核,至少是类型2内核,但是最终还是由Hypervisor来进行调度完成的。

借助于称之为“容器运行时”的软件技术,在同一个内核之上生成多个彼此隔离的用户空间

 个和用户空间可独立管理运应其内部进程

 每个用户空间“自以为”独占该内核及硬件资源

需要将内核级的共享资源进行隔离

 依赖于内核中称为“名称空间”的技术进行

 名称空间是Linux内核特性,用于隔离部分系统资源,从而使得进程仅可访问同一名称空间中的相应资源

资源限制则依赖于由Google贡献的“CGroups

事实上名称空间仅仅能够创建和支持隔离的多个名称,多个用户空间就类似于模拟出来的多个用户空间,但是每一个用户空间中的进程则很有可能请求和消耗掉其内核管理之下的所有硬件资源,因此为了避免某一用户空间或者某一个usb中的所有进程耗大部分硬件资源,可以借助于CGroups将硬件资源或计算能力存储能力io能力等等,按特定的比例,或特定的量来向不同的用户空间进行分配

所以说现代的这个Linux的容器技术,就是要强依赖一个Linux内核的名称,空间和CGroup来实现的,事实上容器技术其实也就是Linux内核天然就已经支持和具备的技术。

2、Linux内核支持的名称空间

image.png

其实这的内核,支持大约八种名称,名称空间早期的版本或者是我们现在在很多系统上看到的,很多材料上看到的都是支持六个名称空间,但事实上较新版本的内核又增添了两种用户空间的支持也就是名称空间的支持

第一个叫Mount,他用来隔离挂载点和文件系统,事实上,这也是最早支持的叫做名称空间技术,以至于他自己就直接称呼自己就是名称空间,叫ns space的简写,很有可能这个时候的Linux内核的维护和开发者并没有意识到,后来很多其他资源资源也需要在名称、空间、级别实现隔离

后来到Linux内核发展到2.6.19以后,正式引入了另外两个名称空间,分别叫UPS和IPC,其中,UPS是用来提供独立的主机名和NS域名儿的。这就是有了这样一个UPS的支持以后,如果创建名称空间时,或者创建用户空间时调用了这个标志,用UPS和用IPC的话,这就意味着每一个用户空间可以看到不同的主机名。而且还和可以看到一个彼此之间在同一个用户空间的进程之间,可以通过思维的SysV IPC的metals互相通信,但跨每一种空间是被隔离的

接着内核发展到2.6.24的时候,PID也被引入了名也的名称空间也被引入内核,从而每一个用户空间

在2.6.29以后,网络名称空间引入内核,而这个时候,每一个用户空间可以自己直接使用一个独占的网络名称空间,进而能够使用看上去独占的网络设备、协议栈和端口分配等。

3.8引入了User ID和Group ID名称空间(user名称空间),从而能够实现User ID和Group ID的隔离。这就使得某一个容器当中看上去有一个Root用户,它能够在该名称空间当中具有所有的管理权限,但它输入机级别并没有,所以我们可以理解为你模拟出来用户空间的根用户就是Group和其他普通用户的这么一个名称,空间技术

Linux内核发展到了4.6版本以后,引入了Cgroup名称空间,它的主要作用在于为Cgroups实现资源分配的或者资源指派的一个技术。Cgroups也是采用了类似于文件系统一样的层级结构的Cgroup名称空间,就是为Cgroups的跟用户提供根目录的或者对相关层级结构的管理的。

接着Time这一名称空间是内核5.6版本才新进引入的,他能够实现为Boot time和Monotonic time提供隔离的空间。其monotonic  time是一个单调递增,其实它就是为操作系统计时的,我们可以理解为该用户空间创建以后,将一直持续的单调递增的方式进行计时,但是系统一旦进入休眠状态的话,这个时候他的相关技术是不计入的,可以理解为它专用于记录该系统正常运行,或者该用户空间正常运行了多长时间,Boot time类似于Monotonic time,但不同之处在于会计入系统休眠时间,也就意味着在休眠那一刻开始到休眠结束所中间经历的这些时间,它也会通过计算并加到这个对应的累加器,然后Linux内核所制的名称贡献,随着名称空间技术的越来越丰富,Linux本身对于容器技术的支持越来越完善。

3、名称空间和Chroot

1979年,Chroot系统调用被添加到Unix系统中,用于为开发人员提供一个独立于根文件系统的测试平台;

 借助于Chroot,开发人员可以更改进程及其子进程的根目录;

 如下图,文件系统被分为两个部分,他们相互之间并不影响

image.png

Linux引入了新的子系统和系统调用来改进进程隔离机制

 名称空间的概念最早出现在2002年的Kernel 2.4.19中,当时唯一支持的名称空间是Mount,该名称空间的Flag甚至就名为CLONE_NEWNS

4、隔离进程及标识的PID名称空间

PID名称空间能够支持多个完全独立的进程树;

 Linux系统在用户空间启动的PID号为1的进程,作为进程树的“根”;

 PID名称空间允许用户创建具有1号PID的单独分支

 新树中的进程永远不会同父进程交互,也不会看到他

 父进程可以访问所有的子进程树

带走CLONE_NEWPID标志的clone系统调用可用于创建新的命名空间PID


相关文章
|
1月前
|
Java Go 开发者
Docker容器技术简介及其与Go语言的结合点
【2月更文挑战第23天】本文首先概述了Docker容器技术的核心概念和优势,接着探讨了Go语言与Docker容器技术的结合点。通过阐述Docker的轻量级、可移植性和版本控制等特性,以及Go语言在容器化应用中的优势,本文旨在说明两者结合能够实现更高效、灵活的应用开发和部署。
|
1月前
|
Kubernetes 开发者 Docker
基于容器技术的微服务架构
基于容器技术的微服务架构
33 0
|
1天前
|
运维 Kubernetes Docker
这是一项颠覆性技术 - 容器
这是一项颠覆性技术 - 容器
|
11天前
|
运维 Kubernetes Devops
构建高效自动化运维体系:DevOps与容器技术融合实践
【4月更文挑战第15天】 在当今快速发展的信息技术时代,传统的IT运维模式已难以满足业务敏捷性的需求。本文旨在探讨如何通过整合DevOps理念和容器技术来构建一个高效的自动化运维体系。文章将详细阐述DevOps的核心原则、容器技术的基础知识,以及两者结合的优势。此外,文中还将分享一系列实践经验,包括持续集成/持续部署(CI/CD)流程的搭建、微服务架构的应用,以及监控和日志管理策略的优化,以期帮助企业实现快速、可靠且安全的软件交付过程。
|
27天前
|
Kubernetes API 调度
总结归纳Kubernetes | 一站式速查知识,助您轻松驾驭容器编排技术(水平扩展控制)
总结归纳Kubernetes | 一站式速查知识,助您轻松驾驭容器编排技术(水平扩展控制)
60 0
|
1月前
|
运维 监控 Devops
构建高效自动化运维体系:基于容器技术的持续集成与持续部署实践
在数字化转型的浪潮中,企业的IT基础设施和软件交付模式正经历着深刻的变革。传统的运维方式已难以满足快速迭代、灵活扩展的现代业务需求。本文将探讨如何通过容器技术实现高效的自动化运维体系,重点分析持续集成(CI)与持续部署(CD)的实践方法及其对企业运维效率的影响。通过引入微服务架构、容器编排、DevOps文化等概念,我们旨在为读者提供一套全面的自动化运维解决方案,以支持业务的敏捷性和可扩展性。
|
1月前
|
边缘计算 Kubernetes 负载均衡
容器编排技术在云计算中的应用
随着云计算技术的飞速发展,容器编排技术作为一种重要的部署和管理工具,正在逐渐成为云计算领域的热门话题。本文将介绍容器编排技术在云计算中的应用,探讨其在提高应用程序部署效率、资源利用率以及系统可靠性方面的优势,并分析其未来发展趋势。
|
1月前
|
Kubernetes 云计算 开发者
云计算中的容器化技术:Docker与Kubernetes的实践
云计算中的容器化技术:Docker与Kubernetes的实践
108 0
|
1月前
|
运维 API Docker
深入浅出:微服务架构与容器化技术的完美融合
【2月更文挑战第13天】 在现代软件开发领域,微服务架构和容器化技术已成为推动企业快速发展的两大核心力量。本文将从微服务的基本概念出发,深入探讨其与容器化技术结合的必然性与优势,进而分析如何在实践中有效地实现二者的完美融合。通过对微服务架构的细致解析及容器化技术的应用展示,旨在为读者提供一种全新的视角,理解并掌握这一前沿技术趋势,以指导实际工作中的技术选择与架构设计。
|
2月前
|
运维 Java Linux
深入解析:使用Docker容器化技术提升Java应用的部署效率
在快速迭代的软件开发周期中,如何保证应用的快速、一致和可靠部署成为了开发团队需要面对的重大挑战。本文将探讨如何利用Docker容器化技术,结合Java应用,实现高效、一致的部署流程。我们将从Docker的基本概念出发,详细介绍将Java应用容器化的步骤,包括创建Dockerfile、构建镜像以及运行容器等关键环节,并通过示例代码加以说明。此外,本文还将讨论在使用Docker部署Java应用时可能遇到的常见问题及其解决策略,旨在为读者提供一种提升部署效率、优化开发流程的有效方法。
303 2