1.2 什么是Docker
除了Docker,容器技术还有Podman、Kata、Rocket等。Docker因为社区影响力大,加上本身架构设计简单清晰,因此得到了大众的认可,成为容器技术最典型的代表。学习容器技术,我们可以从Docker入手。
1.2.1 Docker简介
2010年PaaS平台的服务供应商dotCloud公司在旧金山成立。2013年dotCloud更名为Docker,专注开源容器引擎的开发,它们的容器引擎产品就是基于Go语言并遵从Apache2.0协议的Docker。图1-6所示是Docker创建人Solomon。
1.1节介绍了容器技术的基本概念,容器技术的底层支持其实就是LXC技术。LXC技术诞生于Linux 2.6的Kernel,设计之初并非是专门为PaaS层考虑的,所以LXC缺少一些标准化的管理手段,在使用上有一定困难。Docker研发团队发现了这一问题,然后针对LXC做了上层标准管理方面的支持,让LXC更加好用。
图1-6 Docker创始人Solomon
为什么dotCloud公司能发现这个机遇并顺势开发出Docker然后声名大噪呢?就像马云能在中国、在合适的时间创立阿里巴巴,推动国内互联网的发展一样。其实,这都是时代的造就。我们深入分析IT架构的发展变革史就能明白其中的道理了。
早期,IT行业要成功开发出一个产品,需要关心的东西太多了。机房选址、服务器硬件、网络设备、布线、上架、装系统、搭环境、开发、测试……只要是跟IT相关的,都要一步步安排好。这个时期是传统IT管理与建设的初期,IT资源成本很高,人力成本也高。
云计算IaaS时代,AWS、腾讯云、阿里云的出现化解了传统IT管理的痛苦,有了云,用户不再需要面对硬件底层管理的问题,开发和测试都是在云主机上进行的。然而,云主机就是一个个不一样的操作系统,硬件底层管理问题没有了,但是中间件相关的问题依然存在!IT运维人员要为开发测试人员提供完善、稳定的云主机环境,这个过程也是相当复杂的,因为开发测试人员要求的环境是多种多样的,IT运维人员需要花费一定的时间和精力去维护和完善。当前大部分公司还是处在这个阶段。虚拟机和容器架构对比如图1-7所示。
图1-7 虚拟机和容器架构对比
容器PaaS时代已经到来。容器技术的出现就是为了解决上面两个时期遗留的问题。有了容器技术,开发者更加专注程序的开发和测试,开发结束后能快速方便地把开发好的App迁移到另外一个容器环境里。简单来说,开发人员只需为应用创建一次运行环境,该应用就可以在任何环境里运行(Build Once,Run Anywhere)。对于IT运维人员来说,部署一套PaaS平台,供开发使用,就再也不用重复部署不一样的开发环境了,开发人员在使用上因为不会改变底层的PaaS系统,所以不用重复维护这些环境(Configure Once,Run Anything)。开发人员使用容器环境,我们可以用1-8图形象地表示。
图1-8 形象地表示开发人员使用容器环境的心情
容器的功能如此强大,使用的人也非常多,Docker公司之所以能占领容器领域先机,就是因为它在这领域有一定的积累。所以,在云计算PaaS风口上,Docker在合适的时间通过自己的技术积累发布了这套开源容器管理引擎,想不出名也难了!
1.2.2 Docker的组成架构
我们把Docker的交付运行环境比作海运,CoreOS如同一个货轮,每一个在OS基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造。这样,交付一个软件,就是一系列标准化组件的集合交付,完成后再写上名字(最终端的标准化组件就是用户的App)。
Docker是如何实现这样的集装箱货轮海运功能的呢?我们先从Docker的架构说起。图1-9所示是Docker架构,Docker主要由以下模块组成。
图1-9 Docker架构图
1)Client:Docker客户端。
2)Docker Daemon:Docker服务器。
3)Image:Docker镜像。
4)Registry:Docker仓库。
5)Container:Docker容器。
Docker采用的是C/S架构模式,使用远程REST API来管理和创建Docker容器。既然是采用REST模式,所以客户端和服务端不用在同一个host上,可以分布式管理部署。
1.Docker客户端:Client
Docker的客户端分命令和API两种类型。一般在系统安装好Docker包后就可以使用Docker的命令了,Linux系统下的命令直接是docker开头,例如可以用docker--help命令查看所有能运行的命令。Docker命令非常好记,用多了自然就熟练了,而且学习Docker最好的方式也是从命令入手。
Docker的API一般用于写脚本或者进行项目开发,而且都是REST风格的,用命令交互可以结合curl使用。用API可以进行创建、删除、修改、查询等一系列操作,结合编程语言使用的话,功能会更强大。
2.Docker服务器:Docker Daemon
Docker Daemon是Docker的主服务,docker.service。在Linux操作系统下,安装好Docker后我们就可以使用systemctl start/status/stop docker.service命令去操作Docker的服务了。这个服务非常重要,如果系统的docker.service存在异常,那么Docker关联的所有组件都会出错。
3.Docker镜像:Image
Docker的镜像很容易理解,我们用VMware和OpenStack进行类比。VMware和OpenStack都有镜像模板的概念,我们要衍生创建虚拟机,通过镜像模板来快速部署和生成相同类型的VM。Docker的镜像也是一个道理,通过不同类型的模板,比如Redis镜像、Nginx镜像来快速创建容器。好比直接复制,只要资源够,想生成多少容器就生成多少容器。我们可以使用生成的新容器,也可以打包成镜像。镜像这个功能为生产提供了很好的打包、迭代、传递方式。
4.Docker仓库:Registry
Registry就是仓库的意思,我们上面提到Docker有镜像,镜像会因为业务的需要以不同类型的方式存在。所以,这么多类型的镜像如果没有一个很好的机制去管理,肯定会混乱。好比一个生产车间,生产组装过程需要各种各样的螺丝钉、齿轮等配件,如果没有一个专业的仓库管理员对配件进行管理,车间里会乱七八糟。同样地,Docker镜像也需要标准化管理,这就是Registry模块的功能。不过,值得注意的是,Registry分公有和私有两种。Docker Hub是默认的Registry,由Docker公司自行维护,上面有数以万计的镜像,用户可以自由下载和使用。不过,使用公有镜像速度会很慢,一般公司内部使用Docker都需要搭建私有仓库,不然很影响效率。
5.Docker容器实例:Container
Container就是容器实例,可以类比为KVM生成的虚拟机。Container是运行时状态,我们可以通过docker命令和API去控制和改变Container的状态,比如启动、停止。上面所讲的Client、Daemon、Image和Registry都是为了Container运行稳定而服务的。
通过本节的学习,我们对Docker底层组件之间的架构有了全面和深入的了解,但是缺少实践,接下来请跟随我们一起在实践中学会使用Docker。