最近在调研实时数仓方案时,发现 Apache Doris 凭借其极速的查询性能和便捷的运维特性,成为了许多团队的首选。然而,传统的物理机或虚拟机部署方式步骤繁琐,环境依赖复杂,尤其是在开发测试阶段,频繁的部署和清理工作耗时耗力。本文将分享一套基于 Docker 的 Apache Doris 部署方案,从零开始,手把手带你完成一个高可用的 Doris 集群搭建。无论你是想快速体验 Doris 功能,还是为团队搭建一套标准化的开发测试环境,这套方案都能让你事半功倍,避开环境配置的深坑。
1. 背景与核心概念
在深入部署之前,我们有必要先理解两个核心组件:Docker 和 Apache Doris。
1.1 什么是 Docker?
Docker 是一个开源的应用容器引擎。你可以把它理解为一个轻量级的虚拟机,但它比虚拟机更高效、更快速。它允许开发者将应用及其所有依赖(如库、环境变量、配置文件)打包到一个标准化的单元中,这个单元就是 容器 。容器在任何安装了 Docker 引擎的机器上都能以相同的方式运行,真正实现了“一次构建,处处运行”,彻底解决了“在我机器上好好的”这一经典难题。
对于 Doris 部署而言,使用 Docker 的优势显而易见:
- 环境隔离 :Doris 的 FE(Frontend)和 BE(Backend)服务可以运行在独立的容器中,互不干扰。
- 快速部署与销毁 :一行命令即可启动或停止整个集群,方便进行功能测试和版本验证。
- 版本管理 :可以轻松切换不同版本的 Doris 镜像,无需重装系统或处理复杂的依赖冲突。
- 资源可控 :可以精确地为每个容器分配 CPU、内存等资源。
1.2 什么是 Apache Doris?
Apache Doris 是一个现代化的、高性能的、实时的分析型数据库(MPP)。它最初由百度开发并开源,旨在解决海量数据的实时分析问题。Doris 兼容 MySQL 协议,支持标准 SQL,使得开发者可以像使用 MySQL 一样轻松上手。其核心架构主要包含两个组件:
-
Frontend (FE) :
- 职责 :负责元数据管理、集群管理、用户认证以及查询的接收和规划。
- 角色 :分为 Leader FE 和 Follower FE。一个集群有且仅有一个 Leader FE,负责写入;多个 Follower FE 用于实现高可用和读负载均衡。
- 类比 :可以理解为大脑和调度中心。
-
Backend (BE) :
- 职责 :负责数据存储和查询执行。数据以列式存储,并自动划分 Tablet(数据分片)进行分布式管理。
- 角色 :通常由多个 BE 节点组成,通过增加 BE 节点可以实现存储和计算能力的水平扩展。
- 类比 :可以理解为负责干活的肌肉和存储仓库。
Doris 的典型应用场景 :
- 实时数据仓库 :对接 Kafka、Flink 等流处理系统,实现数据的实时摄入与查询。
- 交互式 OLAP 分析 :支持对亿级甚至十亿级数据表的亚秒级多维分析查询。
- 统一查询入口 :通过 Doris 的联邦查询能力,对存放在 Hive、Iceberg、Hudi 等外部数据源的数据进行统一查询。
将 Doris 部署在 Docker 中,正是为了简化这一强大系统的体验和运维门槛。
2. 环境准备与版本说明
在开始之前,请确保你的操作环境满足以下要求。本文将以 Linux 系统(如 CentOS 7+ 或 Ubuntu 20.04+)为例进行演示,macOS 和 Windows 10/11(使用 WSL2)也可参照类似步骤。
2.1 基础环境要求
- 操作系统 :Linux (内核版本 3.10+), macOS, Windows 10/11 with WSL2。
- Docker 引擎 :版本 20.10.0 或更高。这是运行容器的核心。
- Docker Compose :版本 1.29.0 或更高。用于编排和管理多容器应用(如 Doris 集群)的利器。
- 硬件资源 :建议至少 4核 CPU,8GB 内存,20GB 可用磁盘空间。生产环境需根据数据量和并发评估。
2.2 软件版本说明
本文演示将使用以下版本,请注意软件生态迭代较快,具体版本号可根据实际情况调整,但核心操作逻辑相通。
-
Docker 镜像
:我们将使用 Apache Doris 官方在 Docker Hub 上提供的镜像
apache/doris:2.0.4。此镜像包含了构建好的 FE 和 BE 组件。 - Doris 版本 :2.0.4(镜像标签决定)。这是当前的一个稳定版本。
-
关键工具
:
-
mysql-client:用于连接 Doris FE(因为 Doris 兼容 MySQL 协议)。
-
重要提示 :本文所有步骤均在测试环境中验证。 在生产环境部署前,请务必进行充分测试和评估 ,并考虑使用更健壮的编排工具(如 Kubernetes)和持久化存储方案。
2.3 安装 Docker 与 Docker Compose
如果你的系统尚未安装 Docker,请按照以下步骤进行安装(以 Ubuntu 22.04 为例)。
1. 卸载旧版本(如有)
sudo apt-get remove docker docker-engine docker.io containerd runc
2. 设置 Docker 的 Apt 仓库
# 更新 apt 包索引并安装依赖
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
# 添加 Docker 的官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 设置稳定版仓库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
3. 安装 Docker 引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
4. 验证安装
sudo docker run hello-world
如果看到 “Hello from Docker!” 等信息,说明 Docker 安装成功。
5. (可选)免 sudo 执行 Docker 命令
将当前用户加入
docker
用户组,之后运行 Docker 命令就不需要
sudo
了。
sudo groupadd docker # 如果 docker 组已存在,会提示,可忽略
sudo usermod -aG docker $USER
newgrp docker # 刷新用户组,或退出终端重新登录
docker run hello-world # 再次测试,应无需 sudo
6. 安装独立版本的 Docker Compose(如果系统包管理器未提供)
虽然 Docker Desktop 和较新的 Docker Engine 已包含
docker compose
插件,但为了兼容性,也可以安装独立版本。
# 下载最新稳定版的 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version
# 或使用插件版本
docker compose version
环境准备就绪,接下来我们开始部署 Doris 集群。
3. 单机快速体验:使用 Docker Run
对于只是想快速体验 Doris 功能的同学,可以使用
docker run
命令快速启动一个 All-in-One 的容器,其中同时运行了 FE 和 BE。这种方式
仅适用于测试和学习
。
3.1 启动 Doris 容器
docker run -d \
--name doris-quickstart \
-p 9030:9030 \ # FE MySQL 协议端口
-p 8030:8030 \ # FE HTTP 端口(Web UI)
-p 8040:8040 \ # BE HTTP 端口
apache/doris:2.0.4
命令解释:
-
-d:后台运行容器。 -
--name:为容器指定一个名称,方便管理。 -
-p:端口映射,将容器内部端口映射到宿主机。9030用于MySQL客户端连接,8030用于访问FE的Web界面。
3.2 进入容器并初始化
容器启动后,FE 和 BE 服务需要一些时间来完成初始化。我们可以进入容器查看日志或执行初始化命令。
1. 查看容器日志
docker logs -f doris-quickstart
等待日志中出现
fe start success
和
be start success
类似的字样,表示服务启动成功。
2. 进入容器
docker exec -it doris-quickstart bash
3. 连接 FE 并完成初始化 在容器内部,使用 Doris 自带的 MySQL 客户端连接 FE。
mysql -h 127.0.0.1 -P 9030 -uroot
首次连接可能不需要密码。连接成功后,执行以下 SQL 来添加一个 BE 节点到集群中(对于 All-in-One 容器,BE 就在本机)。
-- 在 MySQL 客户端中执行
ALTER SYSTEM ADD BACKEND “127.0.0.1:9050”;
9050
是 BE 的心跳服务端口(在容器内部网络)。
4. 验证集群状态
SHOW PROC ‘/backends’\G
查看结果,如果
Alive
列为
true
,则说明 BE 节点添加成功,集群就绪。
3.3 从宿主机连接 Doris
现在,你可以在宿主机上使用任何 MySQL 客户端(如
mysql
,
DBeaver
,
Navicat
)连接 Doris 了。
-
主机
:
127.0.0.1或你的宿主机 IP -
端口
:
9030 -
用户名
:
root - 密码 :初始可能为空
# 在宿主机上执行
mysql -h 127.0.0.1 -P 9030 -uroot
单机模式虽然简单,但无法体验 Doris 集群的真正威力,且数据存储在容器内,容器删除数据即丢失。接下来,我们使用 Docker Compose 部署一个更接近生产形态的集群。
4. 使用 Docker Compose 部署集群
我们将部署一个包含 1个 FE Leader + 1个 FE Follower + 2个 BE 的集群,并使用宿主机的目录进行数据持久化。
4.1 创建项目目录与配置文件
首先,创建一个工作目录来存放所有配置文件。
mkdir -p ~/docker-doris && cd ~/docker-doris
4.2 编写 Docker Compose 文件
创建
docker-compose.yml
文件,这是定义整个集群的核心。
version: ‘3.8’
services:
doris-fe-01:
image: apache/doris:2.0.4
container_name: doris-fe-01
hostname: doris-fe-01
environment:
- FE_SERVERS=fe1:127.0.0.1:9010,fe2:127.0.0.1:9010
- FE_ID=1
volumes:
- ./fe-01/doris-meta:/opt/apache-doris/fe/doris-meta
- ./fe-01/log:/opt/apache-doris/fe/log
ports:
- “8031:8030” # Web UI
- “9031:9030” # MySQL
command: [“fe”]
networks:
- doris-net
doris-fe-02:
image: apache/doris:2.0.4
container_name: doris-fe-02
hostname: doris-fe-02
environment:
- FE_SERVERS=fe1:127.0.0.1:9010,fe2:127.0.0.1:9010
- FE_ID=2
volumes:
- ./fe-02/doris-meta:/opt/apache-doris/fe/doris-meta
- ./fe-02/log:/opt/apache-doris/fe/log
depends_on:
- doris-fe-01
command: [“fe”]
networks:
- doris-net
doris-be-01:
image: apache/doris:2.0.4
container_name: doris-be-01
hostname: doris-be-01
environment:
- FE_SERVERS=fe1:127.0.0.1:9010,fe2:127.0.0.1:9010
volumes:
- ./be-01/storage:/opt/apache-doris/be/storage
- ./be-01/log:/opt/apache-doris/be/log
depends_on:
- doris-fe-01
- doris-fe-02
command: [“be”]
networks:
- doris-net
doris-be-02:
image: apache/doris:2.0.4
container_name: doris-be-02
hostname: doris-be-02
environment:
- FE_SERVERS=fe1:127.0.0.1:9010,fe2:127.0.0.1:9010
volumes:
- ./be-02/storage:/opt/apache-doris/be/storage
- ./be-02/log:/opt/apache-doris/be/log
depends_on:
- doris-fe-01
- doris-fe-02
command: [“be”]
networks:
- doris-net
networks:
doris-net:
driver: bridge
配置文件关键点解析 :
-
服务定义
:定义了四个服务,两个 FE (
doris-fe-01,doris-fe-02) 和两个 BE (doris-be-01,doris-be-02)。 -
镜像
:统一使用
apache/doris:2.0.4。 -
环境变量
:
-
FE_SERVERS:指定 FE 集群的所有节点,格式为fe_name:fe_host:edit_log_port。edit_log_port默认为 9010,用于 FE 节点间元数据同步。 注意 :这里fe_host写127.0.0.1是因为所有容器共享doris-net网络,它们可以通过容器名(hostname)互相解析,127.0.0.1在容器内指向自己。更清晰的写法是fe1:doris-fe-01:9010,fe2:doris-fe-02:9010,但官方镜像可能依赖此格式。 -
FE_ID:每个 FE 节点的唯一标识,必须不同。
-
-
数据卷 (Volumes)
:将容器内的重要目录挂载到宿主机。这是
数据持久化
的关键,即使容器删除,数据依然保留在
./fe-xx/doris-meta和./be-xx/storage中。-
FE:挂载元数据目录 (
doris-meta) 和日志目录 (log)。 -
BE:挂载数据存储目录 (
storage) 和日志目录 (log)。
-
FE:挂载元数据目录 (
-
端口映射
:只将
doris-fe-01的端口映射到宿主机(8031->8030, 9031->9030),作为集群的访问入口。其他节点的端口仅在 Docker 网络内可访问,更安全。 - 依赖 :BE 依赖于 FE,确保 FE 先启动。
-
网络
:所有服务加入自定义的
doris-net桥接网络,使得容器间可以通过容器名直接通信。
4.3 启动 Doris 集群
在
docker-compose.yml
所在目录执行:
docker-compose up -d
-d
参数表示后台启动。Docker Compose 会自动拉取镜像(如果本地没有),并按依赖顺序创建并启动所有容器。
使用以下命令查看启动状态和日志:
# 查看所有容器状态
docker-compose ps
# 查看 doris-fe-01 的日志
docker-compose logs -f doris-fe-01
等待所有服务启动完成,在 FE 日志中看到
fe start success
,在 BE 日志中看到
be start success
。
4.4 初始化 Doris 集群
服务启动后,我们需要通过 FE Leader 将 BE 节点加入到集群中。
1. 连接 FE Leader
我们映射了
doris-fe-01
的端口,因此通过它连接。
mysql -h 127.0.0.1 -P 9031 -uroot
2. 添加 BE 节点 在 MySQL 客户端中,执行以下命令,将两个 BE 节点添加到集群。 注意:这里的主机名是容器名,因为它们在同一个 Docker 网络中 。
ALTER SYSTEM ADD BACKEND “doris-be-01:9050”;
ALTER SYSTEM ADD BACKEND “doris-be-02:9050”;
3. 验证集群状态 分别查看 FE 和 BE 的状态。
-- 查看 FE 节点状态
SHOW PROC ‘/frontends’\G
-- 查看 BE 节点状态
SHOW PROC ‘/backends’\G
在输出中,你需要确认:
-
frontends结果中,doris-fe-01和doris-fe-02的Alive字段为true,且其中一个是Leader。 -
backends结果中,两个 BE 的Alive字段为true,SystemDecommissioned为false。
至此,一个基于 Docker Compose 的 Doris 集群就部署完成了!
5. 基本操作与验证
现在,让我们通过几个简单操作来验证集群工作正常。
5.1 创建数据库与表
-- 1. 创建数据库
CREATE DATABASE docker_test_db;
USE docker_test_db;
-- 2. 创建一张表(以明细模型为例)
CREATE TABLE IF NOT EXISTS user_behavior (
user_id INT,
item_id INT,
category_id INT,
behavior VARCHAR(32),
ts DATETIME
)
DUPLICATE KEY(user_id, item_id) -- 指定排序列
DISTRIBUTED BY HASH(user_id) BUCKETS 10 -- 分桶
PROPERTIES (
“replication_num” = “2” -- 副本数,需小于等于 BE 节点数
);
-- 3. 查看表结构
DESC user_behavior;
5.2 插入与查询数据
-- 插入数据
INSERT INTO user_behavior VALUES
(1001, 2001, 101, ‘click’, ‘2024-01-01 10:00:00’),
(1001, 2002, 102, ‘buy’, ‘2024-01-01 10:01:00’),
(1002, 2001, 101, ‘click’, ‘2024-01-01 10:02:00’);
-- 查询数据
SELECT * FROM user_behavior;
-- 进行聚合查询
SELECT user_id, COUNT(*) as action_count, MAX(ts) as last_action
FROM user_behavior
GROUP BY user_id;
5.3 访问 Web UI
在浏览器中打开
http://<你的宿主机IP>:8031
,使用用户名
root
(密码默认为空)登录,即可进入 Doris 的 Web 管理界面。在这里你可以:
- 查看集群健康状态。
- 执行 SQL 查询。
- 监控系统负载。
- 管理用户和权限。
6. 常见问题与排查思路
在部署和运行过程中,你可能会遇到以下问题。这里提供排查思路。
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
docker-compose up
失败
| 端口被占用、镜像拉取失败、权限不足。 |
1.
netstat -tlnp | grep <端口号>
检查端口冲突,修改
docker-compose.yml
中的映射端口。
2.
docker pull apache/doris:2.0.4
手动拉取镜像。
3. 使用
sudo
或确保当前用户在
docker
组。
|
FE 启动失败,日志报错
EditLog
相关
|
元数据目录 (
doris-meta
) 权限问题或已有旧数据。
|
1. 检查宿主机挂载目录的权限,确保容器内进程可写。
2. 如果是重新部署,尝试清空
./fe-0x/doris-meta
目录(
注意:这会丢失所有元数据!
)。
|
BE 启动失败,日志报错
storage_root_path
|
存储目录 (
storage
) 权限问题。
|
检查宿主机
./be-0x/storage
目录的权限,确保容器内进程可读写。
|
SHOW PROC ‘/backends’
显示 BE
Alive
为
false
| BE 与 FE 之间网络不通或心跳失败。 |
1. 在 FE 容器内
ping doris-be-01
,检查网络连通性。
2. 检查 BE 日志,看是否有启动错误。 3. 确认添加 BE 时使用的 IP 和端口正确(应是容器名和
9050
)。
4. 检查防火墙或安全组是否放行了
9050
端口(在 Docker 网络内部)。
|
执行
ALTER SYSTEM ADD BACKEND
报错
| BE 节点已添加过或端口冲突。 |
1. 先执行
SHOW PROC ‘/backends’;
查看是否已存在。
2. 如果已存在且是
Dead
状态,尝试
ALTER SYSTEM DROP BACKEND “<be_host>:<be_heartbeat_port>”;
后再重新添加。
|
| 插入或查询数据非常慢 | 资源不足(CPU、内存)、副本未生效。 |
1. 通过
docker stats
查看容器资源使用情况。
2. 检查表属性
“replication_num”
,如果为 2 但只有一个活跃 BE,数据无法完成复制,会影响可用性。确保活跃 BE 数 >= 副本数。
|
| Web UI 无法访问 | 端口映射错误、FE 未成功启动、防火墙。 |
1.
docker-compose ps
确认
doris-fe-01
状态为
Up
。
2.
curl -v http://localhost:8031
在宿主机测试。
3. 检查宿主机防火墙规则。 |
通用排查命令 :
# 查看所有容器状态
docker-compose ps
# 查看特定容器日志
docker-compose logs -f <service_name>
# 进入容器内部
docker-compose exec <service_name> bash
# 在容器内检查进程
ps aux | grep doris
# 在容器内检查端口监听
netstat -tlnp
7. 最佳实践与工程建议
将 Docker 用于 Doris 部署,在便捷的同时也需要遵循一些最佳实践,以确保稳定性、可维护性和性能。
7.1 数据持久化与备份
-
必须使用 Volume 挂载
:如本文所示,一定要将
doris-meta(FE) 和storage(BE) 目录挂载到宿主机或网络存储(如 NFS)。这是数据的生命线。 -
定期备份
:
-
FE 元数据
:除了挂载,应定期对
doris-meta目录进行快照备份。可以使用cron任务执行tar打包。 -
数据备份
:利用 Doris 的
BACKUP和RESTORE语句将数据备份到对象存储(如 S3、OSS)或 HDFS。 -
导出数据
:对于关键表,定期使用
SELECT INTO OUTFILE导出为文件。
-
FE 元数据
:除了挂载,应定期对
7.2 资源配置与监控
-
限制容器资源
:在
docker-compose.yml中为每个服务配置资源限制,防止单个容器耗尽主机资源。services: doris-fe-01: # ... 其他配置 ... deploy: resources: limits: cpus: ‘2.0’ memory: 4G reservations: cpus: ‘1.0’ memory: 2G -
监控
:
-
Docker 层面
:使用
docker stats或cAdvisor、Prometheus(配合node-exporter)监控容器 CPU、内存、网络 IO。 -
Doris 层面
:通过 FE Web UI 的监控模块,或使用
Grafana+Prometheus抓取 Doris 的 Metrics(FE/BE 都暴露了 HTTP Metrics 接口)。
-
Docker 层面
:使用
7.3 网络与安全
-
使用自定义网络
:正如我们使用的
doris-net,这提供了良好的隔离性,并且容器间可以通过服务名通信。 - 最小化端口暴露 :只将 FE 的 MySQL 和 HTTP 端口映射到宿主机。BE 端口、FE 编辑日志端口(9010)等应仅在 Docker 网络内可访问。
-
修改默认密码
:部署后,第一时间通过
SET PASSWORD FOR ‘root’ = PASSWORD(‘your_strong_password’);修改 root 密码。 - 创建业务用户 :避免直接使用 root 用户进行业务操作,应创建具有特定权限的数据库用户。
7.4 生产环境考量
本文的 Docker Compose 方案 非常适合开发、测试和环境验证 。但对于 生产环境 ,需要考虑更复杂的因素:
- 高可用 :至少需要 3 个 FE(1 Leader + 2 Follower)以避免脑裂,BE 节点数量根据数据量和查询压力确定。
- 编排工具 :考虑使用 Kubernetes (K8s) 进行编排,它能提供更强大的自愈、滚动升级、扩缩容和负载均衡能力。社区已有 Doris 的 K8s Operator 项目。
- 存储分离 :对于海量数据,考虑使用云盘或分布式存储(如 Ceph)作为 BE 的持久化卷,并提供更高的 IOPS 和可靠性。
- 日志收集 :将容器日志统一收集到 ELK(Elasticsearch, Logstash, Kibana)或 Loki 等日志平台,方便问题追踪。
7.5 日常运维命令
# 优雅停止集群
docker-compose down
# 停止并删除容器、网络(保留Volume数据)
docker-compose down -v
# 重启单个服务(如 BE)
docker-compose restart doris-be-01
# 查看服务日志
docker-compose logs --tail=100 -f doris-fe-01
# 进入容器执行命令
docker-compose exec doris-fe-01 mysql -h127.0.0.1 -P9030 -uroot -p
# 扩容一个 BE 节点(需修改 compose 文件并启动)
# 1. 在 docker-compose.yml 中添加 doris-be-03 服务定义。
# 2. docker-compose up -d doris-be-03
# 3. 进入 FE,执行 ALTER SYSTEM ADD BACKEND “doris-be-03:9050”;
通过以上步骤,你不仅能在本地快速拉起一个功能完整的 Doris 集群,还能掌握其基本的运维操作。这套 Docker 化部署方案极大地降低了学习和试用门槛,让你能更专注于 Doris 核心功能与性能的探索。当需要迁移到生产环境时,基于此方案获得的理解,可以更平滑地过渡到基于 K8s 或物理机的集群部署模式。

447

被折叠的 条评论
为什么被折叠?



