虚拟化和docker概念

引言

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 LinuxWindows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

以linux而言,linux操作系统会有一个主进程pid=1派生出其他进程来控制不同服务

例如: pid=2 ——> python pid=3——>java pid4——>php,三个服务可能会相互影响

使用者期望将这三个不同的服务,跑在不同的运行时环境中实现相互不影响,同时不会增加服务器成本
——> 延伸出——>能否将这三种服务分别封装起来——>KVM虚拟化技术,实现了一个操作系统模拟多个操作系统/不同的运行时环境

随着技术发展——>虚拟化技术开销较大(例如:只 要运行一个py脚本,想要使用虚拟化方式实现,还需要安装一个操作系统,并不方便/合理)

——>延伸出容器技术

虚拟化层的抽象层(用户层)剥离,使用docker engine来替代(来宾操作系统去除),
只要通过引擎就可以直接连接到宿主机操作系统中,极大减小了开销

一、虚拟化简介

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个。这就是时间分片的一个概念。

虚拟化作用——》缓解/解决了资源利用率的问题
 

3.CPU虚拟化性能瓶颈

cpu分片后每个任务处理性能会打对折。

    如果是50m及50m以下的任务的话,虚拟化后的,1s模拟10个cpu,可以处理10个。虚拟化后的性能更高。
    如果是50+m的任务的话,物理硬件的性能就会比虚拟化的性能高了。虚拟化的cpu会卡顿。所以在极度吃资源的情况下,例如mysql高并发这种,就不适合用虚拟化。

4.虚拟化工作原理


 

(1)虚拟机管理器功能:调用资源

(2)两大核心组件:QEMU、KVM

    QEMU:

    ①可以理解为队列,核心目的是**调用资源内核中的资源**,需要把KVM逻辑分割出来的资源运输给QEMU,再给虚拟机。

    ②QEMU它并不是直接调用,而是用I/O方式调用,QEMU把资源调用来的过程借用ioctl,QEMU借助libvirt这个工具调用ioctl,再通过接口,给虚拟机应用程序。

    KVM:

    ①用来逻辑分割物理资源,抽象化为虚拟化资源,根据VMM里的配置,会逻辑分割出多少G,给应用程序,去进行虚拟化。

    ②只接受来自QEMU的请求指令。对于应用程序直接过来的敏感指令会拦截,然后通过接口发给QEMU,让QEMU判断是否需要执行,可以的话,再下来,不可以的话,打回去,不执行该敏感指令。

(3)workstation

对于workstation而言——》硬件辅助虚拟化,表现形式在处理器里面有一个虚拟化引擎,可以勾取硬件辅助虚拟化,看到虚拟接口/dev/kvm,可以加强辅助调用,在应用程序需要频繁调用的时候,需要开启。比如openstack。

(4)虚拟化类型

全虚拟化:将物理硬件资源全部通过软件的方式抽象化,最后进行调用

半虚拟化:需要修改操作系统

直通:直接使用物理硬件资源(需要支持,还不完善)

全虚拟化:KVM——》产品vmware—ce

半虚拟化:ESXI——》workststion vsphere

(5)虚拟化功能

在一个操作系统内,模拟多个操作系统

以软件的方式模拟物理设备的功能

二、Docker

    容器基础概念—》六大名称空间

    名称空间:以不同空间划分不同资源

1、Docker是什么

是一种轻量级的“虚拟机”,Docker是一个用于开发,交付和运行应用程序的开放平台。

在Linux容器里运行应用的开源工具——》容器引擎,让开发者可以打包大门的应用及依赖包到一个可移植的镜像中,然后发布到任何流行的linux或者window机器中。

Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。
鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。

Docker的设计宗旨:Build,Ship and Run Any App,Anywhere
即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。

2、为什么要使用docker

把容器化技术做成了标准化平台

    (1) docker引擎统一了基础设施环境——docker环境

    (2)docker引擎统一了程序打包(装箱)方式——docker镜像(把引擎放在镜像中,带着镜像到处跑)

    (3)docker引擎统一了程序部署(运行)方式——docke容器(利用引擎把这个镜像再去运行为之前的相同的一模一样的容器了)

镜像——》封装的一个时刻的服务/应用状态

容器——》应用跑起来的状态(正常提供服务的状态 - 运行时

3、Docker的使用场景

 4、Docker引擎(Docker Engine)

Docker Engine是具有以下主要组件的客户端-服务器(C/S架构)应用程序:

    server端:服务器是一种长期运行的程序,称为守护程序进程( dockerd命令)。

    client端:REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口。

    命令行界面(cLI)客户端((docker命令)。

docker run

docker start

docker rm

5、Docker 三要素(核心组件)

Docker images:镜像:统一的封装方式——》模板

Docker container:容器:统一的运行时环境 ——》基于镜像,运行状态/运行时状态

Docker registry:镜像仓库:放置镜像的仓库——》存放镜像模板

存储镜像的地方,默认在公共的 Docker Hub上查找,可以搞个人仓库。

仓库大类:①公共仓库—》docker hub ②私有仓库registry harbor

 (1)客户端发起各种各样的命令,给与主机

(2)主机会调用镜像,如果有镜像直接用,运行为容器

(3)如果镜像里没有会到registry公共仓库去拉去镜像,拉到本地后再运行为容器

6、Container(Docker)和VM(虚拟化)的区别

特性Container(一个进程控制)VM(完整的操作系统)
启动速度秒级分钟级
运行性能接近原生(直接在内核中运行)50%左右的损失
磁盘占用MBGB
数量成百上千一般十几台
隔离性进程级别系统级别(更彻底)
操作系统主要支持Linux几乎所有系统
封装程度只封装目标代码和依赖关系,共享宿主机内核完整的操作系统,与宿主机隔离

7、名称空间(Namespaces)

Docker使用一种称为namespaces提供容器的隔离工作区的技术。运行容器时,Docker会为该容器创建一组名称空间。

这些名称空间提供了一层隔离。容器的每个方面都在单独的名称空间中运行,并且其访问仅限于该名称空间。

Docker Engine在Linux上使用以下名称空间:

(1)该pid命名空间:进程隔离(PID:进程ID)

(2)该net命名空间:管理网络接口(NET:网络)

(3)该ipc命名空间:管理访问IPC资源(IPC:进程间通信)

(4)该mnt命名空间:管理文件系统挂载点(MNT:mount)、

(5)该uts命名空间:隔离内核和版本标识符。(UTS:Unix时间共享系统)

(6)该user命 名空间:网络设备、网络协议栈、端口等。

8、控制组(Control groups)

Linux上的Docker引擎还依赖于另一种称为控制组(cgroups)的技术。cgroup将应用程序限制为一组特定的资源。控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束。列如,您可以限制特定容器可用的内存。

总结

Docker底层原理核心就是名称空间+控制组

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值