Docker基础

一、Docker开源

Docker是由Go语言实现的容器引擎,最初由dotCloud公司在2013年开源。

由于Docker带来的巨大的便利,让很多开发、测试和运维等软件开发环节上的工作被简化甚至省去,所以在短短的几年间便成为虚拟化乃至整个技术领域的热词。同时,许多开发者以及大型科技企业都参与到了Docker相关领域的贡献中,为Docker及其生态圈贡献了许多优秀的软件项目,大大提高了Docker生态的完整性。所以dotCloud将公司名字改成Docker Inc专门从事Docker相关的工作,并且为了更好的进行商业运作,Docker Inc将Docker开源项目的名称修改为了Moby

二、Docker引起的改变

A、云计算

对于简单的应用,All-In-One部署到一台服务器即可;但是随着应用服务的发展,应用程序的功能越来越丰富,而需要迭代的速度要求也越来越高,为了实现这些目标,应用的开发逐渐趋向服务化甚至微服务化。

但是每个应用程序都有其对应依赖的环境,而在将应用程序细分为不同的微服务或者是其他形式的微小应用模块后,解决这种环境依赖问题会愈发显得棘手。有的应用运行环境特别复杂,搭建过程也极易出错,都是让开发、测试、运维人员焦头烂额的地方。更多时候,开发者更愿意将他们宝贵的时间用在实际的开发中,而不是纠缠着应用运行环境的问题上。

这些变化都对应用的开发、部署带来了不小的挑战。通过虚拟化技术可以让环境的搭建变得更加的容易,对快速部署分布式应用服务体系提供了极大的便利。

B、效率提升

基于云计算,使用轻量级虚拟化,容器是效率提升的最佳选项,Docker的全面性和易用性都非常适合。

看看即可,图片来自Docker官方

三、Docker技术实现

Docker的实现,主要归结于三大技术:命名空间(Namespaces) 、控制组(Control Groups)和联合文件系统(Union File System)。

A、Namespace

Namespace是Linux内核在2.4版本后逐渐引入的一项用于运行隔离的模块。

编程语言中,命名空间主要目的是为了集合相同模块的类,区分不同模块间的同名类。Linux内核的命名空间,就是能够将计算机资源进行切割划分,形成各自独立的空间。

从实现而言,Linux Namespaces可以分为很多具体的子系统,在内核分别对资源进行隔离。UTS、Mount、IPC、PID、Net、User,通过系统调用对外暴露接口。

通过PID Namespace,可以造就一个独立的进程运行空间,在其中进程的编号又会从1开始。在这个空间中运行的进程,完全感知不到外界系统中的其他进程或是其他进程命名空间中运行的进程。

利用PID Namespace,Docker实现容器中隔离程序运行中进程隔离。

B、Control Groups

资源控制组(CGroups)是Linux内核在2.6版本后逐渐引入的一项对计算机资源控制的模块。

资源控制组的作用是控制计算机资源。与以隔离进程、网络、文件系统等虚拟资源为目的Namespace不同,CGroups主要做的是硬件资源的隔离,除了制造出虚拟的环境隔离同一物理平台运行的不同程序之外,另一大作用就是控制硬件资源的分配

通过CGroups,可以指定任意一个隔离环境对任意资源的占用值或占用率,这对于很多分布式使用场景来说是非常有用的功能。

例如,在服务器上部署一个业务服务和一个健康监控服务。通常情况下,监控服务只会占用很少的计算机资源,但无法保证其不会因为一些逻辑问题产生Bug进而过分消耗计算机资源。而它申请的计算机资源越多,意味着业务服务所能使用的计算机资源也就越少,最后甚至可能造成物理服务器的崩溃。

上述的问题在没有隔离实现的普通运行环境下是比较难解决的,因为所有不从系统层面出发的限制程序资源使用的方式都并不完全有效。由于CGroups实现于操作系统,而操作系统垄断着系统资源的分配,所以其完全能够限制隔离环境下应用的资源占有量。

C、Union File System

联合文件系统(Union File System)是一种能够同时挂载不同实际文件或文件夹到同一目录,形成一种联合文件结构的文件系统。联合文件系统本身与虚拟化并无太大的关系,但Docker却创新的将其引入到容器实现中,用它解决虚拟环境对文件系统占用过量,实现虚拟环境快速启停等问题。

在Docker中,提供了一种对UnionFS的改进实现,也就是AUFS(Advanced Union File System)。

AUFS将文件的更新挂载到老的文件之上,而不去修改那些不更新的内容,这就意味着即使虚拟的文件系统被反复修改,也能保证对真实文件系统的空间占用保持一个较低水平。

上述过程类似,在Git中每进行一次提交,Git并不是将所有的内容打包成一个版本,而只是将修改的部分进行记录,这样即使提交很多次后,代码库的空间占用也不会倍数增加。

同样的,通过AUFS,Docker大幅减少了虚拟文件系统对物理存储空间的占用。由此Docker也开创出了虚拟化领域很多新的轻量级解决方案。

由于容器是共享底层硬件、虚拟资源,依靠内核进行隔离,所以安全性不如主机虚拟化方式高。就在2019年春节期间runC暴出漏洞,以及阿里云的修复方案

四、Docker的理念

与其他虚拟化实现甚至其他容器引擎不同的是,Docker推崇一种轻量级容器的结构,即一个应用一个容器

例如在常见的虚拟机实现中,要搭建一套LAMP结构的服务,通常会建立一个虚拟机,在虚拟机中安装上Linux系统,之后分别安装Apache、MySQL和PHP。而在Docker里,最佳的实践是分别基于Apache、MySQL和PHP的镜像建立三个容器,分别运行Apache、MySQL和PHP 而它们所在的虚拟操作系统也直接共享于宿主机的操作系统。

Docker和虚拟机参数对比如下:

这里只列出了一些Docker的优势项,但这些优势都是开发中环境搭建和使用极其有帮助的内容。就启动速度来说,开发过程中显然不愿意调整环境或更新代码后要等待几分钟来让其生效。而像虚拟机占用大量操作系统资源,导致本地开发使用电脑过慢(有时候不得不将环境搭建在另外的机器上,但这显然在代码编写到运行自测的过程中增加很多工作量)等问题,也容易得到解决。

在Docker中能实现这样的设计理念,还要归功于几项基础设施的支持。

首先,只有在容器技术的支撑下,应用即容器的方案才能有效的实施。因为容器技术既剔除了Hypervisor层,又干掉了虚拟操作系统的概念,让容器中应用运行的消耗与真实操作系统中运行的消耗几乎完全一致。只有这样,才能像在真实操作系统中开启应用一样开启新的容器,而不用过分担心虚拟化带来的性能消耗。

其次,基于联合文件系统的底层文件系统支持,让容器能够很容易在真实操作系统中共享存储资源,并由此带来了对存储空间的低消耗。与动辄就要独立开辟十几GB甚至几十GB的虚拟化实现相比,要存在巨大的优势。

当然,Docker也支持在容器中同时运行很多种程序,但其容器设计本身并不针对这种方案,所以如果以这种方案在Docker中搭建环境,会花费不少时间做出一些本来并不需要做的事情。虽然这看上去动手性很强,但并不推荐在工作中这么去做,因为使用Docker本身就是为了效率,浪费时间在不必要的事情上,已经违背了使用Docker的初衷。

五、Docker的用途

A、更快、更一致的交付应用程序

使用Docker后,开发者能够在本地容器中得到一套标准的应用或服务的运行环境,由此可以简化开发的生命周期(减少在不同环境间进行适配、调整所造成的额外消耗)。对于整个应用迭代来说,加入Docker的工作流程将更加适合持续集成(Continuous Integration)和持续交付(Continuous Delivery)。

  • 开发者能够使用Docker在本地编写代码并通过容器与其他同事共享工作;
  • 使用Docker将编写好的程序推送至测试环境进行自动化测试或功能测试;
  • 当出现Bug时,开发者可以在开发环境中修复它们,并很快的重新部署到测试环境中;
  • 在测试完成后,部署装有应用程序的镜像就能完成生产环境的发布。

B、跨平台部署和动态伸缩

基于容器技术的Docker拥有很高的跨平台性,Docker的容器能够很轻松的运行在开发者本地的电脑,数据中心的物理机或虚拟机,云服务商提供的云服务器,甚至是混合环境中。

同时,Docker的轻量性和高可移植性能够很好的完成应用的动态伸缩,通过一些手段近实时的对基于Docker运行的应用进行弹性伸缩,能够大幅提高应用的健壮性。

C、让同样的硬件提供更多的产出能力

Docker的高效和轻量等特征,为替代基于Hypervisor的虚拟机提供了一个经济、高效、可行的方案。在Docker下,能节约出更多的资源投入到业务中去,让应用程序产生更高的效益。同时,如此低的资源消耗也说明了Docker非常适合在高密度的中小型部署场景中使用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值