- 一、虚拟化
- 1.1 虚拟化概述
- 1.2 cpu的时间分片(cpu虚拟化)
- 1.3 cpu虚拟化性性能瓶颈
- 1.4 虚拟化工作原理
- 1.4.1 虚拟化类型
- 1.4.2 虚拟化功能
- 二、 Docker容器概述
- 2.1 Docker简介
- 2.2 使用docker有什么意义
- 2.3 Docker的使用场景
- 2.4 Docker引擎(Docker Engine)
- 2.5 Docker 三要素(核心组件)
- 2.6 六大名称空间
- 2.7 资源控制——cgroups
- 2.8 容器特性
- 2.9 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个。这就是时间分片的一个概念。
-
虚拟化作用:缓解/解决了资源利用率的问题
cpu分片后每个任务处理性能会打对折
-
如果是50M及50M以下的任务的话,虚拟化后的,1s模拟10个cpu,可以处理10个。虚拟化后的性能更高。
-
如果是50M+的任务的话,物理硬件的性能就会比虚拟化的性能高了。虚拟化的cpu会卡顿。所以在极度吃资源的情况下,例如mysql高并发这种,就不适合用虚拟化。
虚拟机管理器功能:调用资源
两大核心组件:QEMU、KVM
QEMU:
(1)可以理解为队列,核心目的是调用资源内核中的资源,需要把KVM逻辑分割出来的资源运输给QEMU,再给虚拟机。
(2)QEMU它并不是直接调用,而是用I/O方式调用,QEMU把资源调用来的过程借用ioctl,QEMU借助libvirt这个工具调用ioctl,再通过接口,给虚拟机应用程序。
KVM:
(1)用来逻辑分割物理资源,抽象化为虚拟化资源,根据VMM里的配置,会逻辑分割出多少G,给应用程序,去进行虚拟化。
(2)只接受来自QEMU的请求指令。对于应用程序直接过来的敏感指令会拦截,然后通过接口发给QEMU,让QEMU判断是否需要执行,可以的话,再下来,不可以的话,打回去,不执行该敏感指令。
对于workstation而言:硬件辅助虚拟化,表现形式在处理器里面有一个虚拟化引擎,可以勾取硬件辅助虚拟化,看到虚拟接口/dev/kvm,可以加强辅助调用,在应用程序需要频繁调用的时候,需要开启。比如openstack。
1.4.1 虚拟化类型- 全虚拟化:将物理硬件资源全部通过软件的方式抽象化,最后进行调用
- 半虚拟化:需要修改操作系统
- 直通:直接使用物理硬件资源(需要支持,还不完善)
全虚拟化:KVM – – 产品 vmware—ce
半虚拟化:EXSI – – workststion vsphere
1.4.2 虚拟化功能-
在一个操作系统内,模拟多个操作系统
-
以软件的方式模拟物理设备的功能
容器基础概念:六大名称空间
名称空间:以不同空间划分不同资源
-
是一种轻量级的“虚拟机”,Docker是一个用于开发,交付和运行应用程序的开放平台。
-
在Linux容器里运行应用的开源工具:容器引擎,让开发者可以打包大门的应用及依赖包到一个可移植的镜像中,然后发布到任何流行的linux或者window机器中。
-
Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。
鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。 -
Docker的设计宗旨:Build,Ship and Run Any App,Anywhere
即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的 “一次封装,到处运行” 的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
把容器化技术做成了标准化平台
-
docker引擎统一了基础设施环境——docker环境
-
docker引擎统一了程序打包(装箱)方式——docker镜像(把引擎放在镜像中,带着镜像到处跑)
-
docker引擎统一了程序部署(运行)方式——docke容器(利用引擎把这个镜像再去运行为之前的相同的一模一样的容器了)
镜像——封装的一个时刻的服务/应用状态
容器——应用跑起来的状态(正常提供服务的状态 - 运行时
2.3 Docker的使用场景-
打包应用程序部署简单
-
可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦)例如:需要把服务器从腾讯云迁移到阿里云,如果采用的是 Docker 容器技术,整个迁移的过程只需要在新的服务器上启动我们需要的容器就可以了。
-
适合做微服务的部署
-
适合持续集成和持续交付(CI/CD):开发到测试发布
Docker Engine是具有以下主要组件的客户端-服务器(C/S架构)应用程序:
-
server端:服务器是一种长期运行的程序,称为守护程序进程( dockerd命令)。
-
client端:REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口。
-
命令行界面(cLI)客户端((docker命令)。
docker run
docker start
docker rm
-
镜像
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板
通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件 -
容器
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性
可以把容器看做是要给简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。 -
仓库
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。
当下次要在另外一台机器上使用这个镜像时,只需从仓库获取
Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker 目录下。
仓库:
1.公共仓库 – docker hub
2.私有仓库 – registry harbor
- 客户端发起各种各样的命令,给与主机
- 主机会调用镜像,如果有镜像直接用,运行为容器
- 如果镜像里没有会到registry公共仓库去拉去镜像,拉到本地后再运行为容器
namespace资源隔离 – 用容器技术封装
mount :文件系统,挂载点,一个文件系统内,不能重复挂载一个指定目录 user :操作进程的用户和用户组 pid :进程编号 uts :主机名和主机域 (同一个环境里不能又叫node1又叫node2) ipc :信号量、消息队列、共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间) net(网络资源) :网络设备、网络协议栈(在同一个网络名称空间中的网络规则)、端口等2.7 资源控制——cgroups
- 六种名称空间是由cgroups管理的
- 最后一种centos的cgroups管理版本是3.8版本,3.6和3.5用不了
- cgroups 管理linux内核态中资源管理的模块
- cgroups 管理一些系统资源
- 不是docker原生的。
灵活:即使是最复杂的应用也可以集装箱化。
轻量级:容器利用并共享主机内核。
可互换:可以即时部署更新和升级。
便携式:可以在本地构建,部署到云,并在任何地方运行。
可扩展:可以增加并自动分发容器副本。
可堆叠:可以垂直和即时堆叠服务。
特性 Docker容器 虚拟机 启动速度 秒级 分钟级 计算能力损耗 几乎无 损耗 50%左右 性能 接近原生 弱于 系统支持量(单机) 上千个 几十个 隔离性 资源隔离/限制 完全隔离
- 容器是依赖于内核来隔离,彼此的关系像共享一样,所以安全性较之虚拟机差一些,毕竟不是完全隔离。所以若一个容器被黑客攻破,宿主机基本也就没了。
- 这里也不是完全没有办法,那就是 cgroup 资源分配,其能提供一定的安全机制



