文章目录
虚拟化+docker概念基本介绍
在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互相不影响,从而显著提高计算机的工作效率
虚拟化
虚拟化概述
- 虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互相不影响,从而显著提高计算机的工作效率
- 虚拟化使用软件的方法重新定义划分 IT 资源,可以实现 IT 资源的动态分配、灵活调度、跨域共享,提高 IT 资源利用率,使 IT 资源能够真正成为社会基础设施,服务于各行各业中灵活多变的应用需求
cpu的时间分片(cpu虚拟化)
- 正常每个任务以轮询的方式去处理,这个时候一个CPU一个整体
- 以下是针对的CPU单位时间内的一个资源。按时间划分,1秒划分成10个0.1秒,每个0.1秒可以全力处理10单位的任务。在1秒内,都在全力工作
- cpu 1s全力运转的性能——》逻辑分割成分成了10份,可以理解为在单位时间内可以处理10个任务,每一个0.1s cpu是满的。原先分片前100M以下的任务一次只可以处理1个,现在100M的任务一次可以处理10个。这就是时间分片的一个概念
- 虚拟化作用——》缓解/解决了资源利用率的问题
cpu虚拟化性能瓶颈
cpu分片后每个任务处理性能会打对折
- 如果是50m及50m以下的任务的话,虚拟化后的,1s模拟10个cpu,可以处理10个。虚拟化后的性能更高
- 如果是50+m的任务的话,物理硬件的性能就会比虚拟化的性能高了。虚拟化的cpu会卡顿。所以在极度吃资源的情况下,例如mysql高并发这种,就不适合用虚拟化
虚拟化工作原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0uHkz1Kn-1665566749142)(F:\typorase\jpg\812.png)]
虚拟机管理器功能:调用资源
两大核心组件:QEMU、KVM
QEMU:
- 可以理解为队列,核心目的是调用资源内核中的资源,需要把KVM逻辑分割出来的资源运输给QEMU,再给虚拟机
- QEMU它并不是直接调用,而是用I/O方式调用,QEMU把资源调用来的过程借用ioctl,QEMU借助libvirt这个工具调用ioctl,再通过接口,给虚拟机应用程序
KVM:
- 用来逻辑分割物理资源,抽象化为虚拟化资源,根据VMM里的配置,会逻辑分割出多少G,给应用程序,去进行虚拟化
- 只接受来自QEMU的请求指令。对于应用程序直接过来的敏感指令会拦截,然后通过接口发给QEMU,让QEMU判断是否需要执行,可以的话,再下来,不可以的话,打回去,不执行该敏感指令
对于workstation而言——》硬件辅助虚拟化,表现形式在处理器里面有一个虚拟化引擎,可以勾取硬件辅助虚拟化,看到虚拟接口/dev/kvm,可以加强辅助调用,在应用程序需要频繁调用的时候,需要开启。比如openstack
虚拟化类型
**全虚拟化:**将物理硬件资源全部通过软件的方式抽象化,最后进行调用
**半虚拟化:**需要修改操作系统
**直通:**直接使用物理硬件资源(需要支持,还不完善)
全虚拟化: KVM——》产品vmware—ce
半虚拟化: EXSI——》workststion vsphere
虚拟化功能
- 在一个操作系统内,模拟多个操作系统
- 以软件的方式模拟物理设备的功能
docker容器
docker是什么?
- 是一种轻量级的“虚拟机”,Docker是一个用于开发,交付和运行应用程序的开放平台
- 在Linux容器里运行应用的开源工具——》容器引擎,让开发者可以打包大门的应用及依赖包到一个可移植的镜像中,然后发布到任何流行的linux或者window机器中
- Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序
- Docker的设计宗旨:Build,Ship and Run Any App,Anywhere。即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统
使用docker有什么意义
把容器化技术做成了标准化平台
- docker引擎统一了基础设施环境——docker环境
- docker引擎统一了程序打包(装箱)方式——docker镜像(把引擎放在镜像中,带着镜像到处跑)
- docker引擎统一了程序部署(运行)方式——docker容器(利用引擎把这个镜像再去运行为之前的相同的一模一样的容器了)
镜像——>>封装的一个时刻的服务/应用状态
容器——>>应用跑起来的状态(正常提供服务的状态 - 运行时
Docker的使用场景
- 打包应用程序部署简单
- 可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦)例如:需要把服务器从腾讯云迁移到阿里云,如果采用的是 Docker 容器技术,整个迁移的过程只需要在新的服务器上启动我们需要的容器就可以了
- 适合做微服务的部署
- 适合持续集成和持续交付(CI/CD):开发到测试发布
Docker引擎(Docker Engine)
Docker Engine是具有以下主要组件的客户端-服务器(C/S架构)应用程序:
- server端:服务器是一种长期运行的程序,称为守护程序进程( dockerd命令)
- client端:REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口
- 命令行界面(cLI)客户端((docker命令)
docker run
docker start
docker rm
Docker三要素(核心组件)
- Docker images:镜像:统一的封装方式——>>模板
- Docker container:容器:统一的运行时环境 ——>>基于镜像,运行状态/运行时状态
- Docker registry:镜像仓库:放置镜像的仓库——>>存放镜像模板
存储镜像的地方,默认在公共的 Docker Hub上查找,可以搞个人仓库
仓库大类:①公共仓库—>>docker hub ②私有仓库registry harbor
- 客户端发起各种各样的命令,给与主机
- 主机会调用镜像,如果有镜像直接用,运行为容器
- 如果镜像里没有会到registry公共仓库去拉去镜像,拉到本地后再运行为容器
六大名称空间
namespace资源隔离——用容器技术封装
mount | 文件系统,挂载点——>一个文件系统内,不能重复挂载一个指定目录 |
---|---|
user | 操作进程的用户和用户组 |
pid | 进程编号 |
uts | 主机名和主机域 (同一个环境里不能又叫node1又叫node2) |
ipc | 信号量、消息队列、共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间) |
net | (网络资源) 网络设备、网络协议栈(在同一个网络名称空间中的网络规则)、端口等 |
资源控制——cgroups
特性——>>性能损耗10-20%
- 灵活:即使是最复杂的应用也可以集装箱化
- 轻量级:容器利用并共享主机内核
- 可互换:可以即时部署更新和升级
- 便携式:可以在本地构建,部署到云,并在任何地方运行
- 可扩展:可以增加并自动分发容器副本
- 可堆叠:可以垂直和即时堆叠服务
容器小的架构体系
Docker和虚拟化的区别
特性 | Docker容器(一个进程控制) | 虚拟机虚拟化(完整的操作系统) |
---|---|---|
启动速度 | 秒级 | 分钟级 |
运行性能 | 接近原生(直接在内核中运行)10%-20%左右的损失 | 50%左右损失(全虚拟化类型) |
磁盘占用 | 50-100MB | 3-5G |
数量 | 成百上千,每个进程可控制一个容器 | 几十个 |
隔离性 | 进程级别 | 操作系统(更彻底,安全级别高) |
操作系统 | 主要支持Linux | 几乎所有 |
封装程度 | 只封装目标代码和依赖关系,共享宿主机内核 | 完整的操作系统,与宿主机隔离 |
- 容器是依赖于内核来隔离,彼此的关系像共享一样,所以安全性较之虚拟机差一些,毕竟不是完全隔离。所以若一个容器被黑客攻破,宿主机基本也就没了
- 这里也不是完全没有办法,那就是 cgroup 资源分配,其能提供一定的安全机制