構(gòu)建 Docker Image
該文檔主要介紹了如何通過 Dockerfile 來制作 Apache Doris 的運(yùn)行鏡像,以便于在容器化編排工具或者快速測試過程中可迅速拉取一個(gè) Apache Doris Image 來完成集群的創(chuàng)建。
軟硬件要求?
概述?
Docker 鏡像在制作前要提前準(zhǔn)備好制作機(jī)器,該機(jī)器的平臺架構(gòu)決定了制作以后的 Docker Image 適用的平臺架構(gòu),如 X86_64 機(jī)器,需要下載 X86_64 的 Doris 二進(jìn)制程序,制作以后的 Image 僅可在 X86_64 平臺上運(yùn)行。ARM 平臺(M1 視同為 ARM)同理。
硬件要求?
最低配置:2C 4G
推薦配置:4C 16G
軟件要求?
Docker Version:20.10 及以后版本
Docker Image 構(gòu)建?
Dockerfile 腳本編寫需要注意以下幾點(diǎn):
- 基礎(chǔ)父鏡像選用經(jīng)過 Docker-Hub 認(rèn)證的 OpenJDK 官方鏡像,版本用 JDK 1.8 版本
- 應(yīng)用程序默認(rèn)使用官方提供的二進(jìn)制包進(jìn)行下載,勿使用來源不明的二進(jìn)制包
- 需要內(nèi)嵌腳本來完成 FE 的啟動(dòng)、多 FE 注冊、狀態(tài)檢查和 BE 的啟動(dòng)、注冊 BE 至 FE 、狀態(tài)檢查等任務(wù)流程
- 應(yīng)用程序在 Docker 內(nèi)啟動(dòng)時(shí)不應(yīng)使用?
--daemon
?的方式啟動(dòng),否則在 K8S 等編排工具部署過程中會(huì)有異常
由于 Apache Doris 1.2 版本開始,開始支持 JavaUDF 能力,故而 BE 也需要有 JDK 環(huán)境,推薦的鏡像如下:
Doris 程序 | 推薦基礎(chǔ)父鏡像 |
---|---|
Frontend | openjdk:8u342-jdk |
Backend | openjdk:8u342-jdk |
Broker | openjdk:8u342-jdk |
腳本前期準(zhǔn)備?
編譯 Docker Image 的 Dockerfile 腳本中,關(guān)于 Apache Doris 程序二進(jìn)制包的加載方式,有兩種:
- 通過 wget / curl 在編譯時(shí)執(zhí)行下載命令,隨后完成 docker build 制作過程
- 提前下載二進(jìn)制包至編譯目錄,然后通過 ADD 或者 COPY 命令加載至 docker build 過程中
使用前者會(huì)讓 Docker Image Size 更小,但是如果構(gòu)建失敗的話可能下載操作會(huì)重復(fù)進(jìn)行,導(dǎo)致構(gòu)建時(shí)間過長,而后者更適用于網(wǎng)絡(luò)環(huán)境不是很好的構(gòu)建環(huán)境。
綜上,本文檔的示例以第二種方式為準(zhǔn),若有第一種訴求,可根據(jù)自己需求定制修改即可。
準(zhǔn)備二進(jìn)制包?
需要注意的是,如有定制化開發(fā)需求,則需要自己修改源碼后進(jìn)行編譯打包,然后放置至構(gòu)建目錄即可。
若無特殊需求,直接下載官網(wǎng)提供的二進(jìn)制包即可。
構(gòu)建步驟?
構(gòu)建 FE?
構(gòu)建環(huán)境目錄如下:
└── docker-build // 構(gòu)建根目錄
└── fe // FE 構(gòu)建目錄
├── dockerfile // dockerfile 腳本
└── resource // 資源目錄
├── init_fe.sh // 啟動(dòng)及注冊腳本
└── apache-doris-x.x.x-bin-fe.tar.gz // 二進(jìn)制程序包
-
創(chuàng)建構(gòu)建環(huán)境目錄
mkdir -p ./docker-build/fe/resource
-
下載官方二進(jìn)制包/編譯的二進(jìn)制包
拷貝二進(jìn)制包至?
./docker-build/fe/resource
?目錄下 -
編寫 FE 的 Dockerfile 腳本
# 選擇基礎(chǔ)鏡像 FROM openjdk:8u342-jdk # 設(shè)置環(huán)境變量 ENV JAVA_HOME="/usr/local/openjdk-8/" \ PATH="/opt/apache-doris/fe/bin:$PATH" # 下載軟件至鏡像內(nèi),可根據(jù)需要替換 ADD ./resource/apache-doris-fe-${x.x.x}-bin.tar.gz /opt/ RUN apt-get update && \ apt-get install -y default-mysql-client && \ apt-get clean && \ mkdir /opt/apache-doris && \ cd /opt && \ mv apache-doris-fe-${x.x.x}-bin /opt/apache-doris/fe ADD ./resource/init_fe.sh /opt/apache-doris/fe/bin RUN chmod 755 /opt/apache-doris/fe/bin/init_fe.sh ENTRYPOINT ["/opt/apache-doris/fe/bin/init_fe.sh"]
編寫后命名為?
Dockerfile
?并保存至?./docker-build/fe
?目錄下 -
編寫 FE 的執(zhí)行腳本
可參考復(fù)制?init_fe.sh?的內(nèi)容
編寫后命名為?
init_fe.sh
?并保存至?./docker-build/fe/resouce
?目錄下 -
執(zhí)行構(gòu)建
需要注意的是,
${tagName}
?需替換為你想要打包命名的 tag 名稱,如:apache-doris:1.1.3-fe
構(gòu)建 FE:
cd ./docker-build/fe docker build . -t ${fe-tagName}
構(gòu)建 BE?
- 創(chuàng)建構(gòu)建環(huán)境目錄
mkdir -p ./docker-build/be/resource
-
構(gòu)建環(huán)境目錄如下:
└── docker-build // 構(gòu)建根目錄 └── be // BE 構(gòu)建目錄 ├── dockerfile // dockerfile 腳本 └── resource // 資源目錄 ├── init_be.sh // 啟動(dòng)及注冊腳本 └── apache-doris-x.x.x-bin-x86_64/arm-be.tar.gz // 二進(jìn)制程序包
-
編寫 BE 的 Dockerfile 腳本
# 選擇基礎(chǔ)鏡像 FROM openjdk:8u342-jdk # 設(shè)置環(huán)境變量 ENV JAVA_HOME="/usr/local/openjdk-8/" \ PATH="/opt/apache-doris/be/bin:$PATH" # 下載軟件至鏡像內(nèi),可根據(jù)需要替換 ADD ./resource/apache-doris-be-${x.x.x}-bin-x86_64.tar.gz /opt/ RUN apt-get update && \ apt-get install -y default-mysql-client && \ apt-get clean && \ mkdir /opt/apache-doris && \ cd /opt && \ mv apache-doris-be-${x.x.x}-bin-x86_64 /opt/apache-doris/be ADD ./resource/init_be.sh /opt/apache-doris/be/bin RUN chmod 755 /opt/apache-doris/be/bin/init_be.sh ENTRYPOINT ["/opt/apache-doris/be/bin/init_be.sh"]
編寫后命名為?
Dockerfile
?并保存至?./docker-build/be
?目錄下 -
編寫 BE 的執(zhí)行腳本
可參考復(fù)制?init_be.sh?的內(nèi)容
編寫后命名為?
init_be.sh
?并保存至?./docker-build/be/resouce
?目錄下 -
執(zhí)行構(gòu)建
需要注意的是,
${tagName}
?需替換為你想要打包命名的 tag 名稱,如:apache-doris:1.1.3-be
構(gòu)建 BE:
cd ./docker-build/be docker build . -t ${be-tagName}
構(gòu)建完成后,會(huì)有?
Success
?字樣提示,這時(shí)候通過以下命令可查看剛構(gòu)建完成的 Image 鏡像docker images
構(gòu)建 Broker?
- 創(chuàng)建構(gòu)建環(huán)境目錄
mkdir -p ./docker-build/broker/resource
-
構(gòu)建環(huán)境目錄如下:
└── docker-build // 構(gòu)建根目錄 └── broker // BROKER 構(gòu)建目錄 ├── dockerfile // dockerfile 腳本 └── resource // 資源目錄 ├── init_broker.sh // 啟動(dòng)及注冊腳本 └── apache-doris-x.x.x-bin-broker.tar.gz // 二進(jìn)制程序包
-
編寫 Broker 的 Dockerfile 腳本
# 選擇基礎(chǔ)鏡像 FROM openjdk:8u342-jdk # 設(shè)置環(huán)境變量 ENV JAVA_HOME="/usr/local/openjdk-8/" \ PATH="/opt/apache-doris/broker/bin:$PATH" # 下載軟件至鏡像內(nèi),此處 broker 目錄被同步壓縮至 FE 的二進(jìn)制包,需要自行解壓重新打包,可根據(jù)需要替換 ADD ./resource/apache_hdfs_broker.tar.gz /opt/ RUN apt-get update && \ apt-get install -y default-mysql-client && \ apt-get clean && \ mkdir /opt/apache-doris && \ cd /opt && \ mv apache_hdfs_broker /opt/apache-doris/broker ADD ./resource/init_broker.sh /opt/apache-doris/broker/bin RUN chmod 755 /opt/apache-doris/broker/bin/init_broker.sh ENTRYPOINT ["/opt/apache-doris/broker/bin/init_broker.sh"]
編寫后命名為?
Dockerfile
?并保存至?./docker-build/broker
?目錄下 -
編寫 BE 的執(zhí)行腳本
可參考復(fù)制?init_broker.sh?的內(nèi)容
編寫后命名為?
init_broker.sh
?并保存至?./docker-build/broker/resouce
?目錄下 -
執(zhí)行構(gòu)建
需要注意的是,
${tagName}
?需替換為你想要打包命名的 tag 名稱,如:apache-doris:1.1.3-broker
構(gòu)建 Broker:
cd ./docker-build/broker docker build . -t ${broker-tagName}
構(gòu)建完成后,會(huì)有?
Success
?字樣提示,這時(shí)候通過以下命令可查看剛構(gòu)建完成的 Image 鏡像docker images
推送鏡像至 DockerHub 或私有倉庫?
登錄 DockerHub 賬號
docker login
登錄成功會(huì)提示?Success
?相關(guān)提示,隨后推送至倉庫即可
docker push ${tagName}
部署 Docker 集群
背景說明?
本篇將簡述如何通過?docker run
?或?docker-compose up
?命令快速構(gòu)建一套完整的 Doris 測試集群。
適用場景?
建議在 SIT 或者 DEV 環(huán)境中使用 Doris Docker 來簡化部署的流程。
如在新版本中想測試某一個(gè)功能點(diǎn),可以使用 Doris Docker 部署一個(gè) Playground 環(huán)境?;蛘咴谡{(diào)試的過程中要復(fù)現(xiàn)某個(gè)問題時(shí),也可以使用 docker 環(huán)境來模擬。
在生產(chǎn)環(huán)境上,當(dāng)前暫時(shí)盡量避免使用容器化的方案進(jìn)行 Doris 部署。
軟件環(huán)境?
軟件 | 版本 |
---|---|
Docker | 20.0 及以上 |
docker-compose | 2.10 及以上 |
硬件環(huán)境?
配置類型 | 硬件信息 | 最大運(yùn)行集群規(guī)模 |
---|---|---|
最低配置 | 2C 4G | 1FE 1BE |
推薦配置 | 4C 16G | 3FE 3BE |
前期環(huán)境準(zhǔn)備?
需在宿主機(jī)執(zhí)行如下命令
sysctl -w vm.max_map_count=2000000
Docker Compose?
不同平臺需要使用不同 Image 鏡像,本篇以?X86_64
?平臺為例。
網(wǎng)絡(luò)模式說明?
Doris Docker 適用的網(wǎng)絡(luò)模式有兩種。
- 適合跨多節(jié)點(diǎn)部署的 HOST 模式,這種模式適合每個(gè)節(jié)點(diǎn)部署 1FE 1BE。
- 適合單節(jié)點(diǎn)部署多 Doris 進(jìn)程的子網(wǎng)網(wǎng)橋模式,這種模式適合單節(jié)點(diǎn)部署(推薦),若要多節(jié)點(diǎn)混部需要做更多組件部署(不推薦)。
為便于展示,本章節(jié)僅演示子網(wǎng)網(wǎng)橋模式編寫的腳本。
接口說明?
從?Apache Doris 1.2.1 Docker Image
?版本起,各個(gè)進(jìn)程鏡像接口列表如下:
進(jìn)程名 | 接口名 | 接口定義 | 接口示例 |
---|---|---|---|
FE | BE | BROKER | FE_SERVERS |
FE | FE_ID | FE 節(jié)點(diǎn) ID | 1 |
BE | BE_ADDR | BE 節(jié)點(diǎn)主要信息 | 172.20.80.5:9050 |
BE | NODE_ROLE | BE 節(jié)點(diǎn)類型 | computation |
BROKER | BROKER_ADDR | BROKER 節(jié)點(diǎn)主要信息 | 172.20.80.6:8000 |
注意,以上接口必須填寫信息,否則進(jìn)程無法啟動(dòng)。
FE_SERVERS 接口規(guī)則為:
FE_NAME:FE_HOST:FE_EDIT_LOG_PORT[,FE_NAME:FE_HOST:FE_EDIT_LOG_PORT]
FE_ID 接口規(guī)則為:
1-9
?的整數(shù),其中?1
?號 FE 為 Master 節(jié)點(diǎn)。BE_ADDR 接口規(guī)則為:
BE_HOST:BE_HEARTBEAT_SERVICE_PORT
NODE_ROLE 接口規(guī)則為:
computation
?或?yàn)榭?,其中為空或?yàn)槠渌禃r(shí)表示節(jié)點(diǎn)類型為?mix
?類型BROKER_ADDR 接口規(guī)則為:
BROKER_HOST:BROKER_IPC_PORT
腳本模板?
Docker Run 命令?
1FE & 1BE 命令模板
注意需要修改?${當(dāng)前機(jī)器的內(nèi)網(wǎng)IP}
?替換為當(dāng)前機(jī)器的內(nèi)網(wǎng)IP
docker run -itd \
--name=fe \
--env FE_SERVERS="fe1:${當(dāng)前機(jī)器的內(nèi)網(wǎng)IP}:9010" \
--env FE_ID=1 \
-p 8030:8030 \
-p 9030:9030 \
-v /data/fe/doris-meta:/opt/apache-doris/fe/doris-meta \
-v /data/fe/log:/opt/apache-doris/fe/log \
--net=host \
apache/doris:2.0.0_alpha-fe-x86_64
docker run -itd \
--name=be \
--env FE_SERVERS="fe1:${當(dāng)前機(jī)器的內(nèi)網(wǎng)IP}:9010" \
--env BE_ADDR="${當(dāng)前機(jī)器的內(nèi)網(wǎng)IP}:9050" \
-p 8040:8040 \
-v /data/be/storage:/opt/apache-doris/be/storage \
-v /data/be/log:/opt/apache-doris/be/log \
--net=host \
apache/doris:2.0.0_alpha-be-x86_64
3FE & 3BE Run 命令模板如有需要點(diǎn)擊此處訪問下載。
Docker Compose 腳本?
1FE & 1BE 模板
注意需要修改?${當(dāng)前機(jī)器的內(nèi)網(wǎng)IP}
?替換為當(dāng)前機(jī)器的內(nèi)網(wǎng)IP
version: "3"
services:
fe:
image: apache/doris:2.0.0_alpha-fe-x86_64
hostname: fe
environment:
- FE_SERVERS=fe1:${當(dāng)前機(jī)器的內(nèi)網(wǎng)IP}:9010
- FE_ID=1
volumes:
- /data/fe/doris-meta/:/opt/apache-doris/fe/doris-meta/
- /data/fe/log/:/opt/apache-doris/fe/log/
network_mode: host
be:
image: apache/doris:2.0.0_alpha-be-x86_64
hostname: be
environment:
- FE_SERVERS=fe1:${當(dāng)前機(jī)器的內(nèi)網(wǎng)IP}:9010
- BE_ADDR=${當(dāng)前機(jī)器的內(nèi)網(wǎng)IP}:9050
volumes:
- /data/be/storage/:/opt/apache-doris/be/storage/
- /data/be/script/:/docker-entrypoint-initdb.d/
depends_on:
- fe
network_mode: host
3FE & 3BE Docker Compose 腳本模板如有需要點(diǎn)擊此處訪問下載。
部署 Doris Docker?
部署方式二選一即可:
- 執(zhí)行?
docker run
?命令創(chuàng)建集群 - 保存?
docker-compose.yaml
?腳本,同目錄下執(zhí)行?docker-compose up -d
?命令創(chuàng)建集群
特例說明?
MacOS 由于內(nèi)部實(shí)現(xiàn)容器的方式不同,在部署時(shí)宿主機(jī)直接修改?max_map_count
?值可能無法成功,需要先創(chuàng)建以下容器:
docker run -it --privileged --pid=host --name=change_count debian nsenter -t 1 -m -u -n -i sh
容器創(chuàng)建成功執(zhí)行以下命令:
sysctl -w vm.max_map_count=2000000
然后?exit
?退出,創(chuàng)建 Doris Docker 集群。
Kubernetes 部署
環(huán)境準(zhǔn)備?
- 安裝 k8s
- 構(gòu)建或下載doris鏡像
- 構(gòu)建鏡像?構(gòu)建 Docker Image
- 下載鏡像?https://hub.docker.com/r/apache/doris/tags
- 創(chuàng)建或下載doris on k8s的yml文件
- doris/docker/runtime/k8s/doris_follower.yml at master · apache/doris · GitHub
- doris/docker/runtime/k8s/doris_be.yml at master · apache/doris · GitHub
- doris/docker/runtime/k8s/doris_cn.yml at master · apache/doris · GitHub
啟動(dòng)集群?
啟動(dòng) FE(角色類型為 Follower):kubectl create -f doris_follower.yml
啟動(dòng) BE :kubectl create -f doris_be.yml
啟動(dòng) BE(角色類型為 Compute Node):kubectl create -f doris_cn.yml
擴(kuò)縮容?
- FE
- 目前不支持?jǐn)U縮容,建議按需初始化1個(gè)或者3個(gè)節(jié)點(diǎn)
- BE
- 命令:
kubectl scale statefulset doris-be-cluster1 --replicas=4
- 命令:
- BE(角色類型為 Compute Node)
- 命令:
kubectl scale statefulset doris-cn-cluster1 --replicas=4
- 命令:
驗(yàn)證?
使用 mysql-client 連接到 FE,執(zhí)行?show backends
,show frontends
等操作查看各節(jié)點(diǎn)狀態(tài)
k8s簡易操作命令?
- 首次執(zhí)行yml文件?
kubectl create -f xxx.yml
- 修改yml文件后執(zhí)行?
kubectl apply -f xxx.yml
- 刪除yml定義的所有資源?
kubectl delete -f xxx.yml
- 查看pod列表?
kubectl get pods
- 進(jìn)入容器?
kubectl exec -it xxx(podName) -- /bin/sh
- 查看日志?
kubectl logs xxx(podName)
- 查看ip和端口信息?
kubectl get ep
- 更多k8s知識
常見問題?
-
數(shù)據(jù)怎么持久化?
用戶需要自行掛載pvc,持久化元數(shù)據(jù)信息,數(shù)據(jù)信息或者日志信息等
-
怎么安全縮容BE節(jié)點(diǎn)?
BE:當(dāng)前縮容之前需要用戶手動(dòng)執(zhí)行ALTER-SYSTEM-DECOMMISSION-BACKEND
BE(角色類型為 Compute Node): 不存儲數(shù)據(jù)文件,可以直接進(jìn)行縮容,關(guān)于計(jì)算節(jié)點(diǎn)
-
FE啟動(dòng)報(bào)錯(cuò)"failed to init statefulSetName"文章來源:http://www.zghlxwxcb.cn/news/detail-729812.html
doris_follower.yml的環(huán)境變量 statefulSetName和serviceName必須成對出現(xiàn),比如配置了CN_SERVICE,就必須配置CN_STATEFULSET文章來源地址http://www.zghlxwxcb.cn/news/detail-729812.html
到了這里,關(guān)于Apache Doris 入門教程03:使用Docker或Kubernetes部署Doris的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!