目录
虚拟化 和 Docker
一、背景
以linux而言,linux操作系统会有一个主进程pid=1派生出其他进程来控制不同服务。例如: (pid=2,Python pid=3,Java pid4,Php pid5)三个服务可能会相互影响。使用者期望将这三个不同的服务,跑在不同的运行时环境中实现相互不影响,同时不会增加服务器成本,延伸出能否将这三种服务分别封装起来。KVM虚拟化技术,实现了一个操作系统模拟多个操作系统/不同的运行时环境。随着技术发展,虚拟化技术开销较大。(例如:只要运行一个py脚本,想要使用虚拟化方式实现,还需要安装一个操作系统,并不方便/合理),延伸出容器技术
虚拟化层的抽象层(用户层)剥离,使用docker engine来替代(来宾操作系统去除),只要通过引擎就可以直接连接到宿主机操作系统中,极大减小了开销
二、虚拟化
虚拟化简介
通过虚拟化技术将一台计算机虚拟为多台逻辑计算机,在一台计算机上同时运行多个逻辑计算机,同时每个逻辑计算机可运行不同的操作系统。应用程序都可以在相互独立的空间内运行而互相不影响,从而提高计算机的工作效率
①在一个操作系统中(win10)模拟多个操作系统(centos、win10、suse),同时每个操作系统可以跑不同的服务(ngint tomcat),从而实现一台宿主机搭建一个集群(从整体)
②通过软件/应用程序的方式,来实现物理硬件的功能(ensp)
以软件形式实现物理设备的功能(二层交换机、路由器、三层交换机等)
虚拟化作用
将应用程序和系统内核资源进行解耦,以操作系统级别进行隔离,目的是提高资源利用率
虚拟化技术发展
①1961年,IBM709机器实现了分时系统,将CPU占用切分为多个极短的时间片(1/100sec)每一个时间片执行不同的工作,通过对这些时间片进行轮询从而将一个CPU伪装成多个CPU
②1972年,IBM正式将system370机的分时系统命名为虚拟机
③1990年,IBM推出的system390机支持逻辑分区(将一个CPU分为多份,相互独立,也就是逻辑分割)
④Xen 2003年问世,是一个外部的hypervisor/VMM程序(虚拟机管理程序),能够控制宿主机和给多个客户机分配资源
⑤KVM: 2007年问世。现已内置在kernel内核中的
⑥Xen支持的虚拟化技术:全虚拟化,平虚拟化
⑦KVM:支持的虚拟化技术:全虚拟化
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高并发这种,就不适合用虚拟化
虚拟户工作原理
虚拟机管理器功能:调用资源
两大核心组件: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(资源损耗大)
半虚拟化:EXSI——产品 workstation vsphere
虚拟化功能
①在一个操作系统内,模拟多个操作系统
② 以软件的方式模拟物理设备的功能
虚拟化的优缺点
优势
①集中化管理(远程管理、维护)
②提高硬件利用率(物理资源利用率低-例如峰值,虚拟化解决了"空闲"容量)
③动态调整机器/资源配置(虚拟化把系统的应用程序和服务硬件分离、提高了灵活性)
④高可靠(可部署额外的功能和方案,可提高透明负载均衡、迁移、恢复复制等应用环境)
劣势
①前期高额费用(初期的硬件支持)
②降低硬件利用率(特定场景-例如极度吃资源的应用不一定适合虚拟化)
③更大的错误影响面(本地物理机down机会导致虚拟机均不可用,同时可能虚拟机中文件全部损坏)
④实施配置复杂、管理复杂((管理人员运维、排障困难)
⑤一定的限制性(虚拟化技术涉及各种限制,必须与支持/兼容虚拟化的服务器、应用程序及供应商结合使用)
⑥安全性(虚拟化技术自身的安全隐患)
三、Docker
Docker是什么
是一种轻量级,“虚拟机”
在Linux容器里运行应用的开源工具(容器引擎)
Docker使用场景
①打包应用程序简化部署
②可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦)
例:服务器从腾讯云迁移到阿里云
③持续集成和持续交付(CI/CD),开发到测试发布
④部署微服务
⑤提供PASS产品(平台即服务)
Docker的意义
把容器技术做成了标准化平台
①docker引擎统一了基础设施环境——docker 容器环境
(引擎)
②docker引擎统一了程序打包(装箱)方式——docker 镜像
(镜像:封装的某一个时刻的服务/应用状态)
③docker引擎统一了程序部署(运行)方式——docker 容器
(容器:应用跑起来的状态,正常提供服务的状态—运行时)
Docker三大组件
镜像:模块(一组资源集合,包含了应用程序包,应用程序相关的依赖包,运行程序所需要的的基础环境)
容器:基于镜像,运行状态/运行时状态
仓库:存放镜像模块(公共仓库:docker、私有仓库:registry harbor)
Docker引擎(Docker Engine)
Docker Engine是具有以下主要组件的c/s客户端-服务器应用程序
server端∶服务器是一种长期运行的程序,称为守护程序进程( dockerd命令)
CLIENT端:REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口。命令行界面(cLI)客户端(docker命令)
docker run
docker start
docker rm
六大名称空间
cgroups:管理—管理Linux内核中资源管理的模块,管理一些系统资源
namespace:资源隔离—用容器技术封装
mount:文件系统,挂载点(一个文件系统,不能重复挂载一个指定目录)
user:操作进程的用户和用户组
pid:进程编号
uts:主机名和主机域
ipc:信号量,信息队列,共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间)
net:网络设备,网络协议栈,端口等
资源控制 —— cgroups
①六种名称空间是由cgroups管理的
②最后一种centos的cgroups管理版本是3.8版本,3.6和3.5用不了
③cgroups 管理linux内核态中资源管理的模块
④cgroups 管理一些系统资源
⑤不是docker原生的
容器特性
特性:性能损耗10-20%
优点:
灵活:即使是最复杂的应用也可以集装箱化
轻量级:容器利用并共享主机内核
可互换:可以即时部署更新和升级
便携式:可以在本地构建,部署到云,并在任何地方运行
可扩展:可以增加并自动分发容器副本
可堆叠:可以垂直和即时堆叠服务
容器小的架构体系
四、Docker 和 虚拟化的区别
五、Docker 有哪些优势? 和虚拟化比有什么优势?
docker把容器化技术做成了标准化平台,只要安装了docker引擎,就能使用docker
使用docker有什么意义(实现了3个统一)
docker引擎统一了基础设施环境-docker环境——image——封装一一个简易的操作系统(3.0+G)
docker引擎统一了 程序打包(装箱/封装-类比于集装箱)方式-docker镜像——images
docker引擎统—了程序部署(运行)方式-docker容器——基于镜像——运行为容器(可运行的环境)
实现了一次构建,多次、多处使用