大数据技术基础
上QQ阅读APP看书,第一时间看更新

1.2 大数据处理的基础技术

大数据的存储、处理与分析依赖于分布式计算机系统,理解分布式系统基本理论对掌握以Hadoop为代表的计算机分布式系统体系架构、MapReduce分布式计算框架以及HDFS分布式文件系统有重要帮助。

分布式计算机系统是指由多台分散的、硬件自治的计算机,经过互联的网络连接而形成的系统,系统的处理和控制功能分布在各个计算机上。分布式系统由许多独立的、可协同工作的CPU组成,从用户的角度看,整个系统更像一台独立的计算机。分布式系统是从分散处理的概念出发来组织计算机系统,冲破了传统的集中式单机局面,具有较高的性价比,灵活的系统可扩展性,良好的实时性、可靠性与容错性。

此外,组成分布式系统的各计算机节点由分布式操作系统管理,以便让各个节点共同承担整个计算功能。分布式操作系统由内核以及提供各种系统功能的模块和进程组成,不仅包括了单机操作系统的主要功能,还包括分布式进程通信、分布式文件系统、分布式进程迁移、分布式进程同步和分布式进程死锁等功能。系统中的每一台计算机都保存分布式操作系统的内核,以实现对计算机系统的基本控制。常见的分布式系统有分布式计算系统、分布式文件系统和分布式数据库系统等。

下面先介绍大数据的处理流程,然后简要介绍与大数据处理流程相关的基础技术,如分布式技术、数据库技术和云计算技术等。

1.2.1 大数据处理流程

一般而言,大数据处理流程可分为四步:数据采集、数据清洗与预处理、数据统计分析和挖掘、结果可视化,如图1.3所示。这四个步骤看起来与现在的数据处理分析没有太大区别,但实际上数据集更大,相互之间的关联更多,需要的计算量也更大,通常需要在分布式系统上,利用分布式计算完成。

图1.3 大数据处理流程

1.数据采集

数据的采集一般采用ETL(Extract-Transform-Load)工具将分布的、异构数据源中的数据(如关系数据、平面数据以及其他非结构化数据等)抽取到临时文件或数据库中。大数据的采集不是抽样调查,它强调数据尽可能完整和全面,尽量保证每一个数据准确有用。

2.数据清洗与预处理

采集好的数据,肯定有不少是重复的或无用的,此时需要对数据进行简单的清洗和预处理,使得不同来源的数据整合成一致的、适合数据分析算法和工具读取的数据,如数据去重、异常处理和数据归一化等,然后将这些数据存储到大型分布式数据库或者分布式存储集群中。

3.数据统计分析和挖掘

统计分析需要使用工具(如SPSS工具、一些结构算法模型)来进行分类汇总。这个过程最大的特点是目的清晰,按照一定规则去分类汇总,才能得到有效的分析结果。这部分处理工作需要大量的系统资源。

分析数据的最终目的是通过数据来挖掘数据背后的联系,分析原因,找出规律,然后应用到实际业务中。与统计分析过程不同的是,数据挖掘一般没有什么预先设定好的主题,主要是在现有数据上面进行基于各种算法的计算,通过分析结果达到预测趋势的目的,以满足一些高级别数据分析的需求。比较典型的算法有用于聚类的Kmeans、用于统计学习的SVM和用于分类的NaiveBayes,主要使用的工具有Hadoop的Mahout等。

4.结果可视化

大数据分析最基本的要求是结果可视化,因为可视化结果能够直观地呈现大数据的特点,非常容易被用户所接受,就如同看图说话一样简单明了。

大数据处理流程基本是这四个步骤,不过其中的处理细节、工具的使用、数据的完整性等需要结合业务和行业特点而不断变化更新。

1.2.2 分布式计算

分布式计算是相对于集中式计算而言的,它将需要进行大量计算的项目数据分割成小块,由分布式系统中多台计算机节点分别计算,再合并计算结果并得出统一的数据结论。要达到分布式计算的目的,需要编写能在分布式系统上运行的分布式计算机程序。分布式程序可以基于通用的并行分布式程序开发接口进行设计,例如MPI、Corba、OpenMP、MapReduce和Spark等。

分布式计算的目的在于分析海量的数据,例如,从雷达监测的海量历史信号中分析异常信号,淘宝“双十一”实时计算各地区的消费习惯等。SETI@home是比较有代表性的分布式计算项目,是由美国加州大学伯克利分校创立的一项利用全球联网的计算机共同搜寻地外文明(SETI)的科学实验计划。该项目通过互联网进行数据传输,利用世界各地志愿者计算机的闲置计算能力,分析地外无线电信号,搜索外星生命迹象。该项目数据基数很大,有着千万位数的数据量,已有百余万志愿者加入这个项目。他们通过运行一个免费程序下载并分析从射电望远镜传来的数据。

人们最初是通过提高单机计算能力性能(如使用大型机、超级计算机)来处理海量数据。但由于单机的性能无法跟上数据爆发式增长的需要,分布式计算应运而生。由于计算需要拆分在多个计算机上并行运行,也会出现一致性、数据完整性、通信、容灾、任务调度等一系列问题。

术语“分布式计算(Distributed Computing)”与“并行计算(Parallel Computing)”没有特别明确的区别,同一个系统可能同时被特指为“并行的(Parallel)”和“分布式的(Distributed)”。一个典型的分布式系统中的各处理器是以并行的形式运作的,可以称为并行分布式计算(Parallel Distributed Computing)。此时,并行计算也可能以分布式计算的一种密集形式出现,而分布式计算也可能以并行计算的一种较松散形式出现。不过,可利用下列标准粗略地将“并行系统”与“分布式系统”区分开。

(1)若所有的处理器共享内存,共享的内存可以让多个处理器彼此交换信息,是并行计算。

(2)若每个处理器都有其独享的内存(分布式内存),数据交换通过处理器跨网络完成信息传递,则为分布式计算或分布式并行计算。

1.2.3 分布式文件系统

分布式文件系统是将数据分散存储在多台独立的设备上,采用可扩展的系统结构,多台存储服务器分担存储负荷,利用元数据定位数据在服务器中的存储位置,具有较高的系统可靠性、可用性和存取效率,并且易于扩展。而传统的网络存储系统则采用集中的存储服务器存放所有数据,这样存储服务器就成为了整个系统的瓶颈,也成为了可靠性和安全性的焦点,不能满足大数据存储应用的需要。

分布式文件系统利用分布式技术将标准X86服务器的本地HDD、SSD等存储介质组织成一个大规模存储资源池,同时,对上层的应用和虚拟机提供工业界标准的SCSI、i SCSI和对象访问接口,进而打造一个虚拟的分布式统一存储产品。常见的分布式存储系统有谷歌的GFS系统、Hadoop的HDFS系统、加州大学圣克鲁兹分校提出的Ceph系统等。

分布式文件系统的关键技术如下。

1.元数据管理

元数据(Metadata)为描述数据的数据,主要是描述数据属性的信息,用来支持存储位置描述、历史数据描述、资源查找、文件记录等功能。

在大数据环境下,要求数据分布式存储,描述数据的元数据的体量也会非常大,所以如何管理好元数据、并保证元数据的存取性能是整个分布式文件系统性能的关键。集中式管理架构和分布式管理架构是两种常见的元数据管理方式。集中式元数据管理采用单一的元数据服务器框架,实现简单,但是存在单点故障等问题。分布式元数据管理则将元数据分散在多个节点上,解决了元数据服务器的性能瓶颈等问题,并提高了元数据管理的可扩展性,但实现较为复杂,并引入了元数据一致性的问题。

另外,可以通过在线算法组织数据,建立无元数据服务器的分布式架构,但是该架构实现复杂,而且很难保证数据一致性,文件目录遍历操作的效率低下,缺乏文件系统全局监控管理功能。

2.系统高可扩展技术

在大数据环境下,数据规模的增长和复杂度的增加往往成指数上升,这对系统的扩展性提出了较高的要求。实现存储系统的高可扩展性需要解决元数据的分配和数据的透明迁移两个方面的问题。元数据的分配主要通过静态子树划分技术实现,透明迁移则侧重数据迁移算法的优化。

大数据存储体系规模庞大,节点失效率高,因此还需要提供一定的自适应管理功能。系统必须能够根据数据量和计算的工作量估算所需要的节点个数,并动态地将数据在节点间进行迁移,以实现负载均衡;在节点失效时,数据必须能够通过副本等机制进行恢复,不能对上层应用产生影响。

3.存储层级内的优化技术

大数据的规模大,因此需要在保证系统性能的前提下,降低系统能耗和构建成本,即从性能和成本两个角度对存储层次进行优化,数据访问局部性原理是进行这两方面优化的重要依据,通常采用多层不同性价比的存储器件组成存储层次结构。从提高性能的角度,可以通过分析应用特征,识别热点数据并对其进行缓存或预取,通过高效的缓存预取算法和合理的缓存容量配比,以提高访问性能。从降低成本的角度,采用信息生命周期管理方法,将访问频率低的冷数据迁移到低速廉价存储设备上,可以在小幅牺牲系统整体性能的基础上,大幅降低系统的构建成本和能耗。

4.针对应用和负载的存储优化技术

针对应用和负载来优化存储,就是将数据存储与应用耦合,简化或扩展分布式文件系统的功能,根据特定应用、特定负载、特定的计算模型对文件系统进行定制和深度优化,使应用达到最佳性能。这类优化技术可在诸如谷歌、Facebook等互联网公司的内部存储系统上,高效地管理超过千万亿字节级别的大数据。

1.2.4 分布式数据库

分布式数据库的基本思想是将原来集中式数据库中的数据分散存储到多个通过网络连接的数据存储节点上,以获取更大的存储容量和更高的并发访问量。分布式数据库系统可以由多个异构、位置分布、跨网络的计算机节点组成。每台计算机节点中都可以有数据库管理系统的一份完整或部分拷贝副本,并具有自己局部的数据库。多台计算机节点利用高速计算机网络将物理上分散的多个数据存储单元相互连接起来,共同组成一个完整的、全局的、逻辑上集中、物理上分布的大型数据库系统。

随着数据量的高速增长,分布式数据库技术得到了快速的发展。传统的关系型数据库开始从集中式模型向分布式架构发展,基于关系型的分布式数据库在保留了传统数据库的数据模型和基本特征下,从集中式存储走向分布式存储,从集中式计算走向分布式计算。

为了快速处理海量的数据,分布式数据库系统在数据压缩和读写方面进行了优化,并行加载技术和行列压缩存储技术是两种常用技术。并行加载技术利用并行数据流引擎,数据加载完全并行,并且可以直接通过SQL语句对外部表进行操作。行列压缩存储技术的压缩表通过利用空闲的CPU资源而减少I/O资源占用,除了支持主流的行存储模式外,还支持列存储模式。如果常用的查询中只取表中少量字段,则列模式效率更高;如果需要取表中的大量字段,则行模式效率更高,可以根据不同的应用需求提高查询效率。

应对大数据处理的分布式数据库系统可以归纳为关系型和非关系型两种。随着数据量越来越大,关系型数据库开始在高可扩展性、高并发性等方面暴露出一些难以克服的缺点,而Key-Value存储系统、文档型数据库等NoSQL非关系型数据库,逐渐成为大数据时代下分布式数据库领域的主力,如HBase、MongoDB、VoltDB、ScaleBase等。

适应于大数据存储的分布式数据库应具有高可扩展性、高并发性、高可用性三方面的特征。

(1)高可扩展性:分布式数据库具有高可扩展性,能够动态地增添存储节点以实现存储容量的线性扩展。

(2)高并发性:分布式数据库能及时响应大规模用户的读/写请求,能对海量数据进行随机读/写。

(3)高可用性:分布式数据库提供容错机制,能够实现对数据的冗余备份,保证数据和服务的高度可靠性。

1.2.5 数据库与数据仓库

数据库和数据仓库在概念上有很多相似之处,但是有本质上的差别。数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策。而数据库是按照一定数据结构来组织、存储和管理数据的数据集合。数据仓库所在层面比数据库更高,换言之,一个数据仓库可以采用不同种类的数据库实现。两者差异主要归结为以下几点:

(1)在结构设计上,数据库主要面向事务设计,数据仓库主要面向主题设计。所谓面向主题设计,是指数据仓库中的数据按照一定的主题域进行组织;

(2)在存储内容上,数据库一般存储的是在线数据,对数据的变更历史往往不存储,而数据仓库一般存储的是历史数据,以支持分析决策;

(3)在冗余上,数据库设计尽量避免冗余以维持高效快速的存取,数据仓库往往有意引入冗余;

(4)在使用目的上,数据库的引入是为了捕获和存取数据,数据仓库是为了分析数据。

在大数据处理分析方面,往往沿着从非结构数据中抽取特定结构化数据存储在关系数据库中,再从关系数据库抽取数据形成数据仓库,以支持最终的决策与分析从而体现大数据的价值。

1.2.6 云计算与虚拟化技术

云计算是硬件资源的虚拟化,而大数据是海量数据的高效处理,云计算作为计算资源的底层,支撑着上层的大数据存储和处理。本小节将概要介绍云计算、虚拟化及它们的关系。

1.云计算

云计算(Cloud Computing)是基于互联网的相关服务的增加、使用和交付模式,通常涉及通过互联网来提供动态、易扩展且虚拟化的资源。云是网络、互联网的一种比喻说法。以前往往用云来表示电信网,后来也用来表示互联网和底层基础设施的抽象。因此,云计算甚至可以让你体验每秒10万亿次的运算能力,这么强大的计算能力甚至于可以模拟核爆炸、预测气候变化和市场发展趋势等。用户只需通过PC、笔记本电脑、手机等方式接入云端,就可按自己的需求进行运算。

对云计算的定义有多种说法,现阶段被业界广为接受的是美国国家标准与技术研究院(National Institute of Standards and Technology,NIST)给出的定义:云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问,进入可配置的计算资源共享池(资源包括网络、服务器、存储、应用软件和服务)。用户只需投入较少的管理工作,或与服务供应商进行轻量级的交互,就能快速获取这些资源。

2.虚拟化

虚拟化一般是指将物理的实体,通过软件模式,形成若干虚拟存在的系统,其实际运作还是在实体上,只是划分了若干区域或者时域。虚拟化大致分为四类:内存虚拟化、网络虚拟化、存储虚拟化、服务器虚拟化。

内存虚拟化:是指利用虚拟化技术实现对计算机内存的管理。从上层应用来看,内存虚拟化系统使得其具有连续可用的内存,即一个连续而完整的地址空间。从物理层来看,通常被分割成多个物理内存碎片。内存虚拟化的作用更多的是满足对内存的分配,对必要的数据进行交换。

存储虚拟化:存储虚拟化是将存储资源的逻辑视图和物理存储分离,从而为系统提供无缝的资源管理。由于存储标准化程度低,存储兼容是必须要考虑的一个问题,如果存储虚拟化技术源自不同的厂商,那么,就会增加后续升级和更新的难度。

网络虚拟化:网络虚拟化是利用软件从物理网络元素中分离网络的一种方式,网络虚拟化与其他形式的虚拟化有很多共同之处。网络虚拟化也面临着技术挑战,网络设备和服务器不同,一般需要执行高I/O任务,在数据处理方面往往有专用的硬件模块。

服务器虚拟化:服务器虚拟化是将服务器的CPU、内存、磁盘等硬件集中管理,通过集中式的动态按需分配,提高资源的利用率。

KVM(Kernel-based Virtual Machine)虚拟机是开源Linux原生的全虚拟化解决方案,它基于X86硬件的虚拟化扩展(Intel VT或者AMD-V技术)。在KVM中,虚拟机被实现为常规的Linux进程,由标准Linux调度程序进行调度;而虚拟机的每个虚拟CPU则被实现为一个常规的Linux进程。这使得KMV能够使用Linux 内核的已有功能。

3.云计算与虚拟化的关系

云计算是个概念,而不是具体技术。虚拟化是一种具体技术,指把硬件资源虚拟化,实现隔离性、可扩展性、安全性、资源可充分利用等。这两者之间看似不相关,但背后却依然有千丝万缕的联系。云计算的基础是虚拟化,但虚拟化只是云计算的一部分,云计算是在虚拟化出若干资源池以后的应用。

基于上面的观点,很多人认为虚拟化不过是云计算的基础,是云计算快速发展的嫁衣,助推了云计算的发展,而且虚拟化只是云计算后面的一个小小的助推力。其实,虚拟化并不只有这些作用,虚拟化广泛应用于IT领域中,针对不同的资源,有着相应的虚拟化技术。云计算的原理更多的是利用了虚拟化,但是虚拟化并不仅仅只服务云计算。

1.2.7 虚拟化产品介绍

1.VMware

VMware是全球桌面到数据中心虚拟化解决方案的领导厂商,在虚拟化和云计算基础架构领域处于全球领先地位,VMware工作站(VMware Workstation)是VMware公司的商业软件产品之一,该工作站软件包含一个用于英特尔X86兼容计算机的虚拟机套装,允许多个X86虚拟机同时被创建和运行,每个虚拟机实例可以运行自己的客户机操作系统,如Windows、Linux、BSD变生版本。

运行VMware工作站进程的计算机和操作系统实例被称为宿主机,在一个虚拟机中运行的操作系统实例被称为虚拟机客户(又称客户机)。类似仿真器,VMware工作站为客户操作系统提供完全虚拟化的硬件集。例如,客户机只会检测到一个AMD PCnet网络适配器,而和宿主机上真正安装的网络适配器的制造商和型号无关。VMware在虚拟环境中将所有设备都虚拟化了,包括显卡、网卡和硬盘,它还为串行和并行设备提供传递驱动程序(Pass-Through Drivers),通过该驱动程序可以将对这些虚拟设备的访问传递到真实物理设备。

由于与宿主机的真实硬件无关,虚拟机使用的都是相同的硬件驱动程序,因此虚拟机对各种计算机都是高度可移植的。例如,一个运行中的虚拟机可以被暂停下来,并被拷贝到另外一台作为宿主机的真实计算机上,然后从其被暂停的确切位置恢复运行。借助VMware的VirtualCenter产品中的Vmotion功能,甚至可以在移动一个虚拟机时不必将其暂停就可以向不同的宿主机上进行移植。

2.VirtualBox

VirtualBox是由德国Innotek公司开发,由Sun Microsystems公司出品的软件,在Sun公司被Oracle公司收购后正式更名成Oracle VM VirtualBox。Innotek以GNU General Public License(GPL)发布VirtualBox,并提供二进制版本及OSE版本的代码。使用者可以在VirtualBox上安装并且执行Solaris、Windows、DOS、Linux、OS/2 Warp、BSD等系统作为客户端操作系统。现在则由Oracle公司进行开发,是Oracle公司xVM虚拟化平台技术的一部分。

VirtualBox号称是最强的免费虚拟机软件,它不仅特色明显,而且性能也很优异,简单易用。与同性质的VMware及Virtual PC相比,VirtualBox的独到之处包括远端桌面协定(RDP)、对iSCSI及USB的支持等。

本书采用VirtualBox搭建实验环境,详见2.4节。

3.OpenStack

OpenStack是一个由美国国家航空航天局(NASA)和Rackspace合作研发并发起的项目,是一个开源的云计算平台,由来自世界各地的云计算开发人员共同创建。OpenStack通过一组相关的服务提供一个简单,大规模可伸缩,功能丰富的基础设施,即服务(IaaS)解决方案,其各组件之间的关系如图1.4所示。

图1.4 OpenStack架构图

(1)Keystone认证服务

Keystone 管理用户目录以及用户可以访问的OpenStack服务的目录,其目的是跨所有OpenStack组件暴露一个中央身份验证机制。Keystone本身没有提供身份验证,但它可以集成其他各种目录服务,如Pluggable Authentication Module、Lightweight Directory Access Protocol(LDAP)或OAuth。通过这些插件,它能够实现多种形式的身份验证,包括简单的用户名密码和复杂的多因子系统。

(2)Nova计算服务

Nova控制云计算架构(基础架构服务的核心组件),它是用Python编写的,创建了一个抽象层,让CPU、内存、网络适配器和硬盘驱动器等服务器资源实现虚拟化管理(但并不实现具体的虚拟化技术),并具有提高利用率和自动化的功能。它的实时VM管理具有启动、调整大小、挂起、停止和重新引导的功能。这是通过集成一组受支持的虚拟机管理程序来实现的。还有一个机制可以在计算节点上缓存VM镜像,以实现更快的配置。在运行镜像时,可以通过应用程序编程接口(API)以编程方式存储和管理文件。

(3)Neutron网络服务

Neutron提供了管理局域网的能力,具有适用于虚拟局域网(VLAN)、动态主机配置协议和IPv6的一些功能。用户可以定义网络、子网和路由器,以配置其内部拓扑,然后向这些网络分配IP地址和VLAN,浮动IP地址允许用户向VM分配(和再分配)固定的外部IP地址。

(4)Swift对象存储服务

Swift是一个分布式存储系统,主要用于静态数据,比如VM镜像、备份和存档,将文件和其他对象写入可能分布在一个或多个数据中心的一组磁盘驱动器,在整个集群内确保数据复制和完整性。

(5)Glance镜像服务

Glance为VM镜像提供了支持,除了发现、注册和激活服务之外,它还有快照和备份功能。Glance镜像可以充当模板,快速并且一致地部署新的服务器,其API服务器提供具象状态传输(Representational State Transfer,REST)接口,用户可以利用它来列出并获取可分配给一组可扩展后端存储(包括OpenStack Object Storage)的虚拟磁盘镜像。

(6)Cinder块存储服务

Cinder管理计算实例所使用的块级存储,块存储非常适用于有严格性能约束的场景,比如数据库和文件系统。与Cinder配合使用的最常见存储是Linux服务器存储,但也有一些面向其他平台的插件,其中包括Ceph、NetApp、Nexenta和SolidFire。

(7)Horizon Web界面管理服务

Horizon Web是图形用户界面,管理员可以很方便地使用它来管理所有项目。

4.Docker

Docker是一个开源的引擎,可以轻松地为任何应用创建一个轻量级的、可移植的、自给自足的容器,通过容器可以在生产环境中批量地部署,包括VM(虚拟机)、BareMetal、OpenStack集群和其他基础的应用平台。

Docker可以解决虚拟机能够解决的问题,同时也能够解决虚拟机由于资源要求过高而无法解决的问题。利用Docker可以隔离应用依赖,创建应用镜像并进行复制,允许实例简单、快速地扩展, Docker背后的想法就是创建软件程序可移植的轻量级容器,让其可以在任何安装了Docker的机器上运行,而不用关心底层操作系统。下面介绍Docker中最为重要的几个概念。

(1)镜像

Docker的镜像类似虚拟机的快照,但更轻量。创建Docker镜像有很多方式,多数是在一个现有镜像基础上创建新镜像,在一个文件中指定一个基础镜像及完成需要的修改;或者通过运行一个镜像,对其进行修改并提交。镜像拥有唯一的ID,以及一个供人阅读的名字和标签对。

(2)容器

制作好镜像后,就可以从镜像中创建容器了,这相当于从快照中创建虚拟机一样,不过更轻量,应用是由容器运行的。

容器与虚拟机一样,是隔离的,它们也拥有一个唯一的ID和唯一的供人阅读的名字。容器对外公开服务是必要的,因此Docker允许公开容器的特定端口。与虚拟机相比,容器有一个很大的差异,它们被设计用来运行单进程,无法很好地模拟一个完整的环境,Docker设计者极力推崇“一个容器一个进程的方式”。

容器是设计用来运行一个应用的,而非一台机器。你也可以把容器当作虚拟机使用,但是会失去很多灵活性,因为Docker提供了用于分离应用与数据的工具,使得你可以快捷地更新运行中的代码/系统,而不影响数据。

(3)数据卷

数据卷可以使一些数据在不受容器生命周期的影响下进行数据持久化。数据卷表现为容器内的空间,但实际保存在容器之外,从而允许用户在不影响数据的情况下销毁、重建、修改、丢弃容器。Docker允许用户定义应用部分和数据部分,并提供工具将它们分开,使用Docker的思想是:容器应该是短暂和一次性的。

卷是针对容器的,用户可以使用同一个镜像创建多个容器并定义不同的卷。卷保存在运行Docker的宿主机文件系统上,用户可以指定卷存放的目录,或让Docker保存在默认位置。卷还可以用来在容器间共享数据。

(4)链接

容器启动时,将被分配一个随机的私有IP,其他容器可以通过这个IP与其进行通信,这样就为容器间的相互通信提供了渠道。要开启容器间的通信,Docker允许用户在创建一个新容器的时候引用其他现存容器,在刚创建的容器里被引用的容器将获得一个别名,就使两个容器就链接到了一起。Docker要求声明容器在被链接时要开放哪些端口给其他容器,否则将没有端口可用。