如何進行 Apache Doris 叢集 Docker 快速部署

語言: CN / TW / HK

作者:蘇奕嘉|SelectDB 生態研發工程師

Docker 容器化部署是當前最常見的部署方式之一,具有建立簡單、快速部署、移植性強等特點,可極大節省應用開發、測試和部署時間,一次構建,隨處執行。

本教程可指導有快速部署測試和 Docker 學習需求的同學,快速進行部署單節點 Apache Doris 叢集或偽分散式 Apache Doris 叢集。同時介紹如何自主的構建 Apache Doris 的 Docker 生態內容,如 Dockerfile 書寫、Docker Images 構建、Docker-Compose 編排等內容。

本教程所有模組的構建背景都是以快速部署和學習為目,利用 1FE 1BE 規格來撰寫的,如有 NFE MBE 需求的同學可自行在此基礎上進行編排改寫。

本教程不再贅述 Docker 安裝、 Dockerfile 、Docker-Compose 等編寫時指令碼內部使用的相應命令作用,如有需要可參考 Docker 官方文件。

Dockerfile

編寫思路

映象的製作應當注意以下幾點:

  1. 基礎父映象最好選用經過 Docker-Hub 認證的官方映象,如有 DOCKER OFFICIAL IMAGE 標籤的映象提供者,一般是官方認證過沒有問題的映象源。
  2. 基礎父映象選用時儘可能以能最小可用環境的原則進行選擇,即選擇時以滿足基礎必備環境的同時,映象儘可能以最小的原則進行挑選,不要直接使用諸如完整的 CentOS 映象、Ubuntu 映象等提供完備功能的映象,如果使用後者,則我們構建出的包會很大,不利於使用和傳播,也會造成磁碟空間浪費。
  3. 最好不要高度封裝,若只是想提供一個軟體的原生映象,最好的構建方式是 最小可用環境 + 軟體本身 ,期間不夾雜其他的邏輯和功能處理,這樣可以更原子化的進行映象編排以及後續的維護和更新操作。
  4. 單獨用一個指令碼製成的映象完成後續對其他映象的各種業務操作和運維操作。
  5. 構建 Image 和使用 Docker-Compose 時,需要用官方完整的 Docker 程式,使用官方提供的指令碼進行安裝最佳。

根據 Apache Doris 的簡潔架構(FE + BE),以及不依賴其他元件和環境的特性,製作時應將 FE 和 BE 分離製作為兩個映象,再製作 Register 映象來操控 FE 和 BE 映象,這樣可以原子化的製作可用映象,也便於後期的維護和更新。

Docker 服務部署( CentOS 系統和 Ubuntu 系統)

Docker 是一個開源的應用容器引擎,該教程的環境基礎為 Docker

本小節只以 CentOS 系統和 Ubuntu 系統為例,Windows 系統較繁瑣不再贅述,MacOS 系統官方下載安裝即可,簡易程度極高,不再贅述。

  1. 解除安裝老舊的版本(未安裝過可略)
# CentOS
yum remove docker docker-engine docker.io
# Ubuntu
sudo apt-get remove docker docker-engine docker.io
  1. 安裝最新的 Docker
curl -sSL https://get.docker.com/ | sh 
  1. 啟動並新增開機自啟
sudo systemctl start docker #啟動docker
sudo systemctl enable docker #加入開機自啟動
  1. 檢查安裝
docker version
  1. 若出現 Client 和 Server 兩部分內容,說明安裝成功。

FE Dockerfile

FE 是 Java 程式,所以我們選用 Openjdk 提供的 JDK8 最新的 8u342-jdk 映象作為基礎父映象,提供兩個版本:

以下指令碼需命名為 Dockerfile !

  • 使用本地二進位制包構建
# 選擇基礎映象
FROM openjdk:8u342-jdk
​
# 根據自己需求進行替換,路徑使用相對路徑
ARG package_url=本地二進位制包路徑,與 package_name 拼接得到完整目錄
# 例如 ARG package_url=./
​
ARG package_name=二進位制包檔名
# 例如 ARG package_name=apache-doris-1.1.1-bin-x86.tar.gz
​
ARG package_path=解壓後文件目錄名
# 例如 ARG package_path=apache-doris-1.1.1-bin-x86
​
# 設定環境變數
ENV JAVA_HOME="/usr/local/openjdk-8/" \
    PATH="/usr/local/apache-doris/fe/bin:$PATH"
​
# 下載軟體至映象內,可根據需要替換
COPY $package_url/$package_name /usr/local/
​
# 部署軟體
RUN tar -zxvf /usr/local/$package_name -C /usr/local/ && \
    mv /usr/local/$package_path /usr/local/apache-doris && \
    rm -rf /usr/local/$package_name /usr/local/apache-doris/be /usr/local/apache-doris/udf /usr/local/apache-doris/apache_hdfs_broker
​
CMD ["bash"]
  • 使用 URL 下載構建
# 選擇基礎映象
FROM openjdk:8u342-jdk
​
# 根據自己需求進行替換
ARG package_url=遠端URL下載地址
# 例如 ARG package_url=https://mirrors.tuna.tsinghua.edu.cn/apache/doris/1.1/1.1.1-rc03/apache-doris-1.1.1-bin-x86.tar.gz
​
ARG package_name=二進位制包檔名
# 例如 ARG package_name=apache-doris-1.1.1-bin-x86.tar.gz
​
ARG package_path=解壓後文件目錄名
# 例如 ARG package_path=apache-doris-1.1.1-bin-x86
​
# 設定環境變數
ENV JAVA_HOME="/usr/local/openjdk-8/" \
    PATH="/usr/local/apache-doris/fe/bin:$PATH"
​
# 部署軟體
RUN curl -o /usr/local/apache-doris.tar.gz $package_url && \
    tar -zxvf /usr/local/apache-doris.tar.gz -C /usr/local/ && \
    mv /usr/local/$package_path /usr/local/apache-doris && \
    rm -rf /usr/local/$package_name /usr/local/apache-doris/be /usr/local/apache-doris/udf /usr/local/apache-doris/apache_hdfs_broker
​
CMD ["bash"]

構建 Apache-Doris-FE-Docker-Image:

# 映象名為使用者自定義的名稱
docker build . -t 映象名 

BE Dockerfile

BE Docker Image 構建,與 FE 大同小異,只需要更改基礎父映象和刪除內容即可,修改如下:

  1. 基礎父映象修改為 bitnami/minideb:latest
  2. ENV PATH 中 fe 修改為 be,刪除 Java 環境變數,新增 broker 環境變數
  3. 最後清理目錄中,將 be 修改為 fe
  • 使用本地二進位制包構建
# 選擇基礎映象
FROM bitnami/minideb:latest
​
# 根據自己需求進行替換
ARG package_url=本地二進位制包路徑,與 package_name 拼接得到完整目錄
# 例如 ARG package_url=./
​
ARG package_name=二進位制包檔名
# 例如 ARG package_name=apache-doris-1.1.1-bin-x86.tar.gz
​
ARG package_path=解壓後文件目錄名
# 例如 ARG package_path=apache-doris-1.1.1-bin-x86
​
# 設定環境變數
ENV PATH="/usr/local/apache-doris/be/bin:/usr/local/apache-doris/apache_hdfs_broker/bin:$PATH"
​
# 下載軟體至映象內,可根據需要替換
COPY $package_url/$package_name /usr/local/
​
# 部署軟體
RUN tar -zxvf /usr/local/$package_name -C /usr/local/ && \
    mv /usr/local/$package_path /usr/local/apache-doris && \
    rm -rf /usr/local/$package_name /usr/local/apache-doris/fe /usr/local/apache-doris/udf
​
CMD ["bash"]
  • 使用 URL 下載構建
# 選擇基礎映象
FROM bitnami/minideb:latest
​
# 根據自己需求進行替換
ARG package_url=遠端URL下載地址
# 例如 ARG package_url=https://mirrors.tuna.tsinghua.edu.cn/apache/doris/1.1/1.1.1-rc03/apache-doris-1.1.1-bin-x86.tar.gz
​
ARG package_name=二進位制包檔名
# 例如 ARG package_name=apache-doris-1.1.1-bin-x86.tar.gz
​
ARG package_path=解壓後文件目錄名
# 例如 ARG package_path=apache-doris-1.1.1-bin-x86
​
# 設定環境變數
ENV PATH="/usr/local/apache-doris/be/bin:/usr/local/apache-doris/apache_hdfs_broker/bin:$PATH"
​
# 部署軟體
RUN apt-get update && \
    apt-get install -y curl && \
    apt-get clean && \
    curl -o /usr/local/apache-doris.tar.gz $package_url && \
    tar -zxvf /usr/local/apache-doris.tar.gz -C /usr/local/ && \
    mv /usr/local/$package_path /usr/local/apache-doris && \
    rm -rf /usr/local/$package_name /usr/local/apache-doris/fe /usr/local/apache-doris/udf
​
CMD ["bash"]

構建 Apache-Doris-BE-Docker-Image:

docker build . -t 映象名 

Register Dockerfile

構建 Register Docker Image 時,主是是通過 Docker-Compose 來排程管控 Doris 的 FE 和 BE 啟停及註冊的指令碼。

以下演示皆為最基礎的指令碼版本,指令碼健壯性並不是很高,可根據自己需要進行定製化開發,比如增加流程判斷,確定成功失敗等。

  • 初始化 FE 指令碼
  • init_fe.sh
#!/bin/bash
echo "Start initializing Apache-Doris FE!"
cd /usr/local/apache-doris/
perl -pi -e "s|# priority_networks = 10.10.10.0/24;192.168.0.0/16|priority_networks = 172.20.80.0/16|g" /usr/local/apache-doris/fe/conf/fe.conf
start_fe.sh --daemon
echo "Apache-Doris FE initialized successfully!"
  • 初始化 BE 指令碼
  • init_be.sh
#!/bin/bash
echo "Start initializing Apache-Doris BE!"
cd /usr/local/apache-doris/
perl -pi -e "s|# priority_networks = 10.10.10.0/24;192.168.0.0/16|priority_networks = 172.20.80.0/16|g" /usr/local/apache-doris/be/conf/be.conf
start_be.sh --daemon
echo "Apache-Doris BE initialized successfully!"
#!/bin/sh
echo "Welcome to Apache-Doris Docker-Compose to quickly build test images!"
echo "Start modifying the configuration files of FE and BE and run FE and BE!"
docker cp /root/init_fe.sh doris-fe:/root/init_fe.sh
docker exec doris-fe bash -c "/root/init_fe.sh"
docker cp /root/init_be.sh doris-be:/root/init_be.sh
docker exec doris-be bash -c "/root/init_be.sh"
sleep 30
echo "Get started with the Apache Doris registration steps!"
mysql -h 172.20.80.2 -P 9030 -uroot -e "ALTER SYSTEM ADD BACKEND "172.20.80.3:9050";"
echo "The initialization task of Apache-Doris has been completed, please start to experience it!"

Register Dockerfile 內容如下:

# Base Images 基礎映象
FROM bash:latest
​
# 新增指令碼檔案
ADD *.sh /root/
​
# 設定工作目錄
WORKDIR /root/
​
# 設定映象源及基礎環境
RUN /bin/sh -c echo 'http://mirrors.sjtug.sjtu.edu.cn/alpine/v3.15/main' > /etc/apk/repositories && \
    echo 'http://mirrors.sjtug.sjtu.edu.cn/alpine/v3.15/community' >> /etc/apk/repositories && \
    apk update && \
    apk add --no-cache mysql-client docker && \
    rm -rf /usr/bin/docker-proxy /usr/bin/docker-init /usr/bin/dockerd && \
    chmod 755 *.sh

Docker-Compose

Compose 是⽤於定義和運⾏多容器 Docker 應⽤程式的⼯具,我們使用它來完成對 Doris 服務的編排及初始化工作。

Docker-compose 的指令碼檔案命名應為 docker-compose.yml

這裡有幾個引數需要著重講一下:

  1. Apache Doris 是 IP 敏感和儲存敏感的有狀態服務,所以在設計 Compose 時要將此作為準則之一。
  2. 解決上述問題的方案是通過設定 networks 自定義一個獨有的網絡卡,指定每個 Docker 容器節點的容器 IP 地址。
  3. 由於該教程為 1FE 1BE 的快速部署服務製作教程,持久化掛載能力將在指令碼內演示,如有需要可自行新增對映卷。
  4. Compose 的服務模組執行是可以配置依賴順序的,這樣可以有效的防止有些指令碼關係因為依賴錯誤而執行失敗。

這裡演示兩個指令碼,一個 1FE 1BE(新增資料持久化對映關係),一個 1FE 3BE(未新增資料持久化對映關係),如有需要可依照該基礎進行自行修改適配。

  • 1FE 1BE
version: '3'
services:
  docker-fe:
    image: "FE-Docker-Image" # 如 "apache/doris:1.1.2-rc06-fe"
    container_name: "doris-fe"
    tty: true
    hostname: "fe"
    restart: always
    ports:
      - 8030:8030
      - 9030:9030
    networks:
      doris_net:
        ipv4_address: 172.20.80.2
  docker-be:
    image: "BE-Docker-Image" # 如 "apache/doris:1.1.2-rc06-be"
    container_name: "doris-be"
    tty: true
    hostname: "be"
    restart: always
    ports:
      - 8041:8040
      - 9001:9000
      - 9051:9050
    networks:
      doris_net:
        ipv4_address: 172.20.80.3
  register:
    image: "Register-Image" # 如 "apache/doris:register"
    container_name: "doris-register"
    hostname: "register"
    privileged: true
    command: ["sh","-c","/root/register.sh"]
    depends_on:
      - docker-fe
      - docker-be-01
    volumes: 
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      doris_net:
        ipv4_address: 172.20.80.4
networks:
  doris_net:
    ipam:
      config:
      - subnet: 172.20.80.0/16
  • 1FE 3BE
version: '3'
services:
  docker-fe:
    image: "FE-Docker-Image" # 如 "apache/doris:1.1.2-rc06-fe"
    container_name: "doris-fe"
    tty: true
    hostname: "fe"
    restart: always
    ports:
      - 8030:8030
      - 9030:9030
    networks:
      doris_net:
        ipv4_address: 172.20.80.2
  docker-be-01:
    image: "BE-Docker-Image" # 如 "apache/doris:1.1.2-rc06-be"
    container_name: "doris-be-01"
    tty: true
    hostname: "be-01"
    restart: always
    ports:
      - 8041:8040
      - 9001:9000
      - 9051:9050
    networks:
      doris_net:
        ipv4_address: 172.20.80.3
  docker-be-02:
    image: "BE-Docker-Image" # 如 "apache/doris:1.1.2-rc06-be"
    container_name: "doris-be-02"
    tty: true
    hostname: "be-02"
    restart: always
    ports:
      - 8042:8040
      - 9002:9000
      - 9052:9050
    networks:
      doris_net:
        ipv4_address: 172.20.80.4
  docker-be-03:
    image: "BE-Docker-Image" # 如 "apache/doris:1.1.2-rc06-be"
    container_name: "doris-be-03"
    tty: true
    hostname: "be-03"
    restart: always
    ports:
      - 8043:8040
      - 9003:9000
      - 9053:9050
    networks:
      doris_net:
        ipv4_address: 172.20.80.5
  # 請看注意事項!
  register:
    image: "Register-Image" # 如 "apache/doris:register"
    container_name: "doris-register"
    hostname: "register"
    privileged: true
    command: ["sh","-c","/root/register.sh"]
    depends_on:
      - docker-fe
      - docker-be-01
      - docker-be-02
      - docker-be-03
    volumes: 
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      doris_net:
        ipv4_address: 172.20.80.6
networks:
  doris_net:
    ipam:
      config:
      - subnet: 172.20.80.0/16
  • 注意,由於我們 Register 映象裡的註冊及初始化指令碼都只寫了 1FE 1BE 的情況,所以不適用 NFE MBE 的 Compose,如有需要需自行製作 Register 映象

快速使用

製作好映象以後,就可以快速使用了,步驟如下:

1. Docker-Compose 服務部署

Compose 是用於定義和執行多容器 Docker 應用程式的工具。

  1. 下載最新版的docker-compose檔案

    1. GitHub拉取
    2. sudo curl -L https://github.com/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
      
    3. 國內 DaoCloud 拉取
    4. sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
      
  1. 新增執行許可權
sudo chmod +x /usr/local/bin/docker-compose
  1. 檢查安裝結果
docker-compose --version
> docker-compose version 1.25.1

2. 拉取或者製作 Compose 指令碼

以下為 1 FE 1 BE 單節點部署 Apache Doris 1.1.2 版本的指令碼,如果有需要,可根據自身調整。

如需切換版本號,將 docker-fe 和 docker-be 的映象進行切換即可

當前支援的映象全部在 https://hub.docker.com/repository/docker/apache/doris/ 可檢視,會隨著版本釋出不斷更新

注意!一定需要將該檔案儲存至目標目錄,命名為 docker-compose.yml

3. 啟動測試

  1. 切換路徑到 docker-compose.yml 目錄下
cd docker-compose.yml_path
  1. 啟動專案
docker-compose up
  1. 輸出尾部資訊應為如下
Creating doris-fe ... done
Creating doris-register ... done
Creating doris-fe ... 
Creating doris-register ... 
Attaching to doris-be, doris-fe, doris-register
doris-register | Welcome to Apache-Doris Docker-Compose to quickly build test images!
doris-register | Start modifying the configuration files of FE and BE and run FE and BE!
doris-register | Start initializing Apache-Doris FE!
doris-register | Apache-Doris FE initialized successfully!
doris-register | Start initializing Apache-Doris BE!
doris-register | Apache-Doris BE initialized successfully!
doris-register | Get started with the Apache Doris registration steps!
doris-register | The initialization task of Apache-Doris has been completed, please start to experience it!
doris-register exited with code 0
  1. 注意!若沒有報錯,看到 doris-register exited with code 0 後請 關閉 當前視窗!重新開啟 Shell 連結進行操作,一定不能 Ctrl + C 切斷退出!
  2. 檢查執行
  3. 如果是虛擬機器,需要關閉防火牆,宿主機能 Ping 通虛擬機器,如果是雲伺服器,需要開放 8030,9030 埠
  • 命令列檢查
  • # FE 健康檢查
    curl http://fe_host:fe_http_port/api/bootstrap
    > {"status":"OK","msg":"Success"}
    # BE 健康檢查
    curl http://be_host:be_http_port/api/health
    > {"status": "OK","msg": "To Be Added"}
    
  • 訪問 FE-WEB-UI 介面
  • http://虛擬機器IP或者雲伺服器公網IP:8030
    
  • 登入賬號為 root 或者 admin
  • 密碼為空

結語

使用 Docker 映象及 Compose 工具,可以快速的部署一套測試或者學習使用的叢集,但有特殊需求的情況,比如更簡單的命令完成指定規模的 NFE MBE 環境搭建,甚至多 FE 高可用及 Observer 混部的各種情況,將在《Apache Doris Docker 高階製作教程》裡講解,以及提供相應的社群生態工具。

如需繼續學習,請繼續以 Apache Doris 官⽹⽂檔為主。

如有⽂檔謬誤和困難,可移步⾄ Apache Doris 官⽅社群微信群進⾏指正和提問。

image.png

「其他文章」