《循序渐进学Docker》——第一部分 Part 1 基础篇 第1章 全面认识Docker 1.1 Docker是什么-阿里云开发者社区

开发者社区> 华章出版社> 正文

《循序渐进学Docker》——第一部分 Part 1 基础篇 第1章 全面认识Docker 1.1 Docker是什么

简介: 本节书摘来自华章出版社《循序渐进学Docker》一书中的第1章,第1.1节,作者李金榜 尹烨 刘天斯 陈纯,更多章节内容可以访问云栖社区“华章计算机”公众号查看。 第一部分 Part 1 基 础 篇 第1章 全面认识Docker 第2章 初步体验Docker 第3章 Ubuntu下使用Docker 第4章 Docker的基础知识 第1章 全面认识Docker 欢迎来到Docker的世界。

本节书摘来自华章出版社《循序渐进学Docker》一书中的第1章,第1.1节,作者李金榜 尹烨 刘天斯 陈纯,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

第一部分 Part 1

基 础 篇

第1章 全面认识Docker

第2章 初步体验Docker

第3章 Ubuntu下使用Docker

第4章 Docker的基础知识

第1章

全面认识Docker

欢迎来到Docker的世界。

Docker,Golang社区杀手级的应用,是Github上最活跃的项目之一,也是开源社区最受欢迎的项目。

Docker,号称要成为所有云应用的基石,并把互联网升级到下一代。

开发、测试、运维人员看到Docker,都激动地说:“太好了,这正是我所需要的!”

Docker是什么,能解决什么问题,为什么这么火?本章将一一道来。

1.1 Docker是什么

首先,我们了解下Docker产生的历史背景和当前发展情况,通过和一些熟悉的事物做类比,让大家对Docker有一个初步认识和了解。

1.1.1 Docker的由来

Docker是dotCloud公司开源的一款产品。dotCloud公司是2010年新成立的一家公司,主要基于PaaS(Platform as a Service,平台即服务)平台为开发者提供服务。在PaaS平台下,所有的服务环境已经预先配置好了,开发者只需要选择服务类型、上传代码就可对外服务,不需要花费大量的时间搭建服务和配置环境。dotCloud的PaaS平台已经做得足够好了,它支持几乎所有主流的Web编程语言和数据库,可以让开发者随心所欲地选择自己需要的编程语言、数据库和编程框架,而且它的设置非常简单,每次编码后只需要运行一条命令就能把整个网站部署上去;并且利用多层次平台的概念,理论上,它的应用可以运行在各种类型的云服务上。两三年下来,虽然DotCloud也在业界获得不错的口碑,但由于整个PaaS市场还处于培育阶段,dotCloud公司表现得不温不火,没有出现爆发性的增长。

2013年,dotCloud的CEO Solomon Hykes决定把dotCloud内部使用的Container容器技术单独拿出来开源。2013年3月发布Docker的V0.1版本,并且基本保持每月一个版本的迭代速度,到了8月,Docker已经足够火爆,并广受好评,各种各样的技术论坛和技术峰会都开始热烈讨论与推荐Docker,这时Docker才只发布到V0.6版本。

随着Docker的流行,越来越多的优秀开发者加入Docker社区参加开发。这里值得一提的是,Docker是基于Linux3.8以上内核,在aufs分层文件系统下构建的,主要运行在Ubuntu的系统下。REHL/Centos当时最新版6系列还是基于Liunux2.6.32内核,无法运行Docker。为了让REHL/Centos尽快支持Docker,RedHat公司的工程师亲自出马,加班加点为Docker贡献代码,新增对devicemapper的支持来实现文件系统分层,终于顺利地让Docker在REHL/Centos运行起来。

随着Docker在业界的知名度越来越高,到了2013年10月,dotCloud公司索性更名为Docker股份有限公司,工作的重心也从PaaS平台业务转向全面围绕Docker来开发。到了2014年1月,Docker公司宣布完成15?000万美元的融资,雅虎联合创始人杨致远也参与跟投。

虽然Docker迟迟没有发布1.0版,但好多公司已纷纷把Docker应用到生产环境。其中,美国奢饰品电商Gilt的CTO说:“使用Docker以后,突然之间,传统方式中的各种问题都消失了,我们接下来要考虑如何进一步提高软件生产效率,让软件开发更加安全和创新。这种转变太不可思议了!”

千呼万唤,到了2014年6月9日,Docker终于发布了V1.0版,并举办了DockerCon 2014大会,大会上来自Google、IBM、RedHat、Rackspace等公司的核心人物均发表了主题演讲,纷纷表示支持并加入Docker的阵营。Docker的CTO Solomon Hykes充满雄心壮志地说:“我们能把互联网升级到下一代!”Google的基础架构部副总裁Eric Brewer也附和道:“容器技术曾是Google的基础,我们和Docker联手,把容器技术打造为所有云应用的基石。”

Google自2004年就开始使用容器技术,目前他们每周要启动超过20亿个容器,每秒钟新启动的容器就超过3000个,在容器技术方面有大量的积累。曾相继开源了Cgroup和Imctfy这两个重量级项目。Google对Docker的支持力度非常大,不仅把Imctfy先进之处融入Docker中,还把自己的容器管理系统(kubernetes)也开源出来。

2014年8月,不缺钱的Docker再次融资,融资超4千万美元,估值达到4亿美元。

所有的云计算大公司,如Azure、Google和亚马逊等都在支持Docker技术,这实际上也让Docker成为云计算领域的一大重要组成部分。

2014年10月15日,Azure副总裁Jason Zander宣布了微软与Docker的合作伙伴关系;2014年11月5日,Google发布支持Docker的产品DockerGoogle Container Engine;2014年11月13日,Amazon发布支持Docker的产品AWS Container Service。至此,几个重要的云计算大公司都已经支持Docker技术,这不仅让Docker成为云计算领域的一个重要级成员,也让Docker成为云应用部署的事实上的标准。

2014年12月,Docker发布了Docker集群管理工具Machine和Swarm,标志着Docker开始突破一个标准的容器框架,打造属于Docker自己的集群平台和生态圈。

2015年4月,Docker公司宣布完成了9500万美元的D轮融资。

2015年10月,Docker收购Tutum,Tutum本身已经实现对亚马逊网络服务
(AWS)、Digital Ocean、微软的Azure等主流云服务商的良好支持。

2016年1月,Docker官方计划全面支持自身的Alpine Linux,使用它构建的基础镜像最小只有5M。

截至2016年3月,Docker在Github上收获29?962个关注(star)、8437个拷贝(Fork),在Github所有项目中排第7位,在云平台管理领域排名第一,远远超Openstack项目的1316个关注、768个拷贝。

1.1.2 Docker为什么这么火

Docker从诞生到现在,短短两年时间,已经成为开源社区最火爆的项目,风头已经远远盖过了近年来很流行的Puppet和OpenStack。那么Docker的火爆到底是一种炒作、一种跟风,还是它确实名副其实、众望所归呢?

要回答这个问题,首先看看当前我们所处的环境和面临的问题。

随着计算机近几十年的蓬勃发展,产生了大量优秀系统和软件。比如:

操作系统,如REHL/Centos、Debian/Unbuntu、FreeBSD、OpenSuse等。

编程语言,如Java、C/C++、Python、Ruby、Golang等。

Web服务器,如Apache、Nginx、Lighttpd等。

数据库,如Mysqld、Redis、Mongodb等。

现在的软件开发人员真是幸运,可以在这么多种类中自由选择。自由选择的结果是,维护一个非常庞大的开发、测试和生产环境,开发、测试和运维人员都被种类繁多的环境折腾得筋疲力尽,不得不收缩战线,每种类型的软件只选择一两种来支持。许多优秀的开发框架和软件尽管有不少优秀特性,但因为维护麻烦,便没有了用武之地。

即便每种类型的软件只选择一两种来支持,随着操作系统和软件版本的更新迭代,维护工作还是变得越来越庞大。

面对这种情况,业界大牛群策群力,给出了很多解决方案,比较有代表的是Puppet和OpenStack。

Puppet是集中的配置管理系统,它把文件、用户、cron任务、软件包、系统服务等抽象为资源,并通过自有的语言描述资源间的依赖关系,集中管理各类资源的安装配置。Puppet主要适用于需要大批量部署相同服务的应用场景。

OpenStack是开源的云计算管理平台项目,可以帮助企业内部实现类似于Amazon EC2的云基础架构服务。虽然灵活,但组件繁多、构建复杂,比较适合中大型企业使用。

Puppet和OpenStack虽然比较流行,但适应的场景有限,不具备通用性。正当大家在众多方案中左右为难时,Docker出现了,它作为一个开源的应用容器引擎,让开发者可以打包他们的应用及依赖环境到一个可移植的容器中,然后发布到任何运行有Docker引擎的机器上。它集版本控制、克隆继承、环境隔离等特性于一身,提出一整套软件构建、部署和维护的解决方案,可以非常方便地帮助开发人员,让大家可以随心所欲地使用软件而又不会深陷到环境配置中。

这只是Docker的一个应用场景而已,Docker还能干更多的事情。

作为计算机的从业人员,下面场景你或许碰到过。

小A是一名资深码农,作为新招聘实习生的导师,小A要给实习生的开发机装一套和自己开发机一样的运行环境,不仅要安装Nginx、Java、Mysqld和一些依赖库等,还要修改相关的配置文件。结果花了一天时间,小A也没把实习生的开发环境搞定,在徒弟面前颜面尽失,尴尬不已。

小B是一名QA测试工程师,他按开发给的文档、部署的服务,测试出一大堆问题,通过和开发的沟通,发现是开发和测试环境不一致引起的。

小C作为一名业务运维工程师,同时维护开发、测试、生产三套环境,经常在不同环境下装相同的包,做大量重复工作。

小D同时在为三个项目开发功能模块,他要不停地修改他的开发环境为适应在三个项目间开发、联调测试。

小E发现服务器被入侵过,他想知道什么文件被篡改过。

小F从离职同事那里接手一个系统,文档不全,突然一台机器硬件故障,他不知道该如何重新部署这个应用。

小G新上线一个游戏,游戏火爆超预期,需要紧急扩容,花了一两个小时才完成扩容,期间用户体验很卡,流失不少潜在用户。

小H和小I共同维护一套系统,分工轮流值夜班,但一出现突发故障,排查问题时,即便半夜,还需要把对方叫醒,确认下对方在前一天有没有变更过什么配置。

小M的一个机房要裁撤了,该机房的数千个应用都要迁移到其他机房,小M觉得这项工作非常庞大,半年时间都未必能完成。

但是如果使用Docker,这些根本不算事儿,分分钟就能搞定。

Docker的解决方案简单、灵活、高效,还很直观,甚至不需要过多地改变现有的使用习惯,就可以和已有的工具,如Puppet、OpenStack等配合使用。

各种优势让Docker脱颖而出,有鹤立鸡群的感觉,Docker的火爆也就不难理解了。

1.1.3 Docker究竟是什么

按照官方的说法,Docker是一个开源的应用容器引擎。很多人觉得这个说法太抽象,不容易理解。

那我们就从最熟悉的事物说起吧,但凡从事过计算机相关行业的人,对Java、Android和Github都很熟悉。

先说Java,在Java之前的编程语言,像C/C++,是严重依赖平台的,在不同平台下,需要重新编译才能运行。Java的一个非常重要的特性就是与平台无关性,而使用Java虚拟机是实现这一特性的关键。Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成可以在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。

软件部署也依赖平台,Ubuntu的软件包在Centos下可能就运行不起来。和Java虚拟机类似,Docker使用容器引擎解决平台依赖问题,它在每台宿主机上都启动一个Docker的守护进程,守护进程屏蔽了与具体平台相关的信息,对上层应用提供统一的接口。这样,Docker化的应用,就可以在多个平台下运行,Docker会针对不同的平台,解析给不同平台下的执行驱动、存储驱动和网络驱动去执行。

Java曾提出“Write Once,Run Anywhere”,而Docker则提出了“Build once,Run anywhere,Conf?igure once,Run anything”。虽然,Java和Docker是为了解决不同领域的问题,但在平台移植方面却面临相同的问题,使用的解决方式也相似。

提起Android,大家想到什么?它是一个开源的手机操作系统,也是一个生态圈,它的App应用以apk形式打包、发布,可以运行在任何厂商的Android手机上。它还有一个官方的安卓市场,提供各种各样的App,我们需要某个App时,就从安卓市场上搜索下载,手机开发者也可以编写一些App,发布到安卓市场,提供给别人使用,Android也允许在第三方的安卓市场上下载或上传应用。

如果把软件部署的应用看作Android的App,Docker简直和Android一模一样,Docker是一个开源的容器引擎,也有自己的生态圈,它的应用以镜像(image)的形式发布,可以运行在任何装有Docker引擎的操作系统上。它有一个官方的镜像仓库,提供各种各样的应用,当需要某个应用时,就从官方的仓库搜索并下载,个人开发者也可以提交镜像到官方仓库,分享给别人使用。Docker也允许使用第三方的镜像仓库。

最后,再谈谈Github。它主要用来做版本控制,不仅可以比较两个版本的差异,还可以基于某些历史版本创建新的分支。

使用Docker后,软件部署的应用也可以具备类似Github的版本控制功能,对应用做一些修改,提交新版本,运行环境可以在多个版本间快速切换,自由选择使用哪个版本对外提供服务。

通过和Java、Android、Github的对比,大家对Docker应该有了比较直观的认识,Docker用来管理软件部署的应用,Docker把应用打包成一个镜像,镜像带有版本控制功能,应用的每次修改迭代就对应镜像的一个版本,制作好的镜像可以发布到镜像仓库,分享给别人;也可以直接从镜像仓库下载别人制作好的应用,不做任何修改,即可运行起来。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

华章出版社

官方博客
官网链接