目录
一、虚拟化简介
1.1.虚拟化概述
1.2.cpu的时间分片(cpu虚拟化)
1.3.cpu虚拟化性性能瓶颈
1.4.虚拟化工作原理
1.5 虚拟化类型
1.6 虚拟化功能
二、Docker容器概述
2.1 docker是什么?
2.2 使用docker有什么意义?
2.3 docker的使用场景
2.4 docker引擎(docker engine)
2.5 Docker 三要素(核心组件)
2.6 docker的工作流程
2.7 六大名称空间
2.8 资源控制——cgroups(control groups)
2.9 容器特性
2.10 如何把多个目录挂载到同一个目录下
三、Docker和虚拟化的区别
一、虚拟化简介
1.1.虚拟化概述
- 虚拟化: 将应用程序和系统内核资源进行
解耦
,以操作系统级别进行隔离,目的是提高资源利用率
1.2.cpu的时间分片(cpu虚拟化)
- 正常每个任务以轮询的方式去处理,这个时候一个CPU一个整体。
- 以下是针对的CPU单位时间内的一个资源。按时间划分,1秒划分成10个0.1秒,每个0.1秒可以全力处理10单位的任务。在1秒内,都在全力工作。
- cpu 1s全力运转的性能——》逻辑分割成分成了10份,可以理解为在单位时间内可以处理10个任务,每一个0.1s cpu是满的。原先分片前100M以下的任务一次只可以处理1个,现在100M的任务一次可以处理10个。这就是时间分片的一个概念。
- 虚拟化作用——》缓解/解决了资源利用率的问题
1.3.cpu虚拟化性性能瓶颈
cpu分片后每个任务处理性能会打对折。
- 如果是50m及50m以下的任务的话,虚拟化后的,1s模拟10个cpu,可以处理10个。虚拟化后的性能更高。
- 如果是50+m的任务的话,物理硬件的性能就会比虚拟化的性能高了。虚拟化的cpu会卡顿。所以在极度吃资源的情况下,例如mysql高并发这种,就不适合用虚拟化。
1.4.虚拟化工作原理
虚拟机管理器功能: 调用资源
两大核心组件: QEMU、KVM
- QEMU:
- 可以理解为队列,核心目的是调用资源内核中的资源,需要把KVM逻辑分割出来的资源运输给QEMU,再给虚拟机。
- QEMU它并不是直接调用,而是用I/O方式调用,QEMU把资源调用来的过程借用ioctl,QEMU借助libvirt这个工具调用ioctl,再通过接口,给虚拟机应用程序。
- KVM:
- 用来逻辑分割物理资源,抽象化为虚拟化资源,根据KVM里的配置,会逻辑分割出多少G,给应用程序,去进行虚拟化。
- 只接受来自QEMU的请求指令。对于应用程序直接过来的敏感指令会拦截,然后通过接口发给QEMU,让QEMU判断是否需要执行,可以的话,再下来,不可以的话,打回去,不执行该敏感指令。
- 对于workstation而言——》硬件辅助虚拟化,表现形式在处理器里面有一个虚拟化引擎,可以勾取硬件辅助虚拟化,看到虚拟接口/dev/kvm,可以加强辅助调用,在应用程序需要频繁调用的时候,需要开启。比如openstack。
1.5 虚拟化类型
1.全虚拟化:将物理硬件资源全部通过软件的放肆抽象化,最后进行调用
2.半虚拟化:需要修改操作系统
3.直通:直接使用物理硬件资源(需要支持,还不完善)
- 全虚拟化:KVM ---->产品vmware-ce
- 半虚拟化:EXSI ----> workstation vsphere
1.6 虚拟化功能
- 在一个操作系统内,模拟多个操作系统
- 以软件的方式模拟物理设备的功能
二、Docker容器概述
容器基础概念—>六大名称空间
名称空间:以不同空间划分不同资源
Docker的思想来自于集装箱, 是一个以容器的形式将应用程序及其所有依赖项打包在一起的平台。它使用容器使应用程序的创建、部署和运行变得更加容易。Docker 在容器内绑定应用程序及其依赖项。容器允许开发人员将应用程序及其所需的所有部分(例如库和其他依赖项)打包在一起,然后将其作为一个包发送出去。docker的主要目标是"Build,Ship and Run any App,Anywhere",构建,运输,处处运行。
2.1 docker是什么?
- 是一种轻量级的“虚拟机”,docker是一个用于开发,交付和运行应用程序的开放平台。
- 在Linux容器里运行应用的开源工具—》容器引擎,让开发者可以打包大量的应用以及依赖包到一个可以值得镜像中,然后发布到任何流行的Linux或者window机器中。
- docker的logo设计为蓝色鲸鱼,拖着许多集装箱。
- 鲸鱼可以作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。
- docker的设计宗旨: build,ship and run any App,Anywhere
- 即 通过对应用组件的封装、发布、部署、运行等生命期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
2.2 使用docker有什么意义?
把容器化技术做成了标准化平台
- docker引擎统一了基础设施环境——docker环境
- docker引擎统一了程序打包(装箱) 方式——docker镜像(把引擎放在镜像中,带着镜像到处跑)
- docker引擎统一了程序部署(运行) 方式——docke容器(利用引擎把这个镜像再去运行为之前的相同的一模一样的容器了)
有镜像才能有容器
- 镜像——》封装的一个时刻的服务/应用状态
- 容器——》应用跑起来的状态(正常提供服务的状态 - 运行时
docker的作用
- 解决环境和切换的问题
比如说装Linux虚拟机,重装Windows系统,都是需要一个叫镜像的东西,我们通过这个镜像来装系统,docker就是这种思想,把环境打包,用的时候直接拉取就可以。
- 更快速的交付和部署
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
- 高效的部署和扩容
Docker容器可以打包为镜像文件(类似VM虚拟机的那些快照文件),迁移的时候我们只需要在新服务器上安装docker,就能把之前打包好的镜像文件导入到docker里面,运行容器,就能实现访问,不需要重新配置环境。
- 轻量、消耗少
使用Docker能合并多个服务以降低费用,不多的操作系统内存占用,跨实例共享多个空闲的内存,这些技术让Docker能以更加紧密的资源提供更有效的服务合并。基于LXC轻量级特点,启动快,而且docker能够只加载每个container变化的部分,这样资源占用小,在单机环境下与KVM之类的虚拟化方案相比,能够更加快速和占用更少资源。
- 更高的资源利用率
Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。
- 更简单的管理
它有可视化ui界面,展示整个docker环境的容器列表,容器状态,容器属性、容器创建等,可以对容器进行相关的操作,如容器的基本信息、启停、删除、状态监控(CPU、内存、网络情况)、日志查看、进入容器终端(docker exec)。目前市面有很多,可以搜索docker管理界面软件。
2.3 docker的使用场景
- 打包应用程序部署简单
- 可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦)例如: 需要把服务器从腾讯云迁移到阿里云,如果采用的是 Docker 容器技术,整个迁移的过程只需要在新的服务器上启动我们需要的容器就可以了。
- 适合做微服务的部署
- 适合持续集成和持续交付(CI/CD):开发到测试发布
2.4 docker引擎(docker engine)
docker engine是具有以下主要组件的客户端- 服务器(C/S架构)
应用程序:
- server端: 服务器是一种长期运行的程序,称为守护程序进程(dockerd命令 )
- client端: rest API ,它指定程序可以用来与守护进程通信并指示其操作的接口。
- 命令行界面(CLI) 客户端(docker命令)
- docker run
- docker start
- docker rm
2.5 Docker 三要素(核心组件)
- docker images: 镜像:统一的封装方式----->模板
- docker container: 容器:统一的运行时环境—>基于镜像,运行状态/运行时状态
- docker registry: 镜像仓库:放置镜像的仓库---->存放镜像模板
- 存储镜像的地方,默认在公共的docker hub上查找,可以搞个人仓库。
- 仓库大类: ①公共仓库—》docker hub ②私有仓库registry harbor
2.6 docker的工作流程
build:制作镜像(image)
pull:拉取镜像(拉倒本地去使用)
run:运行容器的(docker)
1.客户端发起各种各样的命令,给与主机
2.主机会调用镜像,如果有镜像直接用,运行为容器
3.如果镜像里没有会到registry公共仓库去拉去镜像,拉到本地后再运行为容器
2.7 六大名称空间
namespace资源隔离——用容器技术封装
mount | 文件系统,挂载点——>一个文件系统内,不能重复挂载一个指定目录 |
---|---|
user | 操作进程的用户和用户组 |
pid | 进程编号 |
uts | 主机名和主机域 (同一个环境里不能又叫node1又叫node2) |
ipc | 信号量、消息队列、共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间) |
net(网络资源) | 网络设备、网络协议栈(在同一个网络名称空间中的网络规则)、端口 |
2.8 资源控制——cgroups(control groups)
- 六种名称空间是有cgroups管理的
- 最后一种centos的cgroups管理版本是3.8版本,3.6和 3.5已经不用了
- cgroups管理linux内核态中资源管理的模块
- cgroups管理一些系统资源
- 不是docker原生的
2.9 容器特性
特性——》性能损耗10-20%
- 灵活: 即使是最复杂的应用也可以集装箱化。
- 轻量级: 容器利用并共享主机内核。
- 可互换: 可以即时部署更新和升级。
- 便携式: 可以在本地构建,部署到云,并在任何地方运行。
- 可扩展: 可以增加并自动分发容器副本。
- 可堆叠: 可以垂直和即时堆叠服务。
2.10 如何把多个目录挂载到同一个目录下
(存储引擎)overlay2(现在使用) 和 (存储引擎) aufs(早期使用)叠加式文件系统
es
docker引擎统—了程序部署(运行)方式-docker容器——>基于镜像——>运行为容器(可运行的环境)
实现了一次构建,多次、多处使用。
三、Docker和虚拟化的区别
特性 | Docker容器(一个进程控制) | 虚拟机虚拟化(完整的操作系统) |
---|---|---|
启动速度 | 秒级 | 分钟级 |
运行性能 | 接近原生(直接在内核中运行)10%-20%左右的损失 | 50%左右损失(全虚拟化类型) |
磁盘占用 | 50-100MB | 3-5G |
数量 | 成百上千,每个进程可控制一个容器 | 几十个 |
隔离性 | 进程级别 | 操作系统 (更彻底,安全级别高) |
操作系统 | 主要支持Linux | 几乎所有 |
封装程度 | 只封装目标代码和依赖关系,共享宿主机内核 | 完整的操作系统 ,与宿主机隔离 |
容器 是依赖于内核来隔离,彼此的关系像共享一样,所以安全性较之虚拟机差一些,毕竟不是完全隔离。所以若一个容器被黑客攻破,宿主机基本也就没了。
这里也不是完全没有办法,那就是 cgroup 资源分配,其能提供一定的安全机制