Dockerfile 一鍵構(gòu)建 Hadoop 鏡像的實(shí)現(xiàn)
讀完這篇,你會(huì)用 Dockerfile + 外部配置文件的方式,從零構(gòu)建一個(gè) Hadoop 3.3.6 鏡像。
所有 XML 和啟動(dòng)腳本都放在宿主機(jī)目錄里,修改方便,排錯(cuò)清晰。

一、為什么要把配置文件放在外面?
之前我們把四個(gè) XML 和 entrypoint.sh 全寫(xiě)在 Dockerfile 里,雖然能跑,但修改配置每次都要重新編輯 Dockerfile,維護(hù)起來(lái)不夠直觀。
把配置文件獨(dú)立出來(lái),目錄結(jié)構(gòu)清晰,將來(lái)?yè)Q集群、改參數(shù),只需動(dòng)一兩個(gè)文件,不用再碰 Dockerfile 主體。
二、最終目錄結(jié)構(gòu)
在你的 Mac 上創(chuàng)建一個(gè)新文件夾,比如 hadoop-docker,里面放這 6 個(gè)文件:
hadoop-docker/ ├── Dockerfile ├── core-site.xml ├── hdfs-site.xml ├── yarn-site.xml ├── mapred-site.xml └── entrypoint.sh

三、逐個(gè)文件內(nèi)容(直接復(fù)制粘貼)
1. Dockerfile
FROM ubuntu:24.04
ENV DEBIAN_FRONTEND=noninteractive
# 安裝必要軟件
RUN apt-get update && apt-get install -y --no-install-recommends \
wget curl sudo openssh-server openssh-client openjdk-11-jdk net-tools vim \
&& rm -rf /var/lib/apt/lists/*
# 創(chuàng)建 hadoop 用戶并授予 sudo 權(quán)限
RUN useradd -m hadoop -s /bin/bash && \
echo "hadoop:hadoop" | chpasswd && \
echo "hadoop ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
USER hadoop
WORKDIR /home/hadoop
# 配置 SSH 免密登錄
RUN ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa && \
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys && \
chmod 600 ~/.ssh/authorized_keys
# 下載并解壓 Hadoop
RUN wget -q https://dlcdn.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz && \
tar -xzf hadoop-3.3.6.tar.gz && mv hadoop-3.3.6 hadoop && rm hadoop-3.3.6.tar.gz
# 創(chuàng)建 Hadoop 所需目錄
RUN mkdir -p /home/hadoop/hdfs/namenode /home/hadoop/hdfs/datanode /home/hadoop/hadoop/logs
# 拷貝外部配置文件(從構(gòu)建上下文目錄復(fù)制進(jìn)鏡像)
COPY core-site.xml /home/hadoop/hadoop/etc/hadoop/
COPY hdfs-site.xml /home/hadoop/hadoop/etc/hadoop/
COPY yarn-site.xml /home/hadoop/hadoop/etc/hadoop/
COPY mapred-site.xml /home/hadoop/hadoop/etc/hadoop/
# 將環(huán)境變量寫(xiě)入系統(tǒng)級(jí)配置,確保任何登錄方式都能加載
# 將環(huán)境變量文件拷貝到系統(tǒng)目錄,所有用戶登錄時(shí)自動(dòng)加載
COPY hadoop-profile.sh /etc/profile.d/hadoop.sh
# 硬寫(xiě)入 JAVA_HOME 到 hadoop-env.sh,避免 SSH 啟動(dòng)時(shí)找不到
RUN sudo sed -i 's|# export JAVA_HOME=.*|export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-arm64|' /home/hadoop/hadoop/etc/hadoop/hadoop-env.sh
# 提前格式化 NameNode
RUN /home/hadoop/hadoop/bin/hdfs namenode -format -force
# 拷貝啟動(dòng)腳本
COPY entrypoint.sh /home/hadoop/entrypoint.sh
RUN sudo chmod +x /home/hadoop/entrypoint.sh
EXPOSE 9870 9000 9864 8088 8032 22
ENTRYPOINT ["/home/hadoop/entrypoint.sh"]
這個(gè)四個(gè)配置文件:core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml 跟這篇【用 Docker 裝 Hadoop,看這篇就夠了】的一樣,不再啰嗦
2. entrypoint.sh
#!/bin/bash sudo service ssh start sudo -u hadoop bash -c "source /etc/profile.d/hadoop.sh && start-dfs.sh && start-yarn.sh" tail -f /dev/null
所有文件粘貼好后,你的 hadoop-docker 目錄就應(yīng)該有這 6 個(gè)文件。
四、構(gòu)建鏡像
在 hadoop-docker 目錄下打開(kāi)終端,執(zhí)行:
docker build -t hadoop-single:v1 .
-t hadoop-single:v1:給鏡像起名和打標(biāo)簽。- 最后的
.表示構(gòu)建上下文為當(dāng)前目錄,Docker 會(huì)從這里讀取 Dockerfile 和配置文件。
構(gòu)建過(guò)程大約需要幾分鐘??吹?Successfully tagged hadoop-single:v1 即為成功。

五、啟動(dòng)容器
docker run -d --name hadoop-prod \
-p 9870:9870 \
-p 8088:8088 \
-p 9000:9000 \
-p 2222:22 \
hadoop-single:v1
參數(shù)解釋:
-d:后臺(tái)運(yùn)行--name hadoop-prod:容器名稱-p 宿主機(jī)端口:容器端口:映射關(guān)鍵端口,方便從 Mac 訪問(wèn)- 9870:HDFS NameNode Web UI
- 8088:YARN ResourceManager Web UI
- 9000:HDFS RPC 端口(Spark、Flink 等客戶端讀寫(xiě)用)
- 2222:SSH 端口(避免和 Mac 自身的 22 端口沖突)
檢查容器運(yùn)行狀態(tài):
docker ps
看到 hadoop-prod 狀態(tài)為 Up 即正常。

六、驗(yàn)證 Hadoop 服務(wù)
1. 瀏覽器訪問(wèn)
打開(kāi) Mac 的瀏覽器,輸入:
- HDFS NameNode:
http://localhost:9870 - YARN ResourceManager:
http://localhost:8088
如果頁(yè)面正常顯示,說(shuō)明 Hadoop 啟動(dòng)成功。

2. 進(jìn)入容器使用命令行
docker exec -it hadoop-prod su - hadoop
因?yàn)槲覀冊(cè)?/etc/profile.d/hadoop.sh 里寫(xiě)了環(huán)境變量,所以使用 su - 登錄后,HADOOP_HOME 和 PATH 都已經(jīng)自動(dòng)生效,直接就能用命令:
hdfs dfs -mkdir /test echo "hello hadoop" | hdfs dfs -put - /test/hello.txt hdfs dfs -cat /test/hello.txt
輸出 hello hadoop 即表示 HDFS 讀寫(xiě)正常。

七、環(huán)境變量為何再也不會(huì)丟?
- 我們放棄了僅在
~/.bashrc或~/.profile里設(shè)變量,而是把 export 寫(xiě)到了/etc/profile.d/hadoop.sh。 - 這個(gè)目錄下的腳本會(huì)被任何用戶的登錄 shell(
su -、SSH 登錄)自動(dòng)加載,連非交互式 shell 也能讀到。 - 同時(shí)還修改了
hadoop-env.sh,顯式指定JAVA_HOME,即使通過(guò) SSH 遠(yuǎn)程啟動(dòng) Hadoop 腳本,也絕不會(huì)再報(bào)JAVA_HOME is not set。
到此這篇關(guān)于Dockerfile 一鍵構(gòu)建 Hadoop 鏡像的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Dockerfile構(gòu)建 Hadoop 鏡像內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- dockerfile構(gòu)建任意java鏡像的實(shí)現(xiàn)示例
- Docker部署java項(xiàng)目,關(guān)于Dockerfile文件構(gòu)建鏡像方式
- 使用Dockerfile構(gòu)建自定義鏡像的操作步驟
- docker利用dockerfile構(gòu)建鏡像
- Dockerfile多鏡像構(gòu)建方式
- docker使用Dockerfile構(gòu)建鏡像的實(shí)現(xiàn)示例
- Dockerfile構(gòu)建Redis鏡像的方法實(shí)現(xiàn)(yum方式)
- 編寫(xiě)Dockerfile和構(gòu)建自定義鏡像的步驟與技巧
- Dockerfile及新型容器鏡像構(gòu)建技術(shù)詳解
相關(guān)文章
如何給一個(gè)正在運(yùn)行的Docker容器動(dòng)態(tài)添加Volume
這篇文章主要介紹了如何給一個(gè)正在運(yùn)行的Docker容器動(dòng)態(tài)添加Volume,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03
Docker實(shí)踐--部署Nodejs應(yīng)用
本篇文章主要介紹了Docker實(shí)踐--部署Nodejs應(yīng)用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
docker之如何設(shè)置日志文件大小及個(gè)數(shù)
這篇文章主要介紹了docker之如何設(shè)置日志文件大小及個(gè)數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
Docker 搭建 Tomcat 運(yùn)行環(huán)境的方法
這篇文章主要介紹了Docker 搭建 Tomcat 運(yùn)行環(huán)境的方法,Docker與虛擬機(jī)及搭建過(guò)程,介紹的非常詳細(xì),需要的朋友可以參考下2016-10-10
Docker Buildx構(gòu)建多平臺(tái)鏡像的實(shí)現(xiàn)
本文主要介紹了Docker Buildx構(gòu)建多平臺(tái)鏡像的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Docker Compose引用環(huán)境變量的方法示例
在項(xiàng)目中,往往需要在 docker-compose.yml 文件中使用環(huán)境變量來(lái)控制不同的條件和使用場(chǎng)景。本文集中介紹 docker compose 引用環(huán)境變量的方式,感興趣的小伙伴們可以參考一下2018-12-12

