虚拟化与Docker

时间:2022-10-14 08:02:11


前言

在Linux中,Linux操作系统会有一个进程PID=1派出其他进程来控制不同服务,多个服务可能会互相影响,使用者期望将这三个不同的服务,跑在不同的运行环境中实现相互不影响,同时不会增加服务器成本

  • 延伸出——>能否将这三种服务分别封装起来——>KVM虚拟化技术,实现了一个操作系统模拟多个操作系统/不同的运行时环境
  • 随着技术发展——>虚拟化技术前期开销较大
    ——>延伸出容器技术
    虚拟化层的抽象层(用户层)剥离,使用docker engine来替代(来bin操作系统去除),只要通过引擎就可以直接连接到宿主机操作系统中,极大减小了开销。

虚拟化简介

通过虚拟化技术将一台计算机虚拟为多台逻辑计算机,在一台计算机上同时运行多个逻辑计算机,同时每个逻辑计算机可运行不同的操作系统,应用程序都可以在相互独立的空间内运行而互相不影响,从而提高计算机的工作效率。

  • 在一个操作系统中(win10)模拟多个操作系统(centos、win10、suse),同时每个操作系统可以跑不同的服务(nginx+tomcat),从而实现一台宿主机搭建一个集群(从整体)。
  • 通过软件/应用程序的方式,来实现物理硬件的功能。例如ensp,以软件形式实现物理设备的功能(二层交换机、路由器、三层交换机等)。

1、虚拟化概述

虚拟化:将应用程序和系统内核资源进行解耦,以操作系统级别进行隔离,目的是提高资源利用率

2、耦合与解耦合

耦合性是程序结构各个模块之间相互关联的度量,它取决于各个模块之间的接口 复杂程度,调用模块的方式以及哪些信息通过接口。

1.耦合

1、耦合是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影响以至联合起来的现象
2、对象之间的耦合度就是对象之间的依赖性
3、对象之间的耦合越高,维护成本越高

2.解耦合

1、字面意思就是解除耦合关系
2、在软件工程中,降低耦合度即可以理解为解耦,模块间有依赖关系必然存在耦合,理论上的绝对零耦合是做不到的,但是可用通过一些现有的方式将耦合度降至最低。

设计的核心思想
尽可能减少代码耦合,如果发现代码耦合,就要采取解耦技术。让数据模型,业务逻辑和视图显示三层之间彼此降低耦合,把关联依赖降到最低,而不至于牵一发而动全身。原则就是A功能的代码不要写在B的功能代码中,如果两者之间需要交互,可以通过接口,通过消息,甚至可以引入框架,但总之就是不要直接交叉写。

虚拟化的作用

缓解/解决了资源利用率的问题
物理硬件的性能就会比虚拟化的性能高,在极度吃资源的情况下,例如mysql高并发这种,就不适合用虚拟化。

虚拟化工作原理

虚拟化与Docker
KVM + QEMU
KVM:负责将当前宿主机的一些硬件资源,进行虚拟化处理
QEMU:调用内核的逻辑分割后的资源对象、给与VM(虚拟机)、传递交互指令

虚拟化类型

1、全虚拟化:将物理硬件资源全部通过软件的方式抽象化,最后进行调用
2、半虚拟化:需要修改操作系统
3、直通:直接使用物理硬件资源(需要支持,还不完善)

虚拟化功能

在一个操作系统内,模拟多个操作系统
以软件的方式模拟物理设备的功能

Docker概述

Docker是一个用于开发,交付和运行的应用程序的开放平台。Docker可以将应用程序与基础架构分开,从而可以快速交付软件。是一个开源的应用容器引擎,让开发者可以打包应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或者Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,互相之间不会有任何接口,沙箱(Sandbox)在计算机安全领域,沙箱是一种程序的隔离运行机制。

  • docker是一个开源的应用容器引擎,基go语言开发并遵循了apache2.0协议开源
  • docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”
  • docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级,可移植的,自给自足的容器。

Docker优点

1、灵活:即使是最复杂的应用也可以集装箱化
2、轻量级:容器利用并共享主机内核
3、可互换:可以即时部署更新和升级
4、便携性:可以在本地构建,部署到云,并在任何地方运行
5、可扩展:可以增加并自动分发容器副本
6、可堆叠:可以垂直和即时堆叠服务
容器是在linux上本机运行的,并与其他容器共享主机的内核,它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。
虚拟机运行是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。
虚拟化与Docker
Docker从一开始就以提供标准化的运行时环境为目标,真正做到"Build,Ship and Run any APP,Angwhere",可以将同一个构建版本用于开发、测试、预发布、生产等任何环境,并且做到了与底层操作系统的解耦。在此基础上还进一步发展出了Caas (容器即服务)技术。

Docker与KVM(虚拟机)的区别

隔离与共享

虚拟机通过添加Hypervisor层(虚拟化中间层),虚拟出网卡、内存、CPU等虚拟硬件,再在其上建立虚拟机,每个虚拟机都有自己的系统内核。而Docker容器则是通过隔离(namesapce)的方式,将文件系统、进程、设备、网络等资源进行隔离,再对权限、CPU资源等进行控制(cgroup),最终让容器之间互不影响,容器无法影响宿主机。

容器与宿主机共享内核、文件系统、硬件等资源。

性能与损耗

与虚拟机相比,容器资源损耗要少。
同样的宿主机下,能够建立容器的数量要比虚拟机多
但是,虚拟机的安全性要比容器稍好,要从虚拟机攻破到宿主机或其他虚拟机,需要先攻破 Hypervisor层,这是极其困难的
而docker容器与宿主机共享内核、文件系统等资源,更有可能对其他容器、宿主机产生影响。

不同点 Docker容器 虚拟机
启动速度 快,几秒钟 慢,几分钟
运行性能 接近原生(直接在内核中运行) 运行于Hypervisor上,50%左右损失
磁盘占用 小,甚至几十KB(根据镜像层的情况) 非常大,上GB
并发性 一台宿主机可以启动成百上千个容器 最多几十个虚拟机
隔离性 进程级别 资源隔离/限制
操作系统 主要支持Linux 主要支持Linux
封装程度 只打包项目代码和依赖关系,共享宿主机内核 完整的操作系统,与宿主机隔离

使用Docker的意义

docker引擎统一了基础设施环境-docker容器环境(引擎)
docker引擎统一了程序打包(装箱)方式-docker镜像
docker引擎统一了程序部署(运行)方式-docker容器
镜像 封装的某个时刻的服务/应用状态
容器 应用跑起来的状态(正常提供服务的状态-运行时)
实现了一次构建,多次,多处使用。

Docker的使用场景

打包应用程序简单部署
可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦),例如:服务器从腾讯云迁移到阿里云
持续集成和持续交付(CI/CD):开发到测试发布
部署微服务
提供PAAS产品(平台即服务)(OpenStack的云主机类似于阿里云的ECS,属于IAAS、Docker(K8S)属于PAAS)

Docker引擎(Docker Engine)

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

  • server端:服务器是一种长期运行的程序,称为守护程序进程( dockerd命令)。
  • client端:REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口。
  • 命令行界面(cLI)客户端((docker命令)。
docker run

docker start

docker rm

虚拟化与Docker

Docker的架构(Docker architecture)

  • Docker使用客户端-服务端(C/S)架构。Docker客户端与Docker守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。
  • Docker区别于传统的虚拟化,不需要虚拟硬件资源,直接使用容器引擎,所以速度快。
  • Docker daemon:守护进程
  • Docker守护程序(dockerd)侦听Docker API请求并管理Docker对象。例如图像、容器、网络和卷,守护程序还可以与其他守护程序通信以管理Docker服务。

Docker体系架构

Docker客户端 - Docker
docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。

Docker服务端-Docker Daemon资源限制
docker服务端是一个服务进程,管理着所有的容器。

Docker镜像一Imagefont>
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker容器引擎的只读模板。通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码。运行时间,库,环境变量,和配置文件

Docker容器-Docker Container
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。

Docker镜像仓库-- Registryfont>
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓

Docker的镜像、容器、日志等内容全部都默认存储在/var/lib/docker目录下。

Docker 三要素(核心组件)

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

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

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

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

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

Docker运行流程

虚拟化与Docker
工作流程

  • 客户端发起各种各样的命令,给与主机
  • 主机会调用镜像,如果有镜像直接用,运行为容器
  • 如果镜像里没有会到registry公共仓库去拉去镜像,拉到本地后再运行为容器

Linux 的namespace (命名空间)

namespace 系统调用参数 隔离内容
utc CLONE_NEWUTS 主机名和主机域 (同一个环境里不能又叫node1又叫node2)
ipc CLONE_NEWWIPS 信号量、消息队列、共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间)
pid CLONE_NEWPID 进程编号
network CLONE_NEWNET 网络设备、网络协议栈(在同一个网络名称空间中的网络规则)、端口等
mount CLONE_NEWNS 文件系统,挂载点——>一个文件系统内,不能重复挂载一个指定目录
user CLONE_NEWUSER 用户和用户组(3.8以后的内核才支持)

控制组—cgroups(Control groups)

六种名称空间是由cgroups管理的
最后一种centos的cgroups管理版本是3.8版本,3.6和3.5用不了

cgroups 管理linux内核态中资源管理的模块
cgroups 管理一些系统资源
不是docker原生的。