参考
Docker部署Hadoop-01-Docker安装
Docker部署Hadoop-02-Docker常见操作
Docker部署Hadoop-03-Docker部署Hadoop

已配置Hadoop三容器(master/worker01/worker02)打包传输&同事复现完整教程
本教程基于已配置完成、可正常运行WordCount 的Hadoop三容器环境,从重启容器验证 开始,到打包镜像、传输文件、同事导入复现全流程,步骤无冗余,可直接按命令执行,确保同事能1:1复现你的Hadoop集群环境。
前提说明
- 你的环境:Ubuntu宿主机、已创建
hadoop-net网络、三个容器(master/worker01/worker02)已配置好Hadoop+SSH免密+WordCount可运行; - 核心逻辑:容器无法直接传输,将每个运行正常的容器打包为独立镜像(保留所有配置/环境),同事导入镜像后,用相同命令重建容器即可;
- 传输文件:仅需传输3个镜像压缩包+1个一键启动脚本,同事无需再做任何配置。
第一部分:你的操作------重启容器验证+打包镜像+制作启动脚本
步骤1:重启Hadoop三容器并验证运行状态
确保容器重启后仍能正常运行,避免打包"有问题的容器"
bash
# 1. 启动所有容器(按master→worker01→worker02顺序)
docker start master worker01 worker02
# 2. 验证容器是否正常启动(STATUS列显示Up即为正常)
docker ps | grep -E "master|worker01|worker02"
# 3. 进入master容器,验证Hadoop集群是否正常(可选,确保万无一失)
docker exec -it master bash
# 验证jps进程(master应有NameNode/SecondaryNameNode/ResourceManager)
jps
# 验证Worker节点通信(免密登录worker01,无密码提示即为正常)
ssh worker01 hostname
# 验证WordCount(可选,快速跑一遍)
hdfs dfs -rm -r /user/root/output
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount \
-Dmapreduce.application.classpath=$(hadoop classpath) \
-Dyarn.app.mapreduce.am.env="HADOOP_MAPRED_HOME=/usr/local/hadoop" \
-Dmapreduce.map.env="HADOOP_MAPRED_HOME=/usr/local/hadoop" \
-Dmapreduce.reduce.env="HADOOP_MAPRED_HOME=/usr/local/hadoop" \
/user/root/input /user/root/output
hdfs dfs -cat /user/root/output/part-r-00000
# 验证完成后退出master容器
exit
步骤2:将运行正常的容器打包为独立镜像
为每个容器创建专属镜像(标签统一为v1,便于识别),打包前无需停止容器,Docker会自动快照当前状态。
bash
# 1. 打包master容器为镜像:hadoop-master:v1
docker commit -m "已配置Hadoop master节点,含SSH免密+Hadoop集群配置+WordCount可运行" master hadoop-master:v1
# 2. 打包worker01容器为镜像:hadoop-worker01:v1
docker commit -m "已配置Hadoop worker01节点,同步master配置+SSH免密" worker01 hadoop-worker01:v1
# 3. 打包worker02容器为镜像:hadoop-worker02:v1
docker commit -m "已配置Hadoop worker02节点,同步master配置+SSH免密" worker02 hadoop-worker02:v1
# 4. 验证镜像创建成功(应看到3个新镜像)
docker images | grep -E "hadoop-master|hadoop-worker01|hadoop-worker02"

步骤3:将镜像导出为压缩文件(便于传输)
镜像导出为.tar格式,体积约2-3GB/个,可直接通过网盘、U盘、SCP传输,建议保留原文件名,避免同事混淆。
bash
# 1. 导出master镜像
docker save hadoop-master:v1 > hadoop-master-v1.tar
# 2. 导出worker01镜像
docker save hadoop-worker01:v1 > hadoop-worker01-v1.tar
# 3. 导出worker02镜像
docker save hadoop-worker02:v1 > hadoop-worker02-v1.tar
# (可选)压缩镜像(减小体积,需同事解压后再导入,推荐)
gzip hadoop-master-v1.tar
gzip hadoop-worker01-v1.tar
gzip hadoop-worker02-v1.tar
# 压缩后文件名为:hadoop-master-v1.tar.gz、hadoop-worker01-v1.tar.gz、hadoop-worker02-v1.tar.gz
也可以多线程压缩tar为tar.gz
bash
sudo apt update && sudo apt install pigz -y
# 压缩 master 镜像(4 线程+保留源文件+进度)
pigz -v -p 4 -k hadoop-master-v1.tar
# 压缩 worker01/worker02 镜像
pigz -v -p 4 -k hadoop-worker01-v1.tar
pigz -v -p 4 -k hadoop-worker02-v1.tar
把导出的镜像放在hadoop-docker目录下
bash
mkdir -p ~/hadoop-docker
mv hadoop-master-v1.tar.gz ~/hadoop-docker/
mv hadoop-worker01-v1.tar.gz ~/hadoop-docker/
mv hadoop-worker02-v1.tar.gz ~/hadoop-docker/
步骤4:制作一键启动脚本(关键!同事无需写复杂命令)
在宿主机的hadoop-docker目录下创建start-hadoop-cluster.sh脚本,脚本中包含创建网络+启动所有容器的完整命令,与你最初启动容器的参数完全一致(IP/端口/网络/主机名)。
bash
# 进入你的hadoop-docker目录(镜像导出文件也在该目录,便于统一传输)
cd ~/hadoop-docker
# 创建并编辑一键启动脚本
sudo nano start-hadoop-cluster.sh
将以下内容复制到脚本中(无需修改任何参数,与你的环境完全一致):
bash
#!/bin/bash
# 作者:你的名字
# 功能:一键启动Hadoop三节点集群(master/worker01/worker02)
# 说明:运行前确保已导入3个Hadoop镜像,且无同名容器/网络
# 1. 创建Hadoop专用网络(若已存在则跳过,避免报错)
docker network create --driver bridge --subnet=172.19.0.0/16 hadoop-net 2>/dev/null || echo "hadoop-net网络已存在,跳过创建"
# 2. 启动master节点(映射9870/8088/9000端口,与原环境一致)
docker run -itd \
--name master \
--hostname master \
--net hadoop-net \
--ip 172.19.0.2 \
-p 9870:9870 \
-p 8088:8088 \
-p 9000:9000 \
--privileged \
hadoop-master:v1
# 3. 启动worker01节点
docker run -itd \
--name worker01 \
--hostname worker01 \
--net hadoop-net \
--ip 172.19.0.3 \
--privileged \
hadoop-worker01:v1
# 4. 启动worker02节点
docker run -itd \
--name worker02 \
--hostname worker02 \
--net hadoop-net \
--ip 172.19.0.4 \
--privileged \
hadoop-worker02:v1
# 5. 验证启动结果
echo -e "\n===== Hadoop集群容器启动结果 ====="
docker ps | grep -E "master|worker01|worker02"
echo -e "\n===== 访问地址 ====="
echo "HDFS WebUI: http://宿主机IP:9870"
echo "YARN WebUI: http://宿主机IP:8088"
echo -e "\n===== 验证集群命令 ====="
echo "1. 进入master容器:docker exec -it master bash"
echo "2. 验证Worker通信:ssh worker01 hostname"
echo "3. 验证WordCount:hadoop jar \$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount -Dmapreduce.application.classpath=$(hadoop classpath) -Dyarn.app.mapreduce.am.env="HADOOP_MAPRED_HOME=/usr/local/hadoop" -Dmapreduce.map.env="HADOOP_MAPRED_HOME=/usr/local/hadoop" -Dmapreduce.reduce.env="HADOOP_MAPRED_HOME=/usr/local/hadoop" /user/root/input /user/root/output1"
给脚本添加执行权限:
bash
chmod +x start-hadoop-cluster.sh
步骤5:整理传输文件(共4个,统一放在hadoop-docker目录)
此时你的~/hadoop-docker目录下应有以下4个文件,一次性传给同事即可:
~/hadoop-docker/
├── hadoop-master-v1.tar.gz(或hadoop-master-v1.tar)
├── hadoop-worker01-v1.tar.gz(或hadoop-worker01-v1.tar)
├── hadoop-worker02-v1.tar.gz(或hadoop-worker02-v1.tar)
└── start-hadoop-cluster.sh(一键启动脚本)
传输方式:
-
本地传输:U盘/移动硬盘直接复制;
-
远程传输:SCP传给同事服务器(示例命令);
bashscp ~/hadoop-docker/* 同事用户名@同事服务器IP:/home/同事用户名/hadoop-docker/ -
网盘传输:上传至百度网盘/阿里云盘,分享链接给同事。
第二部分:同事的操作------接收文件+导入镜像+一键启动集群
同事仅需执行3步操作 ,无需配置任何环境,即可复现你的Hadoop集群,全程无需手动写Docker命令。
前提
同事的机器需安装Docker(若未安装,先执行以下命令快速安装):
bash
# 同事端Docker快速安装(Ubuntu系统)
sudo apt update && sudo apt install docker.io -y
sudo systemctl start docker && sudo systemctl enable docker
# 验证Docker安装
docker --version
步骤1:接收文件并整理目录
将你传输的4个文件统一放在同一目录 下(如~/hadoop-docker),方便操作:
bash
# 同事端创建目录
mkdir -p ~/hadoop-docker && cd ~/hadoop-docker
# 将传输的4个文件复制到该目录
# 若为压缩包(.tar.gz),先解压(若为未压缩的.tar,跳过此步)
gzip -d hadoop-master-v1.tar.gz
gzip -d hadoop-worker01-v1.tar.gz
gzip -d hadoop-worker02-v1.tar.gz
# 解压后得到.tar格式的镜像文件
也可以采用多线程解压
bash
sudo apt update && sudo apt install pigz -y
# 解压master镜像包
pigz -d -k -v hadoop-master-v1.tar.gz
# 解压worker01镜像包
pigz -d -k -v hadoop-worker01-v1.tar.gz
# 解压worker02镜像包
pigz -d -k -v hadoop-worker02-v1.tar.gz
步骤2:导入Hadoop镜像(关键!按顺序导入)
使用docker load命令导入镜像,导入完成后可验证镜像是否存在。
bash
# 同事端在hadoop-docker目录下执行
# 1. 导入master镜像
docker load < hadoop-master-v1.tar
# 2. 导入worker01镜像
docker load < hadoop-worker01-v1.tar
# 3. 导入worker02镜像
docker load < hadoop-worker02-v1.tar
# 4. 验证镜像导入成功(应看到3个镜像,与你这边一致)
docker images | grep -E "hadoop-master|hadoop-worker01|hadoop-worker02"
步骤3:一键启动Hadoop集群
直接执行你提供的启动脚本,无需修改任何参数,脚本会自动创建网络+启动所有容器:
bash
# 同事端在hadoop-docker目录下执行
# 给脚本添加执行权限(若未添加)
sudo chmod +x start-hadoop-cluster.sh
# 一键启动集群
./start-hadoop-cluster.sh
脚本执行成功标志 :最后会输出3个容器的状态,STATUS列均为Up。
步骤4:同事端验证集群是否正常运行(与你这边的验证方式一致)
bash
# 1. 进入master容器
docker exec -it master bash
# 2. 验证master节点Hadoop进程(核心!应有以下4个进程)
jps
# 正常输出:
# XXXX NameNode
# XXXX SecondaryNameNode
# XXXX ResourceManager
# XXXX Jps
# 3. 验证SSH免密登录Worker节点(无密码提示,直接返回主机名)
ssh worker01 hostname # 输出:worker01
ssh worker02 hostname # 输出:worker02
# 4. 验证WordCount(直接运行,无需重新配置)
hdfs dfs -cat /user/root/output/part-r-00000
# 正常输出单词统计结果:
# Hadoop 1
# Hello 1
# World 1
# 5. 验证WebUI访问(同事在本地浏览器打开)
# HDFS WebUI:http://同事宿主机IP:9870
# YARN WebUI:http://同事宿主机IP:8088
bash
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount -Dmapreduce.application.classpath=$(hadoop classpath) -Dyarn.app.mapreduce.am.env="HADOOP_MAPRED_HOME=/usr/local/hadoop" -Dmapreduce.map.env="HADOOP_MAPRED_HOME=/usr/local/hadoop" -Dmapreduce.reduce.env="HADOOP_MAPRED_HOME=/usr/local/hadoop" /user/root/input /user/root/output1
第三部分:常见问题排查(你和同事均可参考)
问题1:同事端执行脚本提示"权限不足"
解决:给脚本添加执行权限,或用sudo运行:
bash
chmod +x start-hadoop-cluster.sh
# 或
sudo ./start-hadoop-cluster.sh
问题2:同事端启动容器提示"IP已被占用/容器名已存在"
解决:删除同名容器/网络,重新执行脚本:
bash
# 删除同名容器
docker stop master worker01 worker02 && docker rm master worker01 worker02
# 删除同名网络
docker network rm hadoop-net
# 重新执行启动脚本
./start-hadoop-cluster.sh
问题3:同事端SSH免密登录失败
解决:大概率是容器打包时快照异常,重新在master容器内执行免密配置(仅需1次):
bash
# 同事端进入master容器
docker exec -it master bash
# 重新复制公钥到所有节点
ssh-copy-id master
ssh-copy-id worker01
ssh-copy-id worker02
# 验证
ssh worker01 hostname
问题4:镜像导出/导入过慢
解决:
- 打包前停止容器(减少镜像体积):
docker stop master worker01 worker02; - 用
gzip压缩后再传输(体积减少约50%); - 远程传输优先使用SCP/FRP,避免网盘限速。
第四部分:额外优化(可选,适合频繁传输)
- 合并为基础镜像 :若三个节点配置高度一致,可仅打包
master为基础镜像,同事用该镜像启动worker节点(节省传输体积); - 添加数据持久化 :若需要保留HDFS数据,可在启动脚本中添加命名卷挂载(参考之前的持久化配置);
- 制作Docker Compose文件 :替代shell启动脚本,同事仅需
docker-compose up -d即可启动,更符合Docker规范。
总结
- 你的核心操作:重启验证→容器commit为镜像→save为tar→制作一键启动脚本→传输4个文件;
- 同事的核心操作:接收文件→load导入镜像→执行启动脚本→验证运行;
- 核心优势:同事无需再做任何Hadoop/SSH配置,全程执行现成命令,10分钟内即可复现可运行的Hadoop集群;
- 关键保障:打包的是运行正常的容器快照,保留了所有配置、环境变量、SSH免密和Hadoop集群状态,实现1:1复现。