Docker虚拟化之<基础理论>
1.虚拟化技术的概念
(1)虚拟化技术主要是将物理的资源转变为逻辑上可以管理的资源,以打破物理结构上的壁垒,让计算元件运行在虚拟的基础上,而不是真实的物理资源上。
(2)虚拟化技术的底层是要进行虚拟化的 物理机硬件设备,通过虚拟化技术软件,可以将物理机虚拟生成N台虚拟机;应用程序、软件服务都可运行在虚拟机上,而不是直接运行在物理机设备上。
2.虚拟化技术的意义
(1)虚拟化技术主要是为了最大化的利用高配物理机的资源,提高资源的利用率,降低企业硬件成本、维护和管理成本。
(2)淘汰老旧服务器资源,对老旧服务器资源进行重组重用。
(3)加快企业服务器资源高效的管理和自动化运维的进程。
例:企业生产环境,要求部署100个nginx服务,要求nginx服务独立部署,用户可以独立访问,可以使用如下方案:
1)采购100台硬件服务器,标准配置(4C8G100GB),每台服务器部署1个nginx服务;
2)采购10台高配硬件服务器,每台硬件服务器虚拟10台虚拟机(4C8G100GB),每个虚拟机服务部署一个nginx服务。
注:从费用成本、维护成本考虑,应选择第二种方案。
3.目前主流的虚拟化技术
(1)KVM
(2)VMware ESXI
(3)XEN
(4)VirtualBox
(5)Open-vz
(6)Hper-v
(7)Docker
4.虚拟化技术的种类
(1)完全虚拟化技术:实际上是通过软件实现对操作系统的资源再分配,比较成熟。例如:KVM、VirtualBox
(2)半虚拟化技术:通过代码修改已有的系统,形成一种新的可虚拟化的系统,调用硬件资源去安装多个操作系统,整体速度相对快一些。例如:Xen
(3)轻量级虚拟化技术:介于完全虚拟化和半虚拟化之间。例如:Docker虚拟化
5.docker虚拟化简介
(1)Docker是一个开源的应用容器引擎,让开发者可以打包他们的 应用以及依赖包 到一个可移植的容器中,然后发布到任何流行的Linux机器上。
(2)容器时完全使用沙箱机制,相互之间不会有任何接口;几乎没有性能开销,可以很容易地在机器和数据中心中运行;不依赖任何语言、框架、系统。
(3)Docker的基础是Linux容器(LXC),在LXC的基础上Docker进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。
(4)用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单。
6.Docker虚拟化和传统虚拟化的不同
(1)Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统。
(2)传统虚拟化则是在硬件的基础上,虚拟出自己的系统,然后在系统上部署相关的应用。
7.镜像、容器、仓库
(1)镜像:Docker镜像跟Linux ISO镜像类似,主要是存储各种应用程序、软件服务、各种数据等。Docker镜像内容是只读的,不能被修改。
(2)容器:Docker容器是基于Docker镜像运行之后的实例,类似进程和程序的关系。Docker容器是可读、可写的,但不能直接修改镜像的数据内容,镜像是持续为容器提供服务,没有镜像就没有容器。
(3)仓库:存放镜像的地方,分为公共仓库和私有仓库。企业测试、生产环境 推荐自建私有仓库,安全、稳定、高效。
8.Docker的Linux容器(LXC)和CGroup
(1)CGroup在最底层落实资源管理,LXC在CGroup上封装了一层,Docker又在LXC上封装了一次。
(2)CGroup是control groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组所使用的物理资源的机制。
(3)没有CGroup就没有LXC,也就没有Docker。
(4)LXC可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制 以及全虚拟化的其他复杂性。
(5)LXC有效地将 由单个操作系统管理的资源 划分到孤立的组中,以更好地在孤立的组之间 平衡有冲突的资源使用需求。
(6)LXC建立在CGroup基础上,LXC=CGroup+namespace+Chroot+veth+用户态控制脚本。
(7)LXC利用内核的新特性(CGroup)来提供用户空间的对象,用来保证资源的隔离和对于应用或者系统的资源控制。
注1:典型的Linux系统由bootfs和rootfs两部分组成。
(1)bootfs(boot file system)主要包含bootloader和kernel;bootloader主要是引导加载kernel,当kernel被加载到内存中后,bootfs就被卸载(umount)。
(2)rootfs(root file system)包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等目录和文件。
注2:
(1)Docker容器的文件系统最早建立在AUFS基础上。
(2)AUFS(another union file system),是一种Union FS,支持将不同的目录挂载到同一个虚拟文件系统下,并实现一种层(layer)的概念。
(3)由于AUFS未能加入到Linux内核,因考虑兼容性问题,加入了DeviceMapper的支持。Docker目前默认运行在DeviceMapper基础上。
注3:
(1)AUFS将挂载到同一虚拟文件系统下的多个目录分别设置成read-only、read-write、whiteout-able权限。
(2)对read-only目录只能读,而写操作只能实施在read-write目录中。
(3)写操作是在read-only上的一种增量操作,不影响read-write目录。当挂载目录的时候,要严格按照各目录之间的这种增量关系,将被增量操作的目录优先于 在他基础上增量操作的 目录挂载,待所有目录挂载结束,继续挂载一个read-write目录,如此形成一种层次结构。
注4:
(1)传统的Linux加载bootfs时,会先将rootfs设为read-only,然后在系统自检之后将rootfs从read-only改为read-write,然后就可以在rootfs上进行写和读的操作。
(2)Docker的镜像却不想上述那样,它在bootfs自检完毕之后并不会把rootfs的read-only改为read-write。而是利用union mount(UnionFS的一种挂载机制) 将一个或多个read-only的rootfs加载到之前的read-only的rootfs层之上。
(3)在加载了多层的rootfs之后,仍然让它看起来只像一个文件系统,在Docker的体系里,把union mount的这些read-only的rootfs叫做 Docker的镜像。但此时的每一层rootfs都是read-only的,还不能对其进行操作。
(4)当创建一个容器,也就是将Docker镜像进行实例化,系统会在一层或是多层read-only的rootfs之上分配一层空的read-write的rootfs。
9.Device Mapper
(1)Device Mapper是Linux2.6内核中支持逻辑卷管理的通用设备映射机制,它为实现 用于存储资源管理的 块设备驱动 提供一个高度模块化的内核架构。
(2)在内核中,它通过一个一个模块化的target driver插件实现对IO请求的过滤或者重定向等工作。
(3)当前已经实现的target driver(目标驱动程序)插件包括:raid、软加密、逻辑卷条带、多路径、镜像、快照等。途中linear、mirror、snapshot、multipath表示的就是这些目标驱动程序。
(4)Device Mapper进一步体现了Linux内核涉及中 策略和机制分离的原则,将所有与策略相关的工作放到用户空间完成,内核中主要提供完成这些策略所需要的机制。
注:
(1)Device Mapper用户空间相关部分,主要负责配置具体的策略和控制逻辑,比如逻辑设备和哪些物理设备建立映射,怎么建立这些映射关系等。
(2)具体过滤和重定向IO请求的工作由内核中相关代码完成。
(3)因此,整个Device Mapper机制由两部分组成:内核空间的Device Mapper驱动、用户空间的Device Mapper库以及它提供的dmsetup工具。
10.Docker虚拟化的特点
(1)操作启动快
- 运行时的性能可以获取极大提升,管理操作(启动、停止、重启等)都是以秒或毫秒为单位。
(2)轻量级虚拟化
- 仅需添加或减小镜像,就可以获得足够的“操作系统”。只要配置够高,一台服务器上可以虚拟出100台以上的容器。
(3)开源免费
- 开源免费,成本低。由现代Linux内核支持并驱动。
(4)前景及云支持
- 正越来越受欢迎,各大主流公司都在推动Docker的发展,性能有很大的优势。
(5)跟传统VM比较,具有以下缺点
- 目前知道的人比较少;
- 相关的中文技术资料欠缺;
- Go语言还未完全成熟;
11.Docker的优势
(1)交付和部署更快速
- Docker允许开发者在装有应用和服务的本地容器做开发。可以直接集成到可持续开发流程中。
- 开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。
- Docker可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。
- 启动时间是秒级的,大量节约开发、测试、部署的时间。
(2)部署和扩容更高效
- Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序 从一个平台直接迁移到另一个平台。
- Docker的兼容性和轻量特性可以很轻松的实现负载的动态管理。你可以快速扩容 或 下线你的应用和服务。
(3)资源利用率更高
- 一台主机上可以同时运行数千个Docker容器。
- 容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高。
- 传统虚拟机方式运行10个不同的应用就要启动10个虚拟机,而Docker只需启动10个隔离的应用即可。
(4)管理更方便
- 使用Docker,只需小小的修改,就可以替代以往大量的更新工作。
- 所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
12.Docker引擎架构
(1)Docker引擎是一个C/S结构的应用 。
(2)server是一个常驻进程。
(3)REST API实现了client和server间的交互协议。
(4)CLI实现容器和镜像的管理,为用户提供统一的操作界面。
(5)Client通过接口 与 Server进程通信,实现容器的构建、运行和发布。
(6)Client和Server可以运行在同一台集群,也可以通过跨主机实现远程通信。
13.Docker镜像原理
(1)一个完整的Docker镜像可以支撑一个Docker容器的运行;在Docker容器运行的过程中,主要提供文件系统数据支撑。
(2)Docker镜像有以下特性
- 镜像分层,每个镜像都由一个或多个镜像层组成。
- 可以通过在某个镜像上 加一定的镜像层 得到新镜像。(此过程可以通过编写dockerfile 或 基于容器commit实现)
- 每个镜像层都拥有唯一镜像ID。
- 镜像在存储和使用时,会根据ID共享相同的镜像层,所以在pull镜像时,已有的镜像层会自动跳过下载。
- 每个镜像层都是只读,即使启动成容器,也无法对其真正的修改,修改只会作用于最上层的容器层。
(3)Docker容器,可以理解为一个或多个运行进程,这些运行进程占有相应的内存、CPU、虚拟网络设备、文件系统 等资源。
(4)Docker容器所占用的文件系统资源,通过Docker镜像的镜像层文件来提供。
(5)Docker可以通过解析Docker镜像的json文件,获知应该在这个镜像之上运行什么样的进程,应该为进程配置怎么样的环境变量,Docker守护进程实现了静态向动态的转变。
Docker虚拟化之<基础理论>的更多相关文章
- XP+devOps开发模式与scrum敏捷开发对比,docker虚拟化
XP+devOps开发模式与scrum敏捷开发对比,docker虚拟化 我们现在用的就是典型的XP+devOps模式,已经放弃scrum了 现在还很多公司弄docker虚拟化docker非常复杂,当然 ...
- Docker虚拟化平台
1.虚拟化技术的概念 1)虚拟化就是把物理资源转变为逻辑上可以管理的资源,以打破物理结构间的壁垒,让计算机的元件运行在虚拟的基础上,而不是真实的物理设备: 2)虚拟化技术可以将物理机硬件资源虚拟生成单 ...
- Docker虚拟化实战学习——基础篇(转)
Docker虚拟化实战学习——基础篇 2018年05月26日 02:17:24 北纬34度停留 阅读数:773更多 个人分类: Docker Docker虚拟化实战和企业案例演练 深入剖析虚拟化技 ...
- Docker虚拟化
1. Docker虚拟化特点 跟传统VM比较具有如下优点: 操作启动快 运行时的性能可以获取极大提升,管理操作(启动,停止,开始,重启等等) 都是以秒或毫秒为单位的. 轻量级虚拟化 你会拥有足够的“操 ...
- 1、Docker部署及基础理论
1.Docker入门简介 Docker技术类似码头上看到的集装箱,最早集装箱没有出现的时候,码头上有许多搬运的工人在搬运货物,有了集装箱以后,搬运货物变得简单,通过集装箱的搬运模式更加单一.高效,将货 ...
- docker虚拟化平台构建
docker虚拟化平台构建 从1.13版本以后的docker软件分为连个版本:企业版.社区版,在企业中推荐社区版本. 构建docker平台环境,系统选择centos7.x,推荐linux内核3.10 ...
- Linux运维之docker虚拟化部署nginx
一.Docker的概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱 ...
- 基于docker虚拟化创建hadoop集群
最近想用hadoop做一个测试,与性能无关的测试,但是可与屌丝的命,手头没有太多机器,也租不起云主机.这里使用docker进行虚拟化,并搭建hadoop集群,在这里将过程记录如下. 首先安装docke ...
- Docker虚拟化容器的使用
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Li ...
随机推荐
- c#中关于string的特性介绍以及注意事项
前言 string类型在我们实际项目开发中是一个最使用的类型,string是一个引用类型这一点大家都知道,但是在实际使用过程中,大家会发现string和我们常见的引用类型使用还真不一样,看下面的一个简 ...
- CVE-2019-17671:Wordpress未授权访问漏洞复现
0x00 简介 WordPress是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的,用户可以在支持 PHP 和 MySQL数据库的服务器上使用自己的博客 ...
- C函数库stdio.h概况
库变量 size_t 这是无符号整数类型,它是 sizeof 关键字的结果. FILE 这是一个适合存储文件流信息的对象类型. fpos_t 这是一个适合存储文件中任何位置的对象类 ...
- 说说Java中你不知道switch关键字
Switch语法 switch作为Java内置关键字,却在项目中真正使用的比较少.关于switch,还是有那么一些奥秘的. 要什么switch,我有if-else 确实,项目中使用switch比较少的 ...
- [考试反思]0729NOIP模拟测试10
安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...
- java架构之路-(NoSql专题)MongoDB快速上手
NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL".在现代的计算系统上每天网络上都会产生庞大的数据量.这些数据有很大一部分是由关系数据库管理系统(RD ...
- 原生JS实现call,apply,bind函数
1. 前言 使用原生JS实现call和apply函数,充分了解其内部原理.call和apply都是为了解决改变this的指向.作用都相同,只是传参的方式不同.除了第一个参数外,call可以接受一个参数 ...
- 安利一个绘制指引线的JS库leader-line
前言 之前看到一篇推荐Magi这个搜索引擎的新闻,对于这个搜索引擎是否好用咱们不予置评,但是我在这个搜索引擎上面发现了一个好玩的前端功能. 如上图,将鼠标浮动到学习来源上时,会展示一堆指引线. 本博客 ...
- Docker 开篇 1 | 树莓派中搭建Docker
官网三种安装方式,故不再赘述 大部分内容可参考官网链接:https://docs.docker.com/install/linux/docker-ce/debian/#install-docker-c ...
- Chrome Extension 小试牛刀
自从有了Chrome以后,就喜欢上了这个浏览器,从此IE 886了. 以前作爬虫,做登录,做数据采集,做数据处理等各种功能,后来H5出来后,出现了,除了Session/Cookie 出了Local S ...