![每天5分钟玩转Docker容器技术](https://wfqqreader-1252317822.image.myqcloud.com/cover/492/26943492/b_26943492.jpg)
2.2 Why——为什么需要容器
为什么需要容器?容器到底解决的是什么问题?简要的答案是:容器使软件具备了超强的可移植能力。
2.2.1 容器解决的问题
我们来看看今天的软件开发面临着怎样的挑战?
如今的系统在架构上较十年前已经变得非常复杂了。以前几乎所有的应用都采用三层架构(Presentation/Application/Data),系统部署到有限的几台物理服务器上(Web Server/Application Server/Database Server)。
而今天,开发人员通常使用多种服务(比如MQ、Cache、DB)构建和组装应用,而且应用很可能会部署到不同的环境,比如虚拟服务器、私有云和公有云,如图2-2所示。
![](https://epubservercos.yuewen.com/F0C748/15367245605318506/epubprivate/OEBPS/Images/figure_0029_0001.jpg?sign=1738894709-ZL4S47Bwskv8xHiXN0h3BHaR11aQmXeC-0-1a2499053fd0cca52b713bac2062ccf9)
图2-2
一方面应用包含多种服务,这些服务有自己所依赖的库和软件包;另一方面存在多种部署环境,服务在运行时可能需要动态迁移到不同的环境中。这就产生了一个问题:如何让每种服务能够在所有的部署环境中顺利运行?
于是得到了如图2-3所示的这个矩阵。
![](https://epubservercos.yuewen.com/F0C748/15367245605318506/epubprivate/OEBPS/Images/figure_0030_0001.jpg?sign=1738894709-NQM3mJSrLSgR8FBiPW10YvN5NIiWactB-0-c48ee0cd73cbfb3eb5c287c535f42c9a)
图2-3
各种服务和环境通过排列组合产生了一个大矩阵。开发人员在编写代码时需要考虑不同的运行环境,运维人员则需要为不同的服务和平台配置环境。对他们双方来说,这都是一项困难而艰巨的任务。
如何解决这个问题呢?
聪明的技术人员从传统的运输行业找到了答案。
几十年前,运输业面临着类似的问题,如图2-4所示。
![](https://epubservercos.yuewen.com/F0C748/15367245605318506/epubprivate/OEBPS/Images/figure_0030_0002.jpg?sign=1738894709-TD4SNcWD9THu6WHDXIakisohexNCy3rI-0-c022c0761f360a2ad3daf7478e8a26f3)
图2-4
每一次运输,货主与承运方都会担心因货物类型的不同而导致损失,比如几个铁桶错误地压在了一堆香蕉上。另一方面,运输过程中需要使用不同的交通工具也让整个过程痛苦不堪:货物先装上车运到码头,卸货,然后装上船,到岸后又卸下船,再装上火车,到达目的地,最后卸货。一半以上的时间花费在装货、卸货上,而且搬上搬下还容易损坏货物。
这同样也是一个NxM的矩阵,如图2-5所示。
![](https://epubservercos.yuewen.com/F0C748/15367245605318506/epubprivate/OEBPS/Images/figure_0031_0001.jpg?sign=1738894709-6VPWilkUKFSn4LnNhkzySAyNkGPTUKKy-0-d1f505dcf68b23de1a9993c8c0408b9a)
图2-5
幸运的是,集装箱的发明解决了这个难题,如图2-6所示。
![](https://epubservercos.yuewen.com/F0C748/15367245605318506/epubprivate/OEBPS/Images/figure_0031_0002.jpg?sign=1738894709-GG7G7MdWU8jAjmDRUua7J3mKJt9Gh3pj-0-b0aada389b3f542f1bf682d2cb03dda3)
图2-6
任何货物,无论钢琴还是保时捷,都被放到各自的集装箱中。集装箱在整个运输过程中都是密封的,只有到达最终目的地才被打开。标准集装箱可以被高效地装卸、重叠和长途运输。现代化的起重机可以自动在卡车、轮船和火车之间移动集装箱。集装箱被誉为运输业与世界贸易最重要的发明,如图2-7所示。
![](https://epubservercos.yuewen.com/F0C748/15367245605318506/epubprivate/OEBPS/Images/figure_0032_0001.jpg?sign=1738894709-pQcETZJRSjPRhxm1g45exIE9BVDVgFyw-0-3e07653f21de89d305180b095609b479)
图2-7
Docker将集装箱思想运用到软件打包上,为代码提供了一个基于容器的标准化运输系统。Docker可以将任何应用及其依赖打包成一个轻量级、可移植、自包含的容器。容器可以运行在几乎所有的操作系统上,如图2-8所示。
![](https://epubservercos.yuewen.com/F0C748/15367245605318506/epubprivate/OEBPS/Images/figure_0032_0002.jpg?sign=1738894709-HbjfHnzXiY2IRMLNjVRXSltCgCXCRnBw-0-1dc7edd4328e8bbafdb53bea8b374e8e)
图2-8
其实,“集装箱”和“容器”对应的英文单词都是“Container”。
“容器”是国内约定俗成的叫法,可能是因为容器比集装箱更抽象,更适合软件领域的缘故吧。
我个人认为:在外国人的思维中,“Container”只用到了集装箱这一个意思,Docker的Logo(如图2-9所示)不就是一堆集装箱吗?
![](https://epubservercos.yuewen.com/F0C748/15367245605318506/epubprivate/OEBPS/Images/figure_0033_0001.jpg?sign=1738894709-FqW0LrpM3AS8bUyRrguXOsw1MRoq2r0Z-0-102ebbf39199169c794327662092b854)
图2-9
2.2.2 Docker的特性
可以看看集装箱思想是如何与Docker各种特性相对应的,如表2-1所示。
表2-1 集装箱与Docker的特性对比
![](https://epubservercos.yuewen.com/F0C748/15367245605318506/epubprivate/OEBPS/Images/figure_0033_0002.jpg?sign=1738894709-yiw7eHH3s8SDKgl01f3lS2SL2cgA9swA-0-e992389e5425b7dad2f9ef21a4852b9a)
2.2.3 容器的优势
对于开发人员:Build Once、Run Anywhere。
容器意味着环境隔离和可重复性。开发人员只需为应用创建一次运行环境,然后打包成容器便可在其他机器上运行。另外,容器环境与所在的Host环境是隔离的,就像虚拟机一样,但更快更简单。
对于运维人员:Configure Once、Run Anything。
只需要配置好标准的runtime环境,服务器就可以运行任何容器。这使得运维人员的工作变得更高效、一致和可重复。容器消除了开发、测试、生产环境的不一致性。