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

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

三、逐個文件內(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)境變量寫入系統(tǒng)級配置,確保任何登錄方式都能加載
# 將環(huán)境變量文件拷貝到系統(tǒng)目錄,所有用戶登錄時自動加載
COPY hadoop-profile.sh /etc/profile.d/hadoop.sh
# 硬寫入 JAVA_HOME 到 hadoop-env.sh,避免 SSH 啟動時找不到
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
# 拷貝啟動腳本
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"]
這個四個配置文件: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òu)建鏡像
在 hadoop-docker 目錄下打開終端,執(zhí)行:
docker build -t hadoop-single:v1 .
-t hadoop-single:v1:給鏡像起名和打標(biāo)簽。- 最后的
.表示構(gòu)建上下文為當(dāng)前目錄,Docker 會從這里讀取 Dockerfile 和配置文件。
構(gòu)建過程大約需要幾分鐘??吹?Successfully tagged hadoop-single:v1 即為成功。

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

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

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

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

