基础了解
IAAS: 基础设施服务,(只提供基础设施,没有系统)
**SAAS: ** 软件即服务,(提供基础设施和系统)
PAAS: 平台即服务,(提供基础设施和系统和软件一个整体平台,拿来用就行)
DAAS:数据库的平台(收集大量数据,提供分析)
开发的具体开发流程
获取项目需求---->分布开发------>测试(测试类型:运行测试、功能性测试、单元测试、回归测试、冒烟测试)----->线上运维。
在早期的时候,我们想在线上部署一个应用,我们需要先购买服务器,然后安装操作系统以及各种依赖环境,最后进行应用的部署。
这种情况非常的麻烦。。。。。
出现了以上问题后,后面就有人提出了 虚拟化技术。
虚拟化技术就是在操作系统上多加了一个虚拟化层(Hypervisor),可以将物理的CPU,内存,硬盘等资源进行虚拟化,再通过虚拟化出来的空间上安装操作系统,这就是我们通常说的虚拟机。
比如:我们将一台32核CPU,64G内存、500磁盘的物理机进行虚拟化,可以创建8台4核CPU、8G内存的虚拟机安装任意的操作系统,这些机器提供给不同的应用去部署,如此提供了资源的利用率,常见的虚拟化技术有:VMWare、KVM、VirtualBox等。
虚拟化技术的优点
cpu分片前
CPU分片后
虚拟化的作用:缓减/解决了资源利用率的问题。
cpu分片后每个任务处理性能会打折
所以。在极度吃资源的情况系,例如mysql高并发这种,就不适合虚拟化了。
逻辑分割系统物理资源抽象为可调用的虚拟化资源(KVM:逻辑分割的模块)。
hypervisor虚拟资源管理器通过QEMU(I/O控制模块)使用接口与接的方式调用物理资源。
然后hypervisor把调用的虚拟资源给到虚拟机。
①QEMU是I/O控制模块,可以理解成队列, 核心目的是调用资源内核中的资源 ,需要把KVM逻辑分割出来的有资源运输给QEMU,再个虚拟机。
②QEMU它并不是直接调用,而是用I/O方式调用,QEMU把资源用来的过程借用ioctl(运输的作用),QEMU借助libvirt这个工具调用ioctl,再通过接口,给虚拟机程序
①用来逻辑分割物理资源,抽象化为虚拟化资源,根据KVM里的配置,会逻辑分割出多少个G,给应用程序,并进行虚拟化。
②只接受来自QEMU的请求指令,对于应用程序直接归来的指令会拦截,然后通过接口发给QEMU,让QEMU判断是否需要执行,可以的话,再发给KVM,不可的话,返回。不执行该敏感指令。
对于workstation而言——》硬件辅助虚拟化,表现形式在处理器里面有一个虚拟化引擎,可以勾取硬件辅助虚拟化,看到虚拟接口/dev/kvm,可以加强辅助调用,在应用程序需要频繁调用的时候,需要开启。比如openstack。
1**、全虚拟化(寄居架构):**将物理硬件资源全部通过软件的方式抽象化,最后进行调用。
2、**半虚拟化(裸金属架构):**裸金属虚拟化,需要修改操作系统
3、直通:直接使用物理硬件资源(需要支持,还不完善)
虚拟化技术发展已经非常强大了,那为什么还需要容器化技术呢?
如今的虚拟机解决了基础设计计算,网络,存储着几个方面的弹性,可以非常方便的扩展出应用的资源,但是仍然存在两个问题。
在云计算的时代,通常通过自动化脚本的方式解决上面的问题,但是环境差异,导致脚本维护要投入额外的人力,也有团队使用虚拟化镜像,但是镜像大且启动慢,没法满足时效性的要求。
于是,我们来看是否存在一种更加轻巧的虚拟化技术,更容易迁移和扩展应用层业务。-----------》集装箱
正式借鉴了集装箱的解决方案,就有人提出了类似集装箱的方式应用以及他的运行环境,将应用和环境打包成一个轻量化,可移植,自包含的容器。
容器化技术的优势
更高效的系统资源利用率
启动非常快,秒级时间
一致的运行环境
持续交付和部署
更易于迁移
局限性
总结
容器:提供在多台主机上运行程序相同的运行环境.
docker容器可以看做运行在宿主机上的一个进程,容器共享宿主机的内核,容器间是通过namespace(命令空间)隔离资源,通过cgroups(资源配额)去限制资源。
Docker 的Logo设计为蓝色鲸鱼,拖着许多集装箱,鲸鱼可以看作为宿主机,集装箱可以理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。
即通过对应用组件的封装,发布、部署、运行等生命周期的管理,达到应用组件级别的 一次封装,到处运行的 目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
docker 和vm,解决了虚拟机的什么问题?
docker解决了vm的一个环境孤岛问题
docker可以自定义传参,(创建–创建镜像/容器,启动(基于镜像启动)之前)
虚拟机通过Hypervisor层(虚拟化中间层),虚拟出网卡,内存,cpu等虚拟硬件,再在其上建立虚拟机,每个虚拟机都有自己的系统内核,
Dcoker容器则是通过隔离(namesapce)的方式,将文件系统、进程、设备、网络等资源进行隔离,再对权限,cpu资源等进行控制(cgroup),最终让容器之间互不影响,容器无法影响宿主机。
容器与宿主机共享内核、文件系统,硬件等资源。
特性(不同点) | Docker容器 | 虚拟机 |
---|---|---|
部署难度 | 非常简单 | 组件多,部署复杂 |
启动速度 | 秒级 | 分钟级 |
执行性能 | 和物理系统一致(共享内核) | VM会占用部分资源(50%损耗) |
镜像体积(磁盘占用) | MB级别 | GB级别 |
管理效率 | 简单 | 各组件相互依赖,管理复杂 |
可管理性 | 单进程 | 完整的系统管理 |
网络连接 | 弱 | 借助neutron可以灵活组件各类网络管理 |
系统支持量(单机) | 上千个 | 几十个 |
隔离性 | 进程级别 | 系统级别 |
封装程度 | 直达包项目代码和依赖关系,共享宿主机内核 | 完整的操作系统,与宿主机隔离 |
docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术copy-on-write实现了高效的文件操作。(类似于虚拟机的磁盘,比如分配了500G并不是实际占用物理磁盘500G)
namespace | 系统调用参数 | 隔离内容(判断两个环境是否完全隔离) |
---|---|---|
utc | CLONE_NEWUTS | 主机名与域名(同一个环境里不能叫node1又叫node2) |
ipc | CLONE_NEWWIPC | 信号量、消息队列和共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间) |
pid | CLONE_NEWPID | 进程编号 |
network | CLONE_NEWNET | 网络设备、网格栈、端口等 |
mount | CLONE_NEWNS | 挂载点(文件系统,不能重复挂载一个指定目录) |
user | CLONE_NEWUSER | 用户和组(3.8以后的内核才支持) |
六种名称空间是由cgroup管理的
最后一种centos的cgroup管理版本是3.8版本,3.6和3.5用不了
公共仓库:docker hub
私有仓库:harhor
Dcoker Engine 是具有以下主要组件“客户端-服务端(C/S架构)”的应用程序
执行命令的是客户端、执行操作的服务端
docker 引擎 统一基础设施环境-docker容器环境(引擎)
docker 引擎统一了程序打包(装箱)方式-docker镜像
docker 引擎统一了程序部署(运行)方式-docker容器
镜像------》封装的某一个时刻的服务/应用状态
容器-----》应用跑起来的状态(正常提供服务的状态----运行时)
①打包应用程序部署简单
②可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦)
③适合做微服务的部署
④适合持续集成和持续交付(CI/CD):开发到测试到发布
Podman与Docker主要区别