前言
要了解 Docker 是什么,从现实世界找到对照远比比从技术解释开始更容易,Docker 就是一个非常形象比喻,docker—码头工人:在港口装卸货物的工人。
码头上的困境
码头上, 成群的工人背着重物爬上踏板,钻进货舱, 把装满货物的箱子或桶堆在任何可以放置物品的角落里。 在发货人的工厂或仓库里,货物必须被分 成小份装进卡车或火车里,卡车或火车把它们分送到码头,由码头工人 分类装卸。那个年代,码头运输陷入一片困境,运输效率十分低下, 货物装卸价格昂贵。
始发地—卡车—火车—码头—轮船—码头—火车—卡车—目的地这个过程货物经过多次转运,再加上货物的品类繁多,无论雇佣多么有经验的搬运工,货物都会有损失,比如:土豆压了香蕉、石料碰碎了红酒。多种多样的交通工具,无论雇佣多少搬运工,整个运输过程的效率都没有明显提升,反而因此损失了更多的货物。
降低货物装载费用的方法是显而易见的,为什么不把货物装进大的集装箱里面仅仅通过移动集装箱来代替重复的 装、卸大批量的散货呢?
货运集装箱的出现
集装箱是由美国商人马尔科·麦连(Malcom McLean)在1950年代发明出来的,是一种按规格标准化的钢制箱子,它屏蔽了货物的尺寸、类型等细节,并可以层层重叠,货物集装之后,在水陆空转运的过程中就不需要再重新装箱,可以节省货主和船东的经费与时间。并且由于集装箱符合统一标准,整个流程非常容易机械化,这引发了以集装箱为中心的整个全球物流的标准化进程,进而节省了大量的资源,物流成本迅速下降,促进了全球资源的流动与重新配置。
有了集装箱之后可以在不同的运输工具之间快速转运,无需大量的搬运工人,因为减少了卸载装载的过程,货物的损失降到了最低。
那是不是有一种技术像集装箱一样,可以把我们在软件中用到的各种配置、软件制品按照某一种标准封装成一种“集装箱”呢?
软件领域的困境
和码头困境一样,软件领域一样面临着相同的挑战。比如要部署一个django框架应用,要做哪些事情?首先部署python环境,比如这个要部署的应用基于python3,而你机器上是python2,要先升级python3,还要先装各种依赖,还要解决一些可能的冲突。
升级完python之后,还要装mysql、redis、kafka,继续下载,安装,配置,花费了大量的时间终于将服务启动起来。但很不幸,客户服务器硬件异常,所有的工作需要重新再来一遍?这种情况,是我们之前软件交付工作中经常会遇到的一种崩溃场景。
各种各样的技术栈和硬件环境让我们的软件交付组合变得异常复杂,难以为继。那是不是有一种技术像”货运集装箱“一样解决软件交付的问题呢?
容器:代码"集装箱"
Docker 将集装箱思想运用到软件打包上,为代码提供了一个基于容器的标准化运输系统。Docker 可以将任何应用及其依赖打包成一个轻量级、可移植、自包含的容器(镜像)。(通过镜像创建的)容器可以运行在几乎所有的操作系统上。
因为docker的出现,在软件交付过程中我们再也不用担心技术栈和硬件环境的差异。
有了Docker之后我们再遇到因为硬件故障导致要重新部署的场景又是怎样的呢?
我们只需要在第一次部署前,构建完可用的Docker镜像(封装成集装箱),在以后使用中,短短的几行命令就可以直接拉取镜像,把服务运行成容器。所需要的仅仅是安装了Docker的服务器,一个Dockerfile文件(装箱清单),以及比较流畅的网络而已,真可谓『一次构建,到处部署』。
镜像和容器
在Docker中镜像是指,把你的应用按照Docker规定的格式封装成一种具有某种标准规格的东西(就像集装箱把你的货物封装起来类似),形象的说,就是把你的应用按照一定的格式抽象的模板。
镜像也是容器的定义工具,允许用户定义容器的内容和属性,这样容器就能够被保存,共享和重建。
- docker image 是 docker 容器的模板,runtime 依据 docker image 创建容器。
- ACI (App Container Image) 与 docker image 类似,它是由 CoreOS 开发的 - rkt 容器的 image 格式。
在物流系统中,我们将货物装入集装箱前,需要提前设计装箱手册(dockerfile),装箱手册(dockerfile)包含了装入的货物名称、摆放位置等等,我们会首先按照装箱手册(dockerfile)操作来完成一个集装箱的装入并不断调整确保装入集装箱(容器)的货物(应用)可以稳定运行,这时我们把当前的状态”镜像“一下固化成一个”标准模板“(image),再以这个”标准模板“(image)作为基础去创建相同的集装箱(容器)。
理解Docker
集装箱(容器)对于远洋运输(应用运行)来说十分重要,集装箱(容器)能保护货物(应用),让其不会相互碰撞(应用冲突)而损坏,也能保障当一些危险货物发生规模不大的爆炸(应用崩溃)时不会波及其它货物(应用),但是把货物(应用)装载在集装箱(容器)中并不是一件简单的事情。
而出色的码头工人(Docker)的出现解决了这一问题,他(Docker)可以将货物装载到集装箱(容器)、将集装箱装载到不同的载具(运行环境)或者从不同的载具(运行环境)卸载。同时码头工人(Docker)可以管理集装箱(容器),将集装箱登记和存入仓库(registry和repository)。
对于远洋运输(应用运行)而言,用多艘小货轮(虚拟机)代替原来的大货轮(实体机)也能保证货物(应用)彼此之间的安全,但是和集装箱(容器)比成本过高,但适合运输某些重要货物(应用)。
总结
docker的本意是码头工人的含义,因为集装箱的出现缩短了货物的交付时间,降低了物流的成本,推进了整个物流领域标准化、自动化管理方式的变革。Docker平台在软件领域也起到了同样的作用……
本文参考:
Docker in Practice SECOND EDITION
开始学习Docker啦–容器理论知识(一)
Docker Docs
Docker是什么?
Docker实战总结
评论区