目录
一,虚拟化简介
1,虚拟化概述
2,耦合和解耦合
3,虚拟化的作用
4,虚拟化工作原理
4.1 QEMU
4.2 KVM
4.3 虚拟化类型
4.4 虚拟化功能
二。Docker概述
1,IT架构演变
2,Docker 是什么
3,Docker的设计宗旨
4,Docker特点
5,Docker与KVM(虚拟机)的区别
5.1 隔离与共享
5.2 性能与损耗
5.3 docker在内核中支持2种重要技术
6,Docker有哪些优势?和虚拟化比有什么优势?
三,Docker的使用场景
三,Docker的引擎(Docker architeture)
四,docker的架构
1,简述docker体系架构
2,docker三要素(核心组件)
3,docker运行流程
4,linux的namespace(命名空间)
5,控制组-cgroups(control groups)
五,总结
引言
以linux而言,linux操作系统会有一个主进程pid=1派生出其他进程来控制不同服务
例如:
三个服务可能会互相影响
使用者期望将这三个不同的服务,跑在不同的运行环境中实现相互不影响,同时不会增加服务器成本
衍生出容器技术
虚拟化层的抽象层(用户层)剥离,使用docker engine来替代(来bin操作系统去除),只要通过引擎就可以直接连接到宿主机操作系统中,极大减小了开销。
通过虚拟化技术将一台计算机虚拟成多台逻辑计算机,在一台计算机上同时运行多个逻辑计算机,同时每个逻辑计算机可运行不同的操作系统,应用程序都可以在相互独立的空间内运行而互不影响,从而提高了计算机的工作效率。
虚拟化:将应用程序和系统内核资源进行解耦,以操作系统级别进行隔离,目的是提高资源利用率
耦合性是程序结构中各个模块之间互相关联的度量。它取决于各个模块之间的接口的复杂程度,调用模块的方式以及哪些信息通过接口。
2.1 耦合
2.2 解耦合
1,字面以上就是解除耦合关系
2,在软件工程中,降低耦合度即可以理解为解耦,模块键有依赖关系必然存在耦合理论上的绝对零耦合是做不到的,但可以通过一些现有的方法将耦合度降至最低。
设计的核心思想:尽可能的减少代码耦合,如果发现代码耦合,就才去解耦技术,让数据模型,业务逻辑和视图显示三层之间彼此降低耦合,把关联依赖降至最低,而不至于牵一发而动全身,原则就是A功能的代码不要写在B的功能代码中,如果两者之间需要交互,可以通过接口,通过消息,甚至可以引入框架,但总之就是不要直接交叉写
缓解/解决了资源利用率的问题
**注:**物理硬件的性能就会比虚拟化的性能高,在极度吃资源的情况下,例如mysql高并发这种,就不适合用虚拟化。
虚拟机管理器功能:调用资源
两大核心组件:QEMU,KVM
1,用来逻辑分割物理资源,抽象化为虚拟化资源,根据KVM里的配置,会逻辑分割出多少G,给应用程序,去进行虚拟化。
2,只介绍来着QEMU的请求指令,对于应用程序直接过来的敏感指令进行拦截,然后通过接口发给QEMU,让QEMU判断是否需要执行,可以的话,再下来,不可以的话,不执行该敏感指令。
对于workstation而言,——硬件辅助虚拟化,表达形式在处理器里面有一个虚拟化引擎,可以勾取硬件辅助虚拟化,看到虚拟接口/dev/kvm,可以加强辅助调用,在应用程序需要频繁调用的时候,需要开启,比如openstack.
1,全虚拟化:将物理硬件资源全部通过软件的方式进行抽象化,最后进行调用
2,半虚拟化:需要修改操作系统
3,直通:直接使用物理硬件资源
全虚拟化:kvm——产品vmware-ce
把虚拟号:EXSI——workststion vsphere
云计算涌现出很多改变传统IT架构和运维方向的新技术,比如虚拟机,容器,微服务,serverless,无论这些技术应用在那些场景,降低成本,提供效率是云服务永恒的主题。
1,Bare Metal(裸金属):运行物理机,也称为裸金属,
2,Virual machines(虚拟机):可以在一台物理机上创建多个虚拟机,并把物理配置分发成为多个虚拟配置
缺点:性能损耗大,大约损耗50
虚拟机常用软件:VMware workstation(windows,vm sphere+ESXI(Windows server)),KVM(linux内核))
3,Containers(容器):容器内部自身有一个小型1操作系统
常用软件:docker,podman,rocket,container
4,functions函数(函数化,代码化)
Docker 的Logo设计为蓝色鲸鱼,拖着许多集装箱,鲸鱼可以看作为宿主机,集装箱可以理解为相互隔离的容器,每个集装箱都包含自己的应用程序。
Build,Ship and Run Any App,Anywhere,即通过对应用组件的封装,发布,部署,运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
容器化越来越受欢迎,因为容器是:
容器是在linux上本机运行,并与其他容器共享主机的内核,他运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常全量。
虚拟机运行的是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。
Docker从一开始就以提供标准化的运行时环境为目标,真正做到"Build,Ship and Run any APP,Angwhere",可以将同一个构建版本用于开发,测试,预发布,生产等任何环境,并且做到了与底层操作系统的解耦。在此基础上进一步发展出了Caas(容器即服务)技术。
虚拟机通过添加Hypervisor层(虚拟化中间层),虚拟出网卡,内存,cpu等虚拟硬件,再在其上建立虚拟机,每个虚拟机都有自己的系统内核。而Docker容器则是通隔离(那么namesapce)的方式,将文件系统,进程,设备,网络等资源进行隔离,再对权限,CPU资源等进行控制(cgroup),最终让容器之间互不影响,容器无法影响宿主机。
容器与宿主机共享内核,文件系统,,硬件等资源。
与虚拟机相比,容器资源损耗要少。
同样的宿主机下,能够建立容器的数量要比虚拟机多
但是,虚拟机的安全性要比容器稍好,要从虚拟机攻破到宿主机或其他虚拟机,需要先攻破Hypervisor层,这是及其困难的
而Dorker容器与宿主机共享内核,文件系统等资源,更有可能对其他容器,宿主机产生影响。
不同点 | Docker容器 | 虚拟机 |
启动速度 | 快,几秒钟 | 慢,几分钟 |
运行性能 | 接近原生(直接在内核中运行) | 运行于Hypervisor上,50%左右损失 |
磁盘占用 | 小,甚至几十KB(根据镜像层的情况) | 非常大,上GB |
并发性 | 一台宿主机可以启动成百上千个容器 | 最多几十个虚拟机 |
隔离性 | 进程级别 | 资源隔离/限制 |
操作系统 | 主要支持Linux | 主要支持Linux |
封装程度 | 只打包项目代码和依赖关系,共享宿主机内核 | 完整的操作系统,与宿主机隔离 |
docker 本质就是宿主机的一个进程,docker 通过namespace 实现资源隔离,通过==cgroups==实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似于虚拟机的磁盘。比如分配500G,并不是实际占用物理磁盘500g,二是随着使用扩展)
把容器化技术做成了标准化平台
镜像——》封装的一个时刻的服务/应用状态
容器——》应用跑起来的状态(正常提供服务的状态-运行时)
实现了一次构建,多次,多次使用。
1,打包应用程序部署简单
2,可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦)
例如:需要把服务器从腾讯云迁移到阿里云,如果采用的是Docker容器技术,整体迁移的过程只需要在新的服务器上启动我们需要的容器就可以了。
3,适合做微服务的部署
4,适合持续集成的持续交付(CI/CD):开发到测试发布
5,部署微服务
提供PASS产品(平台即服务)
Docker engine是具有以下主要组件的客户端-服务器(C/S架构)应用程序
1,slave段:服务端是一种长期运行的程序,称为守护程序进程(docker命令)
2,client段:REST API,他指定程序可以用来与守护进程进行通信并指示其操作的接口。
3,命令行界面(cli)客户端(docker命令)。
docker run
docker start
docker rm
docker客户端-docker
docker客户端则扮演着docker服务端的运程控制器,可以用来控制docker的服务端进程。
docker服务端-docker daemon资源限制
docker服务端是一个服务进程,管理着所以的容器
docker镜像-lmagefont
docker的镜像是创建容器的基础,类似于虚拟机的快照,可以理解为一个面向docker容器引擎的只读
docker容器-docker container
docker的容器是从镜像创建的运行实例,他可以被启动,停止和删除,所创建的每一容器都是相互隔离,互不可见,以保证平台的安全性。
docker镜像仓库-registryfont
docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将他上传到公有仓库或者私有仓库,,当下次要在另外一台机器上使用这个镜像时,只需要仓库获取。
docker的镜像,容器,日志等内容全部都默认存储在/var/lib/docker目录下啊。
Docker images:镜像:统一的封装方式——模板
Docker container:容器:统一的运行时环境——基于镜像,运行状态/运行时的状态
Docker registry:镜像文件:放置镜像的仓库——存放镜像模板
存储镜像的地方,默认在公共的docker hub上查找,可以搞个人仓库。
仓库大类:公共仓库-docker hub 私有仓库registry harbor
工作流程:
namespace | 系统调用参数 | 隔离内容 |
utc | CLONE_NEWUTS | 主机名和主机域 (同一个环境里不能又叫node1又叫node2) |
ipc | CLONE_NEWWIPS | 信号量、消息队列、共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间) |
pid | CLONE_NEWPID | 进程编号 |
network | CLONE_NEWNET | 网络设备、网络协议栈(在同一个网络名称空间中的网络规则)、端口等 |
mount | CLONE_NEWNS | 文件系统,挂载点——>一个文件系统内,不能重复挂载一个指定目录 |
user | CLONE_NEWUSER | 用户和用户组(3.8以后的内核才支持) |
六种名称空间是由cgroups管理的
最后一种是centos的cgroups管理版本的是3,8版本,3.6和3.5用不了
使用docker实现了3个统一
实现了一次构建,多次,多处使用