首页 > 其他分享 >一、Apache HDFS入门

一、Apache HDFS入门

时间:2025-01-16 18:32:03浏览次数:3  
标签:HDFS fs 入门 文件 hdfs hadoop Apache txt

HDFS基本概念

首先是一个==文件系统==,就是用来存储文件、存储数据。是大数据最底层一个服务。

其次是一个==分布式的文件系统==。分布式意味着多台机器存储。

场景互动:如何模拟实现分布式文件系统。

或者说一个==成熟的分布式==文件系统应该要具备哪些属性、功能呢?

1.分布式多台机器存储

2.记录元数据

3.分块存储

4.副本机制(备份)

1.分布式多台机器存储:

2.记录元数据:

3.分块存储:

4.副本机制(备份):

总结:

HDFS设计目标

1.具备故障检测和快速恢复的能力(容错)

2.面对海量数据的存储,注重吞吐能力,而不是交互式。(延迟高)

3.支持大文件存储(越大越开心)

4.一次写入,多次读取模型 (不支持修改操作)

5.异构存储、可移植性

  1. 硬件故障是常态, HDFS将有成百上千的服务器组成,每一个组成部分都有可能出现故障。因此故障的检测和自动快速恢复是HDFS的核心架构目标。
  2. HDFS上的应用与一般的应用不同,它们主要是以流式读取数据。HDFS被设计成适合批量处理,而不是用户交互式的。相较于数据访问的反应时间,更注重数据访问的高吞吐量。
  3. 典型的HDFS文件大小是GB到TB的级别。所以,HDFS被调整成支持大文件。它应该提供很高的聚合数据带宽,一个集群中支持数百个节点,一个集群中还应该支持千万级别的文件。
  4. 大部分HDFS应用对文件要求的是write-one-read-many访问模型。一个文件一旦创建、写入、关闭之后就不需要修改了。这一假设简化了数据一致性问题,使高吞吐量的数据访问成为可能。
  5. 移动计算的代价比之移动数据的代价低。一个应用请求的计算,离它操作的数据越近就越高效,这在数据达到海量级别的时候更是如此。将计算移动到数据附近,比之将数据移动到应用所在显然更好。
  6. 在异构的硬件和软件平台上的可移植性。这将推动需要大数据集的应用更广泛地采用HDFS作为平台。

HDFS重要特性

首先,它是一个文件系统,用于存储文件,通过统一的命名空间目录树来定位文件;

其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。

master|slaves 主从架构:

主角色:namenode  管理维护着元数据:目录树结构 文件 大小 副本 备份 位置信息
从角色:datanode  存储着最终的数据块

master/slave架构 HDFS采用master/slave架构。一般一个HDFS集群是有一个Namenode和一定数目的Datanode组成。 Namenode是HDFS集群主节点,Datanode是HDFS集群从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。

分块存储:

物理上把文件分开了。

block size =128M  134217728   hadoop2.x (hadoop1.x 64M)

e.g:
	1.txt 300M
		blk-1  0--128
		blk-2  128-256
		blk-3  256-300
	
	2.txt 100M
		blk-4  0--100

分块存储 HDFS中的文件在物理上是分块存储(block)的,块的大小可以通过配置参数来规定,默认大小在hadoop2.x版本中是128M。

副本机制:

默认是3副本。

1+2=3  本身一份 额外两份 最终3副本。

副本机制 为了容错,文件的所有block都会有副本。每个文件的block大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后改变。 副本数量也可以通过参数设置dfs.replication,默认是3。

namespace 名字空间 命名空间:

#namespace即“命名空间”,也称“名称空间” 

层次感结构  兼顾传统对应文件系统的认知  目录树结构
用户可以针对目录树进行文件夹、文件的增删改查。
统一的抽象目录树。

名字空间(NameSpace) HDFS支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。 Namenode负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被Namenode记录下来。 HDFS会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。

metadata 元数据:

元数据:记录数据的数据 描述性数据、解释性数据

对于HDFS来说,目录结构及文件分块位置信息叫做元数据。
元数据是有namenode维护的。

Namenode元数据管理 我们把目录结构及文件分块位置信息叫做元数据。Namenode负责维护整个hdfs文件系统的目录树结构,以及每一个文件所对应的block块信息(block的id,及所在的datanode服务器)。

Datanode数据存储 文件的各个block的具体存储管理由datanode节点承担。每一个block都可以在多个datanode上。Datanode需要定时向Namenode汇报自己持有的block信息。

write one read many(一次写入,多次读取):

hdfs的模式是一次写入多次读取  
hdfs没有随机修改编辑的操作  只能对已有的数据进行追加。
设计目标是这么决定的。

侧重于数据吞吐量 不注重实时交互性  意味着hdfs操作延迟很高。

一次写入,多次读出 HDFS是设计成适应一次写入,多次读出的场景,且不支持文件的修改。 正因为如此,HDFS适合用来做大数据分析的底层存储服务,并不适合用来做.网盘等应用,因为,修改不方便,延迟大,网络开销大,成本太高。

HDFS shell操作

Hadoop提供了文件系统的shell命令行客户端,使用方法如下:

hadoop  fs  <args>

文件系统shell包括与Hadoop分布式文件系统(HDFS)以及Hadoop支持的其他文件系统(如本地FS,HFTP FS,S3 FS等)直接交互的各种类似shell的命令。所有FS shell命令都将路径URI作为参数。

URI格式为scheme://authority/path。对于HDFS,该scheme是hdfs,对于本地FS,该scheme是file。scheme和authority是可选的。如果未指定,则使用配置中指定的默认方案。

对于HDFS,命令示例如下:

hadoop fs -ls  hdfs://namenode:host/parent/child

hadoop fs -ls  /parent/child    fs.defaultFS中有配置

对于本地文件系统,命令示例如下:

hadoop fs -ls file:///root/

如果使用的文件系统是HDFS,则使用hdfs dfs也是可以的,此时

hadoop fs <args> = hdfs dfs <args>

shell 命令解释
hadoop  fs <args>  文件系统的路径

#hadoop  fs可以操作的文件系统不仅仅有HDFS,还包括本地文件系统、GFS、TFS。
#如何区分操作访问的是什么文件系统呢?  根据文件系统协议

hadoop fs -ls hdfs://node1:8020/

hadoop fs -ls file:///
hadoop fs -ls gfs://

#如果不写协议 直接/目录 操作访问的是谁?
[root@node1 ~]# hadoop fs -ls /
Found 4 items
drwxr-xr-x   - root supergroup          0 2021-05-23 16:49 /itcast
drwx------   - root supergroup          0 2021-05-23 16:12 /tmp
drwxr-xr-x   - root supergroup          0 2021-05-23 16:12 /user
drwxr-xr-x   - root supergroup          0 2021-05-23 16:16 /wc

#默认是谁,取决于参数fs.defaultFS
<property>
        <name>fs.defaultFS</name>
        <value>hdfs://node1:8020</value>
</property>

#如果fs.defaultFS没有配置  默认的是file:///

#新旧命令  推荐使用hadoop fs
hadoop fs <args> = hdfs dfs <args>

Shell 命令选项

选项名称

使用格式

含义

-ls

-ls <路径>

查看指定路径的当前目录结构

-lsr

-lsr <路径>

递归查看指定路径的目录结构

-du

-du <路径>

统计目录下个文件大小

-dus

-dus <路径>

汇总统计目录下文件(夹)大小

-count

-count [-q] <路径>

统计文件(夹)数量

-mv

-mv <源路径> <目的路径>

移动

-cp

-cp <源路径> <目的路径>

复制

-rm

-rm [-skipTrash] <路径>

删除文件/空白文件夹

-rmr

-rmr [-skipTrash] <路径>

递归删除

-put

-put <多个linux上的文件> <hdfs路径>

上传文件

-copyFromLocal

-copyFromLocal <多个linux上的文件> <hdfs路径>

从本地复制

-moveFromLocal

-moveFromLocal <多个linux上的文件> <hdfs路径>

从本地移动

-getmerge

-getmerge <源路径> <linux路径>

合并到本地

-cat

-cat <hdfs路径>

查看文件内容

-text

-text <hdfs路径>

查看文件内容

-copyToLocal

-copyToLocal [-ignoreCrc] [-crc] [hdfs源路径] [linux目的路径]

从本地复制

-moveToLocal

-moveToLocal [-crc] <hdfs源路径> <linux目的路径>

从本地移动

-mkdir

-mkdir <hdfs路径>

创建空白文件夹

-setrep

-setrep [-R] [-w] <副本数> <路径>

修改副本数量

-touchz

-touchz <文件路径>

创建空白文件

-stat

-stat [format] <路径>

显示文件统计信息

-tail

-tail [-f] <文件>

查看文件尾部信息

-chmod

-chmod [-R] <权限模式> [路径]

修改权限

-chown

-chown [-R] [属主][:[属组]] 路径

修改属主

-chgrp

-chgrp [-R] 属组名称 路径

修改属组

-help

-help [命令选项]

帮助

shell常见命令操作
-ls

使用方法:hadoop fs -ls [-h] [-R] <args>

功能:显示文件、目录信息。

示例:hadoop fs -ls /user/hadoop/file1

-mkdir

使用方法:hadoop fs -mkdir [-p] <paths>

功能:在hdfs上创建目录,-p表示会创建路径中的各级父目录。

示例:hadoop fs -mkdir –p /user/hadoop/dir1

-put
使用方法:hadoop fs -put [-f] [-p] [ -|<localsrc1> .. ]. <dst>

功能:将单个src或多个srcs从本地文件系统复制到目标文件系统。

-p:保留访问和修改时间,所有权和权限。

-f:覆盖目的地(如果已经存在)

示例:hadoop fs -put -f localfile1 localfile2 /user/hadoop/hadoopdir

-get

使用方法:hadoop fs -get [-ignorecrc] [-crc] [-p] [-f] <src> <localdst>

-ignorecrc:跳过对下载文件的CRC检查。

-crc:为下载的文件写CRC校验和。

功能:将文件复制到本地文件系统。

示例:hadoop fs -get hdfs://host:port/user/hadoop/file localfile

-appendToFile

使用方法:hadoop fs -appendToFile <localsrc> ... <dst>

功能:追加一个文件到已经存在的文件末尾

示例:hadoop fs -appendToFile localfile  /hadoop/hadoopfile

-cat  

使用方法:hadoop fs -cat [-ignoreCrc] URI [URI ...]

功能:显示文件内容到stdout

示例:hadoop fs -cat  /hadoop/hadoopfile

-tail

使用方法:hadoop fs -tail [-f] URI

功能:将文件的最后一千字节内容显示到stdout。

-f选项将在文件增长时输出附加数据。

示例:hadoop  fs  -tail  /hadoop/hadoopfile

-chgrp

使用方法:hadoop fs -chgrp [-R] GROUP URI [URI ...]

功能:更改文件组的关联。用户必须是文件的所有者,否则是超级用户。

-R将使改变在目录结构下递归进行。

示例:hadoop fs -chgrp othergroup /hadoop/hadoopfile

-chmod

功能:改变文件的权限。使用-R将使改变在目录结构下递归进行。

示例:hadoop  fs  -chmod  666  /hadoop/hadoopfile

-chown

功能:改变文件的拥有者。使用-R将使改变在目录结构下递归进行。

示例:hadoop  fs  -chown  someuser:somegrp   /hadoop/hadoopfile

-cp              

功能:从hdfs的一个路径拷贝hdfs的另一个路径

示例: hadoop  fs  -cp  /aaa/jdk.tar.gz  /bbb/jdk.tar.gz.2

-mv                     

功能:在hdfs目录中移动文件

示例: hadoop  fs  -mv  /aaa/jdk.tar.gz  /

-getmerge    

功能:合并下载多个文件

示例:比如hdfs的目录 /aaa/下有多个文件:log.1, log.2,log.3,...

hadoop fs -getmerge /aaa/log.*  ./log.sum

-rm                

功能:删除指定的文件。只删除非空目录和文件。-r 递归删除。

示例:hadoop fs -rm -r /aaa/bbb/

-df               

功能:统计文件系统的可用空间信息

示例:hadoop  fs  -df  -h  /

-du

功能:显示目录中所有文件大小,当只指定一个文件时,显示此文件的大小。

示例:hadoop fs -du /user/hadoop/dir1

-setrep                

功能:改变一个文件的副本系数。-R选项用于递归改变目录下所有文件的副本系数。

示例:hadoop fs -setrep -w 3 -R /user/hadoop/dir1
# 查看指定目录下信息
hadoop fs -ls [-h] [-R] <args>
	-h 人性化显示
	-R 递归显示

#创建文件夹
hadoop fs -mkdir [-p] <paths>
	-p 创建父目录
	
#上传文件
hadoop fs -put src  dst
将单个 src 或多个 srcs 从本地文件系统复制到目标文件系统
	#src代表的是本地目录 所谓的本地指的是客户端所在的机器 
	#dst代表的是HDFS
	-p:保留访问和修改时间,所有权和权限。
	-f:覆盖目的地(如果已经存在)
	
hadoop fs -put file:///root/itcast.txt hdfs://node1:8020/itcast	

hadoop fs -put itcast.txt /itcast

#下载文件
hadoop fs -get  src  localdst
	#将文件复制到本地文件系统。
hadoop fs -get hdfs://node1:8020/itcast/itcast.txt file:///root/
hadoop fs -get /itcast/itcast.txt ./

#追加内容到文件尾部 appendToFile
[root@node3 ~]# echo 1 >> 1.txt
[root@node3 ~]# echo 2 >> 2.txt 
[root@node3 ~]# echo 3 >> 3.txt 
[root@node3 ~]# hadoop fs -put 1.txt /
[root@node3 ~]# hadoop fs -cat /1.txt
1
[root@node3 ~]# hadoop fs -appendToFile 2.txt 3.txt /1.txt
[root@node3 ~]# hadoop fs -cat /1.txt
1
2
3
[root@node3 ~]# 

#追加的用途:把本地的小文件上传中合并成为大文件 解决小文件场景的。

#文件内容的查看
cat 适合小文件
tail 将文件的最后一千字节内容显示到stdout  -f参数支持实时追踪查看

#权限 拥有者 所属组修改

	hdfs在设计的时候 借鉴模仿着linux权限管理模式
	也有所谓的读写执行 user group others  777
chgrp  修改所属组
chmod  修改权限
cgown  修改拥有者

hadoop fs -chmod 755 /1.txt

#文件移动 复制 删除
mv cp 
rm -r递归删除 


#合并下载 getmerge
合并下载多个文件  其功能和appendToFile相反的动作
[root@node3 ~]# hadoop fs -mkdir /small
[root@node3 ~]# hadoop fs -put *.txt /small
[root@node3 ~]# hadoop fs -getmerge /small/* ./merge.txt
[root@node3 ~]# cat merge.txt 

#统计HDFS可用空间  指定目录大小
[root@node3 ~]# hadoop fs -df -h /
Filesystem            Size   Used  Available  Use%
hdfs://node1:8020  111.1 G  5.0 M     98.3 G    0%

#修改文件的副本数
hadoop fs -setrep -w N -R   N就是修改之后的副本数
-w wait等待 修改副本客户端是否等待修改完毕再推出

[root@node3 ~]# hadoop fs -setrep 2 /small/1.txt
Replication 2 set: /small/1.txt

[root@node3 ~]# hadoop fs -setrep -w 2 /small/2.txt
Replication 2 set: /small/2.txt
Waiting for /small/2.txt ...
WARNING: the waiting time may be long for DECREASING the number of replications.
. done

#企业中避免使用setrep修改文件的副本数。
副本的修改操作可能会影响hdfs正常的读写服务请求。
因此在实际工作中 事先根据数据的重要性在上传之前就决定该文件的备份数是多少 避免线上修改。

HDFS工作机制

HDFS写数据流程:

详细步骤解析:

  1. client发起文件上传请求,通过RPC与NameNode建立通讯,NameNode检查目标文件是否已存在,父目录是否存在,返回是否可以上传;
  2. client请求第一个 block该传输到哪些DataNode服务器上;
  3. NameNode根据配置文件中指定的备份数量及副本放置策略进行文件分配,返回可用的DataNode的地址,如:A,B,C;

注:默认存储策略由BlockPlacementPolicyDefault类支持。也就是日常生活中提到最经典的3副本策略。

1st replica 如果写请求方所在机器是其中一个datanode,则直接存放在本地,否则随机在集群中选择一个datanode.

2nd replica 第二个副本存放于不同第一个副本的所在的机架.

3rd replica 第三个副本存放于第二个副本所在的机架,但是属于不同的节点

  1. client请求3台DataNode中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将整个pipeline建立完成,后逐级返回client;
  2. client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位(默认64K),A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答。
  3. 数据被分割成一个个packet数据包在pipeline上依次传输,在pipeline反方向上,逐个发送ack(命令正确应答),最终由pipeline中第一个DataNode节点A将pipeline ack发送给client;
  4. 当一个block传输完成之后,client再次请求NameNode上传第二个block到服务器。

HDFS读数据流程

详细步骤解析:

  1. Client向NameNode发起RPC请求,来确定请求文件block所在的位置;
  2. NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode都会返回含有该block副本的DataNode地址;
  3. 这些返回的DN地址,会按照集群拓扑结构得出DataNode与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离Client近的排靠前;心跳机制中超时汇报的DN状态为STALE,这样的排靠后;
  4. Client选取排序靠前的DataNode来读取block,如果客户端本身就是DataNode,那么将从本地直接获取数据;
  5. 底层上本质是建立FSDataInputStream,重复的调用父类DataInputStream的read方法,直到这个块上的数据读取完毕;一旦到达块的末尾,DFSInputStream 关​​闭连接并继续定位下一个块的下一个 DataNode;
  6. 当读完列表的block后,若文件读取还没有结束,客户端会继续向NameNode获取下一批的block列表;一旦客户端完成读取,它就会调用 close() 方法。
  7. 读取完一个block都会进行checksum验证,如果读取DataNode时出现错误,客户端会通知NameNode,然后再从下一个拥有该block副本的DataNode继续读。
  8. NameNode只是返回Client请求包含块的DataNode地址,并不是返回请求块的数据;
  9. 最终读取来所有的block会合并成一个完整的最终文件。

NameNode与DataNode通信机制

dn启动时

#datanode向nameNode进行注册 并行汇报自己持有数据块信息

注册表示自己启动成功 汇报是高速namenode自己保存了哪些数据块

dn后续工作时

#心跳机制
datanode每隔3S向namenode进行心跳 目的:报活   dfs.heartbeat.interval

#数据块汇报机制 blockreport
datanode每隔6小时向nameNode进行数据块汇报自己数据块信息 dfs.blockreport.intervalMsec

secondary namenode

NameNode职责是管理元数据信息,DataNode的职责是负责数据具体存储,那么SecondaryNameNode的作用是什么?对很多初学者来说是非常迷惑的。它为什么会出现在HDFS中。从它的名字上看,它给人的感觉就像是NameNode的备份。但它实际上却不是。

大家猜想一下,当HDFS集群运行一段事件后,就会出现下面一些问题:

  1. edit logs文件会变的很大,怎么去管理这个文件是一个挑战。
  2. NameNode重启会花费很长时间,因为有很多改动要合并到fsimage文件上。
  3. 如果NameNode挂掉了,那就丢失了一些改动。因为此时的fsimage文件非常旧。

因此为了克服这个问题,我们需要一个易于管理的机制来帮助我们减小edit logs文件的大小和得到一个最新的fsimage文件,这样也会减小在NameNode上的压力。这跟Windows的恢复点是非常像的,Windows的恢复点机制允许我们对OS进行快照,这样当系统发生问题时,我们能够回滚到最新的一次恢复点上。

SecondaryNameNode就是来帮助解决上述问题的,它的职责是合并NameNode的edit logs到fsimage文件中。

标签:HDFS,fs,入门,文件,hdfs,hadoop,Apache,txt
From: https://blog.csdn.net/2301_80678122/article/details/145167384

相关文章

  • 【前端入门】应该了解和知道的几个国内外前端开发资源网站
    与大家分享一下几个国内外前端开发资源网站国际资源MDNWebDocs(MozillaDeveloperNetwork)用途:MDN是Web技术领域最全面的文档库之一,涵盖了HTML、CSS、JavaScript以及浏览器API等。链接: https://developer.mozilla.orgW3Schools用途:适合初学者学习Web技术,提供从......
  • 【python入门】2.安装搭建python环境
    1.安装python解析器1.1为什么要装python解析器?python属于高级语言,计算机并不认识我们需要用解析器,将python文件,经过python解析器翻译成,计算机能够识别的机器语言1.2如何安装下载地址:PythonReleasePython3.7.9|Python.org检验安装完成在cmd中输入python,若出......
  • 市面上唯一一本全面解析Transformer的书《Transformer、BERT、GPT 大语言模型原理深度
    Transformer,BERT,andGPT:IncludingChatGPTandPromptEngineering,出版于2023年11月,作者是奥斯瓦尔德·坎佩萨托(OswaldCampesato)奥斯瓦尔德·坎佩萨托(OswaldCampesato):专门研究深度学习、Java、Android和TensorFlow。他是25本书的作者/合著者,其中包括TensorF......
  • 从零到手搓一个Agent:AI Agents新手入门精通(一)
    今日主题:当什么是Agent,与LLM的区别又是啥这一天,你的女朋友问你(假设我们有女朋友),宝宝,什么是Agent啊,Agent和LLM有什么区别呀,最近大家都在说的Agent究竟是什么,包括很多文章都在写的Agent,还有之前谷歌发布的Agents白皮书究竟是什么,对我们有什么帮助,对我们有什么影响呢?现在,编者......
  • Kubernetes (K8s) 入门指南
    Kubernetes(K8s)入门指南什么是Kubernetes?Kubernetes,通常简称为K8s(因为从“K”到“s”之间有八个字符),是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它最初由谷歌设计,并在2014年捐赠给了云原生计算基金会(CNCF)。Kubernetes建立在谷歌多年来......
  • 入门网络安全工程师要学习哪些内容_网络安全工程师需要学什么考什么证
    大家都知道网络安全行业很火,这个行业因为国家政策趋势正在大力发展,大有可为!但很多人对网络安全工程师还是不了解,不知道网络安全工程师需要学什么?知了堂小编总结出以下要点。网络安全工程师是一个概称,学习的东西很多,具体学什么看自己以后的职业定位。如果你以后想成为安......
  • 成为一名厉害的黑客,必须知道的12个步骤,黑客入门
         黑客攻防是一个极具魅力的技术领域,但成为一名黑客毫无疑问也并不容易。你必须拥有对新技术的好奇心和积极的学习态度,具备很深的计算机系统、编程语言和操作系统知识,并乐意不断地去学习和进步。如果你想成为一名优秀的黑客,下面是10种最重要的基础条件,请认真阅......
  • 探秘AutoGen框架:从入门到实践的全攻略(25/30)
    一、引言在人工智能技术日新月异的当下,多智能体协作与大型语言模型(LLM)的应用日益广泛。微软推出的AutoGen框架,犹如一颗璀璨的新星,为开发者们提供了一个强大的工具,以实现高效的多智能体对话和复杂任务的自动化处理。AutoGen框架致力于简化多智能体系统的开发过程,使开发者能......
  • 计算机科学极简入门指南总览
    最重要的阅读本教程,请牢记四句话,以后将不时提到,都很简单。若现在不懂没有关系,感触将随着教程推进越来越深。现阶段,这几句话只需要死记硬背,以后会自行理解。内容如下:懒是人类进步的第一动力。在计算机科学里,没有什么问题是加一层解决不了的。人类所有知识都来源于好......
  • docker 入门到实战
    一、Docker能解决什么问题?Docker作为一种容器化技术,能够解决多种软件开发和运维中的问题,主要包括:1.环境一致性:确保开发、测试和生产环境的一致性,避免“在我机器上可以运行”的问题。2.依赖管理:容器封装了应用及其所有依赖,使得应用可以在任何支持Docker的环境中运行,无需担......