容器一词的英文是container,其实container还有集装箱的意思,集装箱绝对是商业史上了不起的一项发明,大大降低了海洋贸易运输成本。让我们来看看集装箱的好处:
回到软件中的容器,其实容器和集装箱在概念上是很相似的。
现代软件开发的一大目的就是隔离,应用程序在运行时相互独立互不干扰,这种隔离实现起来是很不容易的,其中一种解决方案就是上面提到的虚拟机技术,通过将应用程序部署在不同的虚拟机中从而实现隔离。
先谈谈运输时我们用到的集装箱是如何产生的。当时,各种各样的散货通过海运进行运输,而困扰托运人和承运人的问题是由于大小、样式以及质量不同的商品放在一起容易出现挤压、破损等不良现象,例如将一批钢材和一把香蕉压在一起等。此外,不同运输方式之间的转运也相当麻烦。不同商品和不同运输手段的结合组成了一个巨大的二维矩阵,最终在美国海陆运输公司的推动下,海运界制定了国际标准集装箱来解决这个棘手的问题,如图10.2所示。
同样的问题也出现在互联网行业,在软件应用开发过程中,需要有一种东西能够像集装箱一样方便地打包应用程序,隔离它们之间的不良影响,使应用能够在各种运行环境下运行并且在平台之间易于移植。如图10.3所示, Docker的初衷就是将各种应用程序和它们所依赖的运行环境打包成标准的容器,进而发布到不同的平台上运行。
Docker是一个开源项目,诞生于2013年初,最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。
Docker的基础是Linux容器(Linux Containers,LXC)技术, Docker是一种实现轻量级的操作系统虚拟化解决方案。在LXC的基础上Docker进行了进一步的封装,让用户不需要去关心容器的原理,使得操作更为简便。使得用户操作Docker容器就想操作一个快速轻量级别的虚拟机一样简单。
Docker是一个C/S类型的架构。一般来说,用户通过client端进行相应操作,然后对应操作指令会传递到server端,然后交由server端的Docker daemon处理。
Docker包括三个核心组件:镜像、容器和仓库。
当我们启动容器之后,我们接触的是最顶层的可写容器,最顶层的镜像以处于他下发层的镜像迭代构建而成。接下来引出docker镜像的另一个特性,写时复制:
Docker仓库用来保存镜像,可以理解为代码控制中的代码仓库,是Docker集中存放镜像文件的场所。
通常,一个用户可以建立多个仓库来保存自己的镜像。从这里可以看出仓库是注册服务器(Registry)的一部分,一个个的仓库组成了一个注册服务器。简单来说, Docker仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务。
Docker仓库有公有和私有的概念。其中公共的仓库如Docker官方的Docker Hub。Docker Hub提供了庞大的镜像集合供使用,这些镜像可以是自己创建的,还可以是在别人的镜像基础上创建国内的公开仓库(包括Docker Pool等),能提供稳定的国内访问。如果用户不希望公开分享自己的镜像文件, Docker也支持用户在本地网络内创建一个只能自己访问的私有仓库。
在用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上pull下来就可以了。
Docker容器和文件夹类似,一个Docker容器包含了某个应用运行所需要的所有环境。相对于静态的镜像而言,容器是镜像执行的动态表现。每一个Docker容器都是从Docker镜像创建的。Docker容器可以运行、开始、停止、移动和删除。每一个Docker容器都是独立和安全的应用平台, Docker容器是Docker的运行部分。
容器易于交互、便于传输、易移植、易扩展,非常适合进行软件开发、软件测试以及软件产品的部署。