认识Docker(1)

1.1 什么是Docker?

Docker开源项目

Docker是基于Go语言实现的云开源项目,诞生于2013年。Docker项目目前已加入Linux基金会,遵循Apache2.0协议,全部开源代码均在https://github.com/docker/docker上进行维护。

Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,即通过对应用组件的封装(Packaging),分发(Distribution),部署(Deployment),运行(Runtime)等生命周期的管理,达到应用组件级别的“一次封装,到处运行”。这里的应用组件,既可以是一个web应用,也可以是一套数据库服务,甚至是一个操作系统或编译器。

Linux容器技术

Docker引擎的基础是Linux容器(Linux Containers,LXC)技术。IBM DeveloperWorks上给出了关于容器技术的准确描述:
容器有效地将由单个操作系统管理的资源划分到孤立的组中,以便更好地在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心cpu本地运行命令,而不需要任何专门的解释机制。此外,也避免了准虚拟化(paravirtualizationd)和系统调用替换中的复杂性。

从Linux容器到Docker

在LXC的基础上,Docker进一步优化了容器的使用体验。Docker提供了各种容器管理工具(如分发,版本,移植等)让用户无需关注底层的操作,可以简单明了的管理和使用容器。用户操作Docker容器就像操作一个轻量级的虚拟机那样简单。

我们也可以简单的将Docker容器理解为一种沙盒(Sandbox)。每个容器内运行一个应用,不同的容器相互隔离,容器之间也可以建立通信机制。容器的创建和停止都十分迅速,容器对自身资源的需求也十分有限,远远低于虚拟机。很多时候,甚至直接把容器当作应用本身也没有任何问题。

1.2 为什么要使用Docker

Docker容器虚拟化的好处

Docker项目的发起人和Docker.Inc.的CTO Solomon Hykes认为,Docker在正确的地点,正确的时间顺应了正确的趋势---即高效地构建应用。现在开发者需要能方便的创建运行在云平台上的应用,也即是说应用必须能够脱离底层机器,而且同时必须是“任何时间任何地点”可获取的。因此,开发者们需要一种创建分布式应用程序的方式,这也是Docker所能够提供的。

举个简单的应用场景的例子。假设用户试图基于最常见的LA(N)MP组合来运维一个网站。按照传统的做法,首先,需要安装nginx,mysql,php以及它们各自的运行所依赖的环境;之后分别对它们进行配置(包括创建合适的用户,配置参数等);经过大量的操作后,还需要进行功能测试,看是否正常工作;如果不正常,则意味着更多的时间代价可不可控的风险。可以想象,如果再加上更多的应用,事情会变得更加难以处理。

更为可怕的是,一旦需要服务器迁移(如从阿里云迁移到腾讯云),往往需要重新部署和调试。这些繁重而琐碎无趣的“体力活”,极大的降低了工作效率。

而Docker提供了一种更为聪明的方式,通过容器来打包应用,意味着迁移只需要再新的服务器上启动需要的容器就可以了。这无疑将节约大量的宝贵的时间,并降低部署过程出现的风险。

Docker在开发和运维中的优势

对开发和运维(DevOps)人员来说,可能最梦寐以求的就是一次性的创建或配置,可以在任意环境,任意时间让应用正常的运行。而Docker恰恰是可以实现这一终极目标的瑞士军刀。

1.更快速的交付和部署。使用Docker,开发人员可以使用镜像来快速构建一套标准的开发环境;开发完成之后,测试和运维人员可以直接使用相同环境来部署代码。Docker可以快速创建可删除容器,实现快速迭代,大量节约开发,测试,部署的时间。并且,各个步骤都有明确的配置和操作,整个过程全程可见,使团队更容易理解应用的创建和工作过程。
2.更高效的资源利用。Docker容器运行不需要额外的虚拟化管理程序(Virtual Machine,VMM,以及Hypervisor)支持。它是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。
3.更轻松的迁移和扩展。Docker容器几乎可以在任意的平台上运行,包括物理机,虚拟机,公有云,私有云,个人电脑,服务器等。这种兼容性让用户可以在不同平台之间轻松地迁移应用。
4.更简单的更新管理。使用Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。并且所有修改都以增量的方式进行分发和更新,从而实现自动化并且高效的容器管理。

Docker与虚拟机比较

作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有显著的优势。
1.Docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式要快的多。
2.Docker容器对系统资源需求很少,一台主机上可以同时运行上千个Docker容器。
3.Docker通过类似Git的操作来方便用户获取,分发,和更新应用镜像,指令简单,学习成本低。
4.Docker通过Dockerfile配置文件来支持灵活的自动化创建和部署机制,提高工作效率。

Docker除了运行其中的应用之外,基本不消耗额外的系统资源,保证应用性能的同时,尽量减小系统的开销。传统虚拟机方式运行N个不同的应用(操作系统级别,如windows环境,centos环境,kali环境)就要启动N个虚拟机(每个虚拟机需要单独的分配独占内存,磁盘,CPU等资源),而Docker只需要启动N个隔离的容器,并将应用放到容器内即可。

当然,在隔离性放面,传统的虚拟机方式多了一层额外的隔离。但这并不意味着Docker就不安全。Docker利用linux系统上的多种防护机制实现了严格可靠的隔离。从1.3版本开始,Docker引入了安全选项和镜像签名机制,极大地提高了使用Docker的安全性。

下表总结了使用Docker容器技术与传统虚拟机技术的特性比较。

Docker01.png

1.3 虚拟化与Docker

虚拟化技术是一个通用的概念,在不同的领域有不同的理解。在计算领域,一般指的是计算虚拟化(Computing Virtualization),或通常说的服务器虚拟化。维基百科上定义如下:
在计算机技术中,虚拟化(Vritualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器,网络,内存及存储等,予以抽象,转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以用比原本的组态更好的方式来应用这些资源。

可见,虚拟化的核心是对资源进行抽象,目标往往是为了在同一个主机上运行多个系统或应用,从而提高系统资源的利用率,同事带来降低成本,方便管理和容错容灾等好处。

从大类上分,虚拟化技术可分为基于硬件的虚拟化和基于软件的虚拟化。其中,真正意义上的基于硬件的虚拟化技术不多见,少数如网卡中的单根多IO虚拟化(Single Root I/O Virtualization and Sharing Specification,SR-IOV)等技术,此处不讨论,暂做了解。

基于软件的虚拟化从对象所在层次,又可以分为应用虚拟化和平台虚拟化(通常说的虚拟技术即属于这个范畴)。其中,前者一般指的是一些模拟设备或Wine这样的软件。后者又可以分为如下几个子类:
完全虚拟化。虚拟机模拟完整的底层硬件环境和特权指令的执行过程,客户操作系统无需进行修改。如:VMware Workstation,Virtual Box,QEMU等。
硬件辅助虚拟化。利用硬件(主要是CPU)辅助支持(目前X86体系结构上可用的硬件虚拟化技术报错Intel-VT和AMD-V)处理敏感指令来实现完全虚拟化的功能。客户操作系统无需修改,例如:KVM,Xen,VMware Workstation。
部分虚拟化。只针对部分硬件资源进行虚拟化,客户操作系统需要进行修改。现在 有些虚拟化技术的早期版本仅支持部分虚拟化。
超虚拟化(Paravirtualization)。部分硬件接口以软件的形式提供给客户机操作系统,客户操作系统需要进行修改,例如早期的Xen。
操作系统级虚拟化。内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。容器相关技术即在这个范畴。

Virtualization.png

可见,Docker以及其他容器技术都属于操作系统的虚拟化这个范畴。
Docker虚拟化方式之所以拥有众多优势,这跟操作系统的虚拟化自身的特点是分不开的。下图比较了Docker和常见的虚拟机方式的不同之处。

传统方式是在硬件层面实现虚拟化,需要额外的虚拟机管理应用(以后学习KVM虚拟化的时候有用到)和虚拟机操作系统层。

Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。

支持Docker的底层技术

Docker本质就是宿主机的一个进程,Docker是通过namespace实现资源隔离,通过cgroup实现资源限制。通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘,比如分配500g并不是实际占用物理磁盘500g)

Namespace

命名空间(Namespace)是Linux为我们提供的用于分离进程树、网络接口、挂载点以及进程间通信等资源的方法。在日常使用个人PC时,我们并没有运行多个完全分离的服务器的需求,但是如果我们在服务器上启动多个服务,这些服务其实会相互影响的,每一个服务都能看到其他服务的进程,也可以访问宿主机器上的任意文件,一旦服务器上的某一个服务被入侵,那么入侵者就能够访问当前机器上的所有服务和文件,这是我们不愿意看到的,我们更希望运行在同一台机器上的不同服务能做到完全隔离,就像运行在多台不同的机器上一样。而Docker其实就通过Linux的Namespace技术来实现的对不同的容器进行隔离。

当我们运行(docker run或者docker start)一个Docker容器时,Docker会为该容器设置一系列的namespace,这些namespace提供了一层隔离,容器的各个方面都在单独的namespace中运行,并且对其的访问仅限于该namespace。

Docker在Linux上使用以下几个命名空间(上面说的各个方面):

  • pid namespace: 用于进程隔离(PID: 进程ID)
  • net namespace: 管理网络接口(NET: 网络)
  • ipc namespace: 管理对IPC资源的访问(IPC: 进程间通信(信号量、消息队列和共享内存))
  • mnt namespace: 管理文件系统挂载点(MNT: 挂载)
  • uts namespace: 隔离主机名和域名
  • user namespace: 隔离用户和用户组(3.8以后的内核才支持)
CGroups

我们通过Linux的namespace技术为新创建的进程隔离了文件系统、网络、进程等资源,但是namespace并不能为我们提供物理资源上的隔离,比如CPU、内存、IO或者网络带宽等,所以如果我们运行多个容器的话,则容器之间就会抢占资源互相影响了,所以对容器资源的使用进行限制就非常重要了,而Control Groups(CGroups)技术就能够隔离宿主机上的物理资源。CGroups由7个子系统组成:分别是cpuset、cpu、cpuacct、blkio、devices、freezer、memory,不同类型资源的分配和管理是由各个CGroups子系统负责完成的。

在 CGroup 中,所有的任务就是一个系统的一个进程,而 CGroup 就是一组按照某种标准划分的进程,在 CGroup 这种机制中,所有的资源控制都是以 CGroup 作为单位实现的,每一个进程都可以随时加入一个 CGroup 也可以随时退出一个 CGroup。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,392评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,258评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,417评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,992评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,930评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,199评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,652评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,327评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,463评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,382评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,432评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,118评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,704评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,787评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,999评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,476评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,057评论 2 341

推荐阅读更多精彩内容