虚拟化+docker概念基本介绍
一、引言
- 以Linux而言,
Linux操作系统
会有一个主进程pid=1
去派生出其他进程来控制不同服务 - 例如:pid=2 —>python pid=3 —>java pid=4 —>php ,三个服务可能会相互影响,使用者期望将这
三个不同的服务,跑在不同的运行时实现相互不影响
,同时不会增加服务器成本。
——> 延伸出——>能否将这三种服务分别封装起来——>KVM虚拟化技术
,实现了一个操作系统模拟多个操作系统/不同的运行时环境 - 随着技术发展——>
虚拟化技术开销较大
(例如:只 要运行一个py脚本,想要使用虚拟化
方式实现,还需要安装一个操作系统,并不方便/合理)
——>延伸出容器技术
虚拟化层的抽象层(用户层)剥离,使用
docker engine
来替代(来宾操作系统去除),只要通过引擎
就可以直接连接到宿主机操作系统中,极大减小了开销
。
一、虚拟化简介
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 虚拟化类型
1.全虚拟化:将物理硬件资源全部通过软件的放肆抽象化,最后进行调用
2.半虚拟化:需要修改操作系统
3.直通:直接使用物理硬件资源(需要支持,还不完善)
全虚拟化:KVM ---->产品vmware-ce
半虚拟化:EXSI ----> workstation vsphere
1.5.2 虚拟化功能
①在一个操作系统内,模拟多个操作系统
② 以软件的方式模拟物理设备的功能
二、Docker容器概述
容器基础概念—>六大名称空间
名称空间:以不同空间划分不同资源
Docker的思想来自于集装箱, 是一个以容器的形式将应用程序及其所有依赖项打包在一起的平台
。它使用容器使应用程序的创建、部署和运行变得更加容易。Docker 在容器内绑定应用程序及其依赖项。容器允许开发人员将应用程序及其所需的所有部分(例如库和其他依赖项)打包在一起,然后将其作为一个包发送出去。docker的主要目标是"Build,Ship and Run any App,Anywhere
",构建,运输,处处运行。
举个例子:
我需要盖一座别墅,于是我找设计人员设计结构、运输原材料、建筑工人盖房子等等一系列操作,花了很长时间才盖好;住了一段时间,我想去海边住,我还想要现在这种结构和布局,那么又得按照原来的方式找设计人员设计结构、运输原材料、建筑工人盖房子等等一系列操作,这时候出现一个魔法师,他可以将我的别墅复制一份做成镜像,到了海边,我就用这个镜像复制一套别墅,直接入住。
回归实际开发运维环境中,别墅就是一套系统,盖房的过程就是项目部署过程(安装mysql/postgres、jdk、redis、nginx、中间件、配置各种环境等等),但是每部署一套系统都需要重复步骤,很花费精力和时间,而且还需要考虑版本兼容问题;那么我们就用docker来解决这个问题;
用docker部署好之后,只需要重新拉取镜像随便复制一份就可以,不用再关注版本、兼容、部署等问题。
2.1 docker是什么?
- 是一种
轻量级的“虚拟机”
,docker是一个用于开发,交付和运行应用程序的开放平台。 - 在Linux容器里运行应用的开源工具—》
容器引擎
,让开发者可以打包大量的应用以及依赖包到一个可以值得镜像中,然后发布到任何流行的Linux或者window机器中。 - docker的logo设计为蓝色鲸鱼,拖着许多集装箱。
鲸鱼可以作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。
- docker的设计宗旨:
build,ship and run any App,Anywhere
即 通过对应用组件的封装、发布、部署、运行
等生命期的管理,达到应用组件级别的“一次封装,到处运行”
的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
2.2 使用docker有什么意义?
把容器化技术做成了标准化平台
1.docker引擎统一了基础设施
环境——docker环境
2.docker引擎统一了程序打包(装箱) 方式——docker镜像
(把引擎放在镜像中,带着镜像到处跑)
3.docker引擎统一了程序部署(运行) 方式——docke容器
(利用引擎把这个镜像再去运行为之前的相同的一模一样的容器了)
镜像——》封装的一个时刻的服务/应用状态
容器——》应用跑起来的状态(正常提供服务的状态 - 运行时
有镜像才能有容器
2.2.1 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.5.1 docker的工作流程
build:制作镜像(image)
pull:拉取镜像(拉倒本地去使用)
run:运行容器的(docker)
1.客户端
发起各种各样的命令,给与主机
2.主机会调用镜像
,如果有镜像直接用,运行为容器
3.如果镜像里没有会到registry公共仓库
去拉去镜像,拉到本地后再运行为容器
2.6 六大名称空间
namespace资源隔离——用容器技术封装
mount | 文件系统,挂载点——>一个文件系统内,不能重复挂载一个指定目录 |
---|---|
user | 操作进程的用户和用户组 |
pid | 进程编号 |
uts | 主机名和主机域 (同一个环境里不能又叫node1又叫node2) |
ipc | 信号量、消息队列、共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间) |
net(网络资源) | 网络设备、网络协议栈(在同一个网络名称空间中的网络规则)、端口等 |
2.7资源控制——cgroups(control groups)
- 六种名称空间是有cgroups管理的
- 最后一种centos的cgroups管理版本是3.8版本,3.6和 3.5已经不用了
- cgroups管理linux内核态中资源管理的模块
- cgroups管理一些系统资源
- 不是docker原生的
【CPU为什么能够划分时间片,就是通过cgroups去划分管理的】
Linux上的Docker引擎还依赖于另一种称为控制组 (cgroups)的技术。cgroup将应用程序限制为一组特定的资源。控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束。例如,您可以限制特定容器可用的内存。
2.8容器特性
特性——》性能损耗10-20%
- 灵活: 即使是最复杂的应用也可以集装箱化。
- 轻量级: 容器利用并共享主机内核。
- 可互换: 可以即时部署更新和升级。
- 便携式: 可以在本地构建,部署到云,并在任何地方运行。
- 可扩展: 可以增加并自动分发容器副本。
- 可堆叠: 可以垂直和即时堆叠服务。
2.9 容器小的架构体系
三、Docker和虚拟化的区别
特性 | Docker容器(一个进程控制) | 虚拟机虚拟化(完整的操作系统) |
---|---|---|
启动速度 | 秒级 | 分钟级 |
运行性能 | 接近原生(直接在内核中运行)10%-20%左右的损失 | 50%左右损失(全虚拟化类型) |
磁盘占用 | 50-100MB | 3-5G |
数量 | 成百上千,每个进程可控制一个容器 | 几十个 |
隔离性 | 进程级别 | 操作系统 (更彻底,安全级别高) |
操作系统 | 主要支持Linux | 几乎所有 |
封装程度 | 只封装目标代码和依赖关系,共享宿主机内核 | 完整的操作系统 ,与宿主机隔离 |
- 容器 是
依赖于内核来隔离
,彼此的关系像共享
一样,所以安全性较之虚拟机差一些,毕竟不是完全隔离。所以若一个容器被黑客攻破,宿主机基本也就没了。- 这里也不是完全没有办法,那就是 cgroup 资源分配,其能提供一定的安全机制
四、总结
4.1 什么是docker?docker原理?
- docker是一种
封装和运行的开源平台
,他统一了封装方式,统一了运行方式,开源平台 指的是docker引擎
,统一的封装方式 指的是镜像
,统一的运行方式 指的是容器
。 cgroup资源控制与namespaces两者构成了docker底层原理
- docker是一种容器技术,
把linux中的cgroups(资源管理)和namespace(名称空间)等
容器底层技术进行完美封装,并抽象为用户创建和管理容器的便捷界面(命令行cli、api等),这种C/S架构
4.2 简述Docker主要使用的技术?
- Cgroups: 资源控制,管理一些系统资源
Namespace:资源隔离(名称空间)
- rootfs:文件系统隔离(使用内核提供的rootfs)
- 容器引擎(用户态工具) :生命周期控制
docker本质 就是宿主机的一个进程, docker是通过namespace(命名空间) 实现资源隔离
,通过cgroup,实现资源限制
,通过写时复制技术(copy-on-write)实现了高效的文件操作
(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘50og)
Namespace:资源隔离(名称空间)
mount | 文件系统,挂载点——>一个文件系统内,不能重复挂载一个指定目录 |
---|---|
user | 操作进程的用户和用户组 |
pid | 进程编号 |
uts | 主机名和主机域 (同一个环境里不能又叫node1又叫node2) |
ipc | 信号量、消息队列、共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间 ) |
net(网络资源) | 网络设备、网络协议栈(在同一个网络名称空间中的网络规则)、端口等 |
4.3 简述Docker体系架构?
- Docker客户端 - Docker
docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。
- Docker服务端-Docker Daemon资源限制
docker服务端是一个服务进程,管理着所有的容器。
- Docker镜像一Imagefont>
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker容器引擎的只读模板。通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码。运行时间,库,环境变量,和配置文件
- Docker容器-Docker Container
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。
- Docker镜像仓库-- Registryfont>
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private、常用)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
Docker的镜像、容器、日志等内容全部都默认存储在/var/lib/docker
目录下。
4.4 Docker有哪些优势?和虚拟化比有什么优势?
-
docker把容器化技术做成了标准化平台,只要安装了docker引擎,就能使用docker。
-
使用docker有什么意义(实现了3个统一)
docker引擎统一了基础设施环境
-docker环境——>image
——>封装一一个简易的操作系统(3.0+G)
docker引擎统一了 程序打包
(装箱/封装-类比于集装箱)方式-docker镜像
——>images
docker引擎统—了程序部署(运行)方式-docker容器
——>基于镜像——>运行为容器(可运行的环境
) -
实现了一次构建,多次、多处使用
。
4.5 如何把多个目录挂载到同一个目录下?
(存储引擎)overlay2(现在使用) 和 (存储引擎) aufs(早期使用)叠加式文件系统
es
docker引擎统—了程序部署(运行)方式-docker容器
——>基于镜像——>运行为容器(可运行的环境
)
实现了一次构建,多次、多处使用。