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 ...
随机推荐
- m96-97 lsc nc赛
这一次 lsc 再一次一道题都没AC,看来lsc已经凉了! 出了分,旁边的_LH大喊了一声 “woc,lsc,你真是太垃圾!”...........“好吧!” 我确实很垃圾!(大佬这次都没考,所以我更 ...
- ssm整合的登录
新建一个web工程,主要结构如下: 数据库创建如下: 控制层的代码FormController 类 package codeRose.controller; import org.springfram ...
- php mkdir不能创建文件夹的原因
php mkdir不能创建文件夹的原因 1 权限问题2 open_basedir设置问题 参考方法http://newmiracle.cn/?p=2896
- 推荐Java五大微服务器及其代码示例教程
来源素文宅博客:http://blog.yoodb.com/yoodb/article/detail/1339 微服务越来越多地用于开发领域,因为开发人员致力于创建更大,更复杂的应用程序,这些应用程序 ...
- X-Admin&ABP框架开发-RBAC
在业务系统需求规划过程中,通常对于诸如组织机构.用户和角色等这种基础功能,通常是将这部分功能规划到通用子域中,这也说明了,对于这部分功能来讲,是系统的基石,整个业务体系是建立于这部分基石之上的,当然, ...
- mongodb基本命令,mongodb集群原理分析
mongodb基本命令,mongodb集群原理分析 集合: 1.集合没有固定数据格式. 2. 数据: 时间类型: Date() 当前时间(js时间) new Date() 格林尼治时间(object) ...
- thinkphp6.0 多应用模块下提示控制器不存在
thinkphp6.0 多应用模块下提示控制器不存在 在项目根目录下使用Composer composer require topthink/think-multi-app 参考链接
- hdu 2846 Repository (字典树)
RepositoryTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- 插入订单并且输出订单号的sql存储过程
--插入订单-- create proc InsertOrders ( @OrderNumber varchar(300), @OrderState varchar(30), @OrderType v ...
- sqlcipher的php扩展运行在fast-cgi:php-fpm下工作不正常
今天发现了这样的问题,php-fpm运行sqlcipher时,有些数据库工作正常,有些却不正常. 不正常的,都在日志上报错,也就是php处理异常了. 这个报错发生在执行sql语句时,通常就是sqlci ...