目录
前言
Docker 是在 Linux 容器里运行应用的一种开源工具,是一种轻量级的虚拟机
(1)以linux而言,linux操作系统会有一个主进程pid=1派生出其他进程来控制不同服务
(2)例如: pid=2 ——> python pid=3——>java pid4——>php,三个服务可能会相互影响
(3)使用者期望将这三个不同的服务,跑在不同的运行时环境中实现相互不影响,同时不会增加服务器成本——> 延伸出——>能否将这三种服务分别封装起来——>KVM虚拟化技术,实现了一个操作系统模拟多个操作系统/不同的运行时环境
(4)随着技术发展——>虚拟化技术开销较大(例如:只 要运行一个py脚本,想要使用虚拟化方式实现,还需要安装一个操作系统,并不方便/合理)——>延伸出容器技术
(5)虚拟化层的抽象层(用户层)剥离,使用docker engine来替代(来宾操作系统去除),只要通过引擎就可以直接连接到宿主机操作系统中,极大减小了开销
一、虚拟化概述
虚拟化:将应用程序和系统内核资源进行解耦,以操作系统级别进行隔离,目的是提高资源利用率
1.虚拟化三种模式
全虚拟化:将物理硬件资源全部通过软件的方式抽象化,最后进行调用
- 使用的方法:使用hypervisor(VMM)软件,其原理是在底层硬件和服务器之间建立一个抽象层,而基于核心的虚拟机是面向Linux系统的开源产品hypervisor(VMM)可以捕捉CPU的指令
半虚拟化(软、硬件结合的方式):需要修改操作系统
直通(以全硬件的方式实现虚拟化的功能):直接使用物理硬件资源(需要设备支持,还不完善)
2.虚拟化功能
- 在一个操作系统内,模拟多个操作系统
- 以软件的方式模拟物理设备的功能
3.三个层面
- 操作系统层
- 抽象层
- 内核层
二、KVM简介
1、广义KVM
- KVM (Kernel-based vritual Machine)——基于内核的虚拟机
- KVM是基于虚拟化扩展的X86硬件的开源Linux原生的全虚拟化方案(要求cpu支持Intel-vT-x或AMD-V)
- KVM内嵌于内核模块中,模拟处理器和内存以支持虚拟机运行
- 虚拟机被实现为常规的Linux进程,由标准Linux调度程序进行调度;虚拟机的每个虚拟CPU被实现为一个常规的Linux进程。这使得KMV能够使用Linux内核的已有功能但KVM本身不执行任何模拟。
- 需要客户空间程序(虚拟机)通过/dev/kvm (此虚拟设备需要开起硬件辅助虚拟化才能看到)接口设置一个客户机虚拟服务器的地址空间,并且由Qemu模拟I/O (ioctl)进行调度资源和维护管理
- Libvirt:KVM的管理工具,除了可以管理KM这类VMM,还可以管理xen,VirtualBox,甚至Openstack底层
- Libvirt包含3个组件:后台daemon程序libvirtd、 API库、命令行工具virsh
2、KVM架构及原理
2.1 KVM虚拟化架构/三种模式
客户机在操作系统中运行的模式,客户机分为内核模式和用户模式,作用如下:
(1)客户模式:
为用户提供虚拟机管理的用户空间工具以及代表用户执行I/O,Qemu_ 工作在此模式下(Qemu的主要功能)
(2)linux内核模式:
模拟CPU、内存,实现客户模式切换,处理从客户模式的推出,KVM即运行在此模式下
2.2 KVM工作原理
- Guest: 客户机系统,包括CPU (vCPU) 、内存驱动(Console、 网卡、I/O设备驱动等),被KVM置于-种受限制的CPU 模式下运行。
- KVM内核模块模拟处理器和内存以支持虚拟机运行
- Qemu 主要处理I/O以及为客户提供一个用户空间/dev/kvm 工具ibvirt来进行虚拟机管理
- ioctl (定义) 专用于设备输入输出操作的系统调用
- libvirt: KVM管理工具
以上构成一个完整的虚拟化平台
简单理解:
- KVM驱动提供处理器、内存的虚拟化,以及客户机I/O的拦截,guest的I/O被拦截后,交由Qemu处理
- Qemu利用接口libkvm调用(ioctl) 虚拟机设备接口/dev/kvm来分配资源、管理、维护虚拟机
3、KVM工作流程
- 用户模式的Qemu利用接口libkvm通过ioctl系统调用进入内核模式。
- KVM驱动为虚拟机创建 虚拟CPU和虚拟内存,
- 然后执行VMLAU.NCH指令进入客户模式,装载Guest OS并运行。
- Guest OS运行过程中如果发生异常,则暂停Guest OS的运行并保存当前状态同时退出到内核模式来处理这些异常。
- 内核模式处理这些异常时如果不需要I/O则处理完成后重新进入客户模式。如果需要I/O则进入到用户模式,则由Qemu来处理I/O,处理完成后进入内核模式,再进入客户模式
4、KVM各核心组件功能
QEMU
- 功能:控制I/O虚拟化,调用硬件资源
KVM
- 功能:为虚拟机提供CPU、内存(硬件资源)的虚拟化
三、Docker容器概述
名称空间:以不同空间划分不同资源
1.六大名称空间
namespace资源隔离——用容器技术封装
mount | 文件系统,挂载点——>一个文件系统内,不能重复挂载一个指定目录 | |||
user | 操作进程的用户和用户组 | |||
pid | 进程编号 | |||
uts | 主机名和主机域 | |||
ipc | 信号量、消息队列、共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间) | |||
net | 网络设备、网络协议栈、端口等 |
ipc:把内存资源划分开来,给不同的进程去用,每个应用的进程会给它分配一块资源,它只能用自己的(进程级别隔离)
net:网络资源
2.Docker和虚拟化的区别
小而灵活,效率至上!
特性 | Docker 容器 | 虚拟机虚拟化 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
运行性能 | 接近原生(直接在内核中运行)10%-20% | 50%左右损失 |
磁盘占用 | 50-100MB | 3-5G |
数量 | 成百上千,每个进程可控制一个容器 | 几十个 |
隔离性 | 进程级别 | 操作系统(更彻底) |
操作系统 | 主要支持Linux | 几乎所有 |
封装程度 | 只封装目标代码和依赖关系,共享宿主机内核 | 完整的操作系统,与宿主机隔离 |
容器是依赖于内核来隔离,彼此的关系像共享一样,所以安全性较之虚拟机差一些,毕竟不是完全隔离。所以若一个容器被黑客攻破,宿主机基本也就没了~
这里也不是完全没有办法,那就是 cgroup 资源分配,其能提供一定的安全机制
Docker 拥有的众多优势与操作系统虚拟化的特点是分不开的:
- 传统虚拟机需要有额外的虚拟机管理程序和虚拟机操作系统层
- 而 Docker 容器是直接再操作系统层面之上实现的虚拟化
3.使用docker有什么意义
①相同版本的docker引擎
②打包成镜像包,拖到另一个操作系统中(把引擎放在镜像中,带着镜像到处跑)
③利用引擎把这个镜像再去运行为之前的相同的一模一样的容器了
镜像——>封装的某一时刻的服务/应用状态
容器——>应用跑起来的状态(正常提供服务的状态—运行时running)
4、应用场景
-
打包应用程序简单部署
-
可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦)例如:需要把服务器从腾讯云迁移到阿里云,如果采用的是 Docker 容器技术,整个迁移的过程只需要在新的服务器上启动我们需要的容器就可以了
四、docker的核心概念
1.镜像(Image)
docker镜像是创建容器的基础,类似于虚拟机的快照
- 可以理解为是一个面向 Docker 容器引擎的只读模板,比如:
- 一个镜像可以是一个完整的 CentOS 操作系统环境,称之为一个 CentOS 镜像
- 一个安装了 MySQL 的应用程序,称之为是一个 MySQL 镜像
- …
- Docker 提供了简单的机制来创建和更新现有的镜像,用户也可以从网上下载已经做好的应用镜像来直接使用
2.容器(Container)
Docker 的【容器】是【从镜像创建的运行实例】,它可以被【启动、停止和删除】,容器即服务
- 创建的每一个容器都是相互隔离、互不可见的,相互之间隔离性超强,从而保证平台的安全性
- 可以把容器看做是一个简易版本的 Linux 环境,Docker 可以利用容器来运行和隔离一个个应用
3.仓库(Repository)
Docker 仓库时用来集中保存镜像的地方
- 创建完自己的镜像后,可以使用【push】命令将其上传至【公共仓库(public)】或【私有仓库(Private)】
- 之后,在另一台机器上使用这个镜像,直接【pull】下来就可以了
仓库注册服务器【Registry】是存放仓库的地方,其中包含了多个仓库,每个仓库存放某一类镜像,并使用不同的标签【tag】来区分它们
目前最大的公共仓库是【Docker Hub】
总结
镜像(镜像的压缩包)
容器(实例,通过镜像创建)
仓库(存放镜像的地方)
公有仓库:Docker官方仓库
私有仓库:个人化、私有化的仓库
Docker是容器管理工具,容器由镜像创建而来,镜像从仓库中获取而来,仓库分为公有、私有
1.docker run hello-world
run指令 运行
①检测本地有没有该镜像(没有的话直接到docker hub上下载)
②create(将镜像创建为容器)+start将创建好的容器运行起来
小结:Dcoker是基于容器技术的轻量级虚拟化解决方案
低层原理:docker是容器引擎,把linux的cgroup、 namespaces 等容器底层技术进行完美的封装、并抽象为用户提供创建和管理容器的便捷界面(命令行C1i、api等) C/S
2.docker有哪些优势? 和虚拟化比有什么优势?
-
docker把容器化技术做成了标准化平台CAAS(docker 统一/指定了容器化技术的标准化平台)
①使用docker有什么意义(实现了3个统一)使用docker有什么意义(实现了3个统一)
②docker引擎统一了基础设施环境-docker环境——>image——>封装一一个简易的操作系统(3.0+G)
③docker引擎统一了 程序打包(装箱/封装-类比于集装箱)方式-docker镜像——>images
④docker引擎统—了程序部署(运行)方式-docker容器——>基于镜像——>运行为容器(可运行的环境) -
实现了一次构建、多次、多处使用
3.如何把多个目录挂载到同一个目录下?
(存储引擎)overlay2(现在使用) 和 (存储引擎) aufs(早期使用)叠加
4.docker原理
docker namespace实现的是资源隔离,cgroup实现的是资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配200g并不是实际占用物理磁盘200g)
5.什么是容器
容器其实是一种沙盒技术。顾名思义,沙盒就是能够像一个集装箱一样,把你的应用“装”起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去,这不就是 PaaS 最理想的状态嘛
6.KVM工作原理
- 【1】QEMU:负责抽象化I/O资源
- 【2】KVM:内置在内核中,负责对实际物力资源进行抽象/逻辑分割
- 【3】QEMU:会借助libvirt工具对内核中(KVM逻辑分割的资源进行调用)
- 【4】然后。将资源传输至VM