Docker部署Apache Doris:FE与BE节点配置与注册实战指南
这次我们来看一个在 Docker 中部署 Apache Doris 的实战记录。Doris 作为一款高性能的实时分析型数据库,其分布式架构依赖于 FE(Frontend)和 BE(Backend)节点的协同工作。对于很多开发者来说,在 Docker 环境下快速搭建一个 Doris 集群进行测试或学习是常见需求,但 FE 和 BE 节点的配置与注册环节却容易成为“拦路虎”,导致服务无法正常启动或节点间通信失败。
这篇文章的核心就是解决这个问题。我们将重点关注如何在 Docker 容器内正确配置 FE 和 BE 节点,并完成关键的注册步骤,最终搭建起一个可用的 Doris 服务。整个过程不涉及复杂的物理机集群规划,而是聚焦于单机 Docker 环境下的最小化可运行配置,让你能快速验证 Doris 的核心功能。
本文会带你完成从环境准备、镜像拉取、容器启动、节点配置到最终服务验证的全流程。如果你关心如何在容器化环境中避坑,让 Doris 的 FE 和 BE 顺利“握手”,那么这篇记录可以直接参考。
1. 核心能力速览
在深入部署细节前,我们先通过下表快速了解本次 Docker 部署 Doris 的关键信息,这有助于你判断是否适合继续操作。
| 能力项 | 说明 |
|---|---|
| 部署目标 | 在 Docker 容器内运行 Apache Doris 数据库服务 |
| 核心组件 | FE (Frontend) 节点、BE (Backend) 节点 |
| 硬件门槛 | 建议至少 2 核 CPU,4GB 以上内存。磁盘空间预留 10GB 以上用于镜像和存储。 |
| 网络要求 | 容器间需要网络互通,BE 需要能访问 FE 的服务端口。 |
| 启动方式 |
通过
docker run
命令分别启动 FE 和 BE 容器,或使用 Docker Compose 编排。
|
| 配置关键 | FE 的元数据持久化、BE 的存储路径设置、以及 BE 向 FE 的正确注册。 |
| 常见踩坑点 | 容器主机名解析、FE/BE 配置文件挂载、端口映射、注册 IP 地址错误。 |
| 适合场景 | 本地开发测试、功能验证、学习 Doris 架构。不适合直接用于生产环境。 |
2. 适用场景与使用边界
Docker 部署 Doris 主要服务于特定场景,明确边界能帮助你更好地决策。
适合谁用?
- 数据分析与开发工程师 :需要在隔离环境中快速搭建 Doris 进行 SQL 特性测试、数据导入导出验证。
- 架构师或运维人员 :希望评估 Doris 在容器化环境下的运行状态和资源消耗,为生产环境容器化部署做技术预研。
- 学生或学习者 :想低成本学习分布式数据库 Doris 的基本原理和操作,避免复杂的物理机或虚拟机环境搭建。
能解决什么问题?
-
环境快速就绪
:无需在宿主机安装复杂的 Java 环境或处理依赖冲突,一个
docker pull和docker run即可获得一个基础的 Doris 实例。 - 环境隔离与清理 :测试完成后,直接删除容器和镜像即可彻底清理,不影响宿主机其他服务。
- 标准化部署 :使用官方或社区维护的镜像,能保证基础环境的一致性。
不适合什么场景?
- 生产环境高可用集群 :单容器部署的 Doris 不具备高可用性,FE 或 BE 容器崩溃会导致服务中断。生产环境需要多实例、跨主机的部署方案。
- 高性能压力测试 :Docker 的虚拟化会带来一定的性能开销,且单机资源有限,无法真实反映 Doris 在物理集群上的性能表现。
- 海量数据存储与分析 :容器内存储是易失或受限于宿主机单目录的,不适合需要大规模、持久化、高吞吐的数据存储场景。
安全与合规边界 :
- 本文部署的 Doris 实例默认无认证或使用弱密码, 严禁直接暴露在公网 。
- 容器内数据(如表数据、元数据)需通过 Volume 持久化,否则容器删除后数据会丢失。
- 用于测试的数据应确保不涉及敏感信息,或使用脱敏后的数据集。
3. 环境准备与前置条件
开始部署前,请确保你的本地环境满足以下要求。这是后续所有操作的基础。
3.1 操作系统
- 推荐 :Linux 发行版(如 Ubuntu 20.04/22.04, CentOS 7/8)或 macOS。
- 也可行 :Windows 10/11 专业版或企业版(需使用 WSL 2 或 Docker Desktop)。
- 本文命令以 Linux/macOS 的 Bash 环境为例,Windows 用户请在 WSL 2 终端或 PowerShell 中操作。
3.2 Docker 环境
-
Docker Engine
:版本 20.10.0 或更高。可通过
docker --version检查。 -
Docker Compose
:版本 v2 或更高(如果选择使用 Compose 编排)。可通过
docker compose version检查。 -
确保 Docker 服务正在运行:
sudo systemctl status docker(Linux) 或查看 Docker Desktop 状态。
3.3 资源检查
-
CPU与内存
:运行
docker info可查看 Docker 资源总量。建议为 Doris 容器分配至少 2 核 CPU 和 4GB 内存。 -
磁盘空间
:Doris 镜像本身约 1-2GB,运行后数据会增长。确保
/var/lib/docker(Linux默认)或 Docker Desktop 数据目录有至少 10GB 可用空间。 - 端口占用 :Doris FE 默认使用 8030 (HTTP端口)、9030 (MySQL协议端口)、9010 (编辑日志端口)。BE 默认使用 9060、8040、9050等。确保这些端口在宿主机上未被占用。
3.4 网络考虑
-
默认的
bridge网络模式下,容器拥有独立的 IP,但可以通过端口映射 (-p) 供宿主机访问。 - 如果计划启动多个容器(如多个 BE),它们需要处于同一用户自定义的 Docker 网络中,以便通过容器名互相访问。
4. 安装部署与启动方式
我们将分步启动 FE 和 BE 容器。这里提供两种方式:直接使用
docker run
命令,以及使用
docker-compose.yml
编排文件。前者更透明,后者更简洁。
4.1 方式一:使用 Docker Run 命令
步骤1:拉取 Doris 镜像
建议使用 Apache Doris 官方在 Docker Hub 发布的镜像,版本选择与你需求匹配的,如
1.2.4
。
docker pull apache/doris:1.2.4-fe-x86_64
docker pull apache/doris:1.2.4-be-x86_64
步骤2:启动 FE 节点 FE 负责元数据管理和客户端连接。关键是要将元数据目录持久化到宿主机。
# 创建宿主机目录用于持久化 FE 元数据
mkdir -p /opt/doris-docker/fe/doris-meta
mkdir -p /opt/doris-docker/fe/conf
# 启动 FE 容器
docker run -d \
--name doris-fe \
--hostname doris-fe \
-p 8030:8030 \
-p 9030:9030 \
-p 9010:9010 \
-v /opt/doris-docker/fe/doris-meta:/opt/apache-doris/fe/doris-meta \
-v /opt/doris-docker/fe/conf:/opt/apache-doris/fe/conf \
-e FE_SERVERS="fe1:172.20.80.1:9010" \
-e FE_ID=1 \
apache/doris:1.2.4-fe-x86_64
-
-v /opt/doris-docker/fe/doris-meta:...:将容器内元数据目录挂载到宿主机,防止容器重启后元数据丢失。 -
-v /opt/doris-docker/fe/conf:...:挂载配置目录,方便后续修改配置文件。 -
-e FE_SERVERS:设置 FE 集群地址。单节点时,IP 需要设置为 宿主机在 Docker 网络中的 IP 或能被 BE 容器访问到的 IP,这是第一个大坑。172.20.80.1是示例,需替换。 -
-e FE_ID=1:设置 FE 节点 ID。
步骤3:启动 BE 节点 BE 负责数据存储和计算。同样需要持久化存储目录。
# 创建宿主机目录用于持久化 BE 数据
mkdir -p /opt/doris-docker/be/storage
mkdir -p /opt/doris-docker/be/conf
# 启动 BE 容器
docker run -d \
--name doris-be \
--hostname doris-be \
--network container:doris-fe \
-p 9060:9060 \
-v /opt/doris-docker/be/storage:/opt/apache-doris/be/storage \
-v /opt/doris-docker/be/conf:/opt/apache-doris/be/conf \
-e FE_SERVERS="fe1:172.20.80.1:9010" \
-e BE_ADDR="172.20.80.2:9060" \
apache/doris:1.2.4-be-x86_64
-
--network container:doris-fe:让 BE 容器共享 FE 容器的网络命名空间,这样它们就像在同一台机器上,直接用localhost通信, 这是避免网络问题的一个巧妙方法 。 -
-e FE_SERVERS:必须与 FE 容器启动时设置的FE_SERVERS中的 IP 和端口一致。 -
-e BE_ADDR:设置 BE 自身的地址,供 FE 回调。在共享网络下,可以设置为localhost:9060或容器内 IP。
4.2 方式二:使用 Docker Compose 编排
使用 Docker Compose 可以简化管理,将配置写入
docker-compose.yml
文件。
version: '3.8'
services:
doris-fe:
image: apache/doris:1.2.4-fe-x86_64
container_name: doris-fe
hostname: doris-fe
ports:
- "8030:8030"
- "9030:9030"
- "9010:9010"
volumes:
- ./fe/doris-meta:/opt/apache-doris/fe/doris-meta
- ./fe/conf:/opt/apache-doris/fe/conf
environment:
- FE_SERVERS=fe1:172.20.80.1:9010
- FE_ID=1
networks:
doris-net:
ipv4_address: 172.20.80.10
doris-be:
image: apache/doris:1.2.4-be-x86_64
container_name: doris-be
hostname: doris-be
ports:
- "9060:9060"
volumes:
- ./be/storage:/opt/apache-doris/be/storage
- ./be/conf:/opt/apache-doris/be/conf
environment:
- FE_SERVERS=fe1:172.20.80.1:9010
- BE_ADDR=172.20.80.11:9060
depends_on:
- doris-fe
networks:
doris-net:
ipv4_address: 172.20.80.11
networks:
doris-net:
driver: bridge
ipam:
config:
- subnet: 172.20.80.0/24
然后在包含该文件的目录下运行:
docker-compose up -d
Compose 方式自动创建了自定义网络
doris-net
,并固定了 FE 和 BE 的 IP,使得服务发现更稳定。
5. 功能测试与效果验证
容器启动后,最关键的一步是验证 FE 和 BE 是否正常工作,并且 BE 是否成功注册到 FE。
5.1 验证 FE 节点状态 首先,进入 FE 容器执行管理命令。
# 进入 FE 容器
docker exec -it doris-fe bash
# 连接到 FE 的 MySQL 客户端
mysql -h 127.0.0.1 -P 9030 -uroot
连接成功后,执行以下 SQL 查看 FE 状态:
SHOW PROC '/frontends'\G
如果看到
Alive
列为
true
,说明该 FE 节点自身状态正常。
5.2 添加并验证 BE 节点(关键步骤) 这是 Docker 部署中最容易出错的环节。BE 容器启动后,并不会自动注册到 FE,需要手动通过 SQL 添加。 在刚才的 MySQL 客户端中,执行:
-- 添加 BE 节点,地址为 BE 容器在 Docker 网络中的 IP 和端口(heartbeat_port)
-- 如果使用 --network container:doris-fe,则地址为 localhost:9060
-- 如果使用自定义网络(如Compose),则地址为 172.20.80.11:9060
ALTER SYSTEM ADD BACKEND "localhost:9060";
然后,查询 BE 节点状态:
SHOW PROC '/backends'\G
重点关注以下几列:
-
Alive: 是否为true。如果为false,通常是因为 FE 无法连接到BE_ADDR指定的地址端口。 -
TotalCapacity/UsedCapacity: 显示 BE 的磁盘容量和使用情况。 -
LastHeartbeat: 显示最后一次心跳时间,应该是最近几秒。 -
ErrMsg: 如果注册失败,这里会有错误信息。
5.3 基础功能测试 BE 状态正常后,可以进行简单的数据库操作测试。
-- 1. 创建测试数据库
CREATE DATABASE test_db;
USE test_db;
-- 2. 创建测试表
CREATE TABLE test_table (
id INT,
name VARCHAR(50),
score DECIMAL(5,2)
) ENGINE=OLAP
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 8
PROPERTIES (
"replication_num" = "1"
);
-- 3. 插入测试数据
INSERT INTO test_table VALUES (1, 'Alice', 95.5), (2, 'Bob', 88.0);
-- 4. 查询数据
SELECT * FROM test_table;
-- 5. 简单聚合查询
SELECT name, AVG(score) as avg_score FROM test_table GROUP BY name;
如果以上 SQL 都能成功执行并返回正确结果,说明你的 Docker 版 Doris 集群已经基本可用。
6. 接口 API 与外部连接
Doris 提供了多种访问方式,最常用的是 MySQL 协议端口。在 Docker 环境下,我们需要确保端口映射正确,才能从宿主机或其他容器访问。
6.1 MySQL 客户端连接
Doris 完全兼容 MySQL 协议,你可以使用任何 MySQL 客户端(如
mysql
命令行、Navicat、DBeaver)连接。
-
主机
:
127.0.0.1或宿主机 IP(如果 FE 容器的 9030 端口已映射)。 -
端口
:
9030 -
用户名
:
root(默认无密码) -
数据库
:连接后使用
USE db_name;切换
示例(在宿主机上执行):
mysql -h 127.0.0.1 -P 9030 -uroot
6.2 HTTP 接口访问
FE 的 8030 端口提供了 HTTP Restful API,可用于一些集群管理、数据查询(Stream Load)等。
例如,访问 FE 的 Web 界面(旧版本)或通过
curl
检查集群健康状态:
curl http://127.0.0.1:8030/api/health
如果返回
{“msg”:”success”,”code”:0}
,表示服务健康。
6.3 从其他 Docker 容器连接 如果你的应用也运行在 Docker 中,并需要连接 Doris,推荐使用 Docker 自定义网络。
-
将应用容器与 Doris 容器加入同一个自定义网络(如上面 Compose 例子中的
doris-net)。 -
在应用容器中,使用 Doris FE 的
容器名
和
内部端口
进行连接。例如,FE 的容器名为
doris-fe,那么连接地址就是doris-fe:9030。这种方式避免了复杂的 IP 管理。
7. 资源占用与性能观察
在容器化环境中,监控 Doris 的资源使用情况对于稳定性很重要。
7.1 查看容器资源占用
使用
docker stats
命令可以实时查看所有容器的 CPU、内存、网络 I/O 和磁盘 I/O 使用情况。
docker stats doris-fe doris-be
这对于初步判断 BE 节点是否因内存不足(OOM)而挂掉非常有用。一个刚启动的简单 Doris 容器,内存占用可能在 1-2GB。
7.2 通过 Doris 内部命令查看 进入 MySQL 客户端,可以查看更详细的系统状态:
-- 查看 FE 的 JVM 内存情况(需要在 FE 容器内执行 jcmd,这里不展开)
-- 查看 BE 的磁盘使用情况
SHOW PROC '/backends'\G
-- 查看集群的查询负载
SHOW PROC '/current_queries';
7.3 性能影响因素 在 Docker 中运行 Doris,性能主要受限于:
- 宿主机资源 :分配给 Docker 引擎的总 CPU 和内存。
-
存储性能
:如果数据卷 (
-v) 挂载到宿主机机械硬盘,I/O 速度会远低于 SSD,影响数据导入和查询速度。 -
网络模式
:
bridge网络有一定开销。对于跨容器通信,自定义网络或host网络(牺牲隔离性)性能更好。 - 配置参数 :容器内 Doris 的 JVM 堆内存、BE 的存储路径等配置需要根据容器实际获得的内存进行调整,默认配置可能不合适。
8. 常见问题与排查方法
以下是 Docker 部署 Doris 时最常遇到的问题及解决方法。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| FE 容器启动后马上退出 |
1. 元数据目录权限问题。
2. 端口被占用。 3. 配置文件错误。 |
1.
docker logs doris-fe
查看启动日志。
2.
docker ps -a
查看容器状态。
|
1. 确保挂载的宿主机目录对容器内进程可写(通常需
chmod 777
或调整属主)。
2. 更换宿主机映射端口或停止占用端口的进程。 3. 检查挂载的
conf/
目录下配置文件格式。
|
BE 注册到 FE 失败,
Alive
为
false
|
1. 网络不通,FE 无法访问
BE_ADDR
。
2.
BE_ADDR
或
FE_SERVERS
的 IP/端口配置错误。
3. BE 服务未正常启动。 |
1. 在 FE 容器内
ping
或
telnet
BE 的 IP 和端口。
2. 检查
SHOW PROC ‘/backends’;
中的
ErrMsg
。
3.
docker logs doris-be
查看 BE 日志。
|
1.
推荐使用
--network container:fe
或自定义网络
,使用容器名通信。
2. 确认
ALTER SYSTEM ADD BACKEND
语句中的地址与 BE 实际监听地址一致。
3. 确保 BE 的
storage
目录挂载且权限正确。
|
| MySQL 客户端无法连接 9030 端口 |
1. 端口未正确映射到宿主机。
2. FE 服务未监听或启动失败。 3. 防火墙/安全组规则阻止。 |
1.
docker ps
查看端口映射列 (
PORTS
)。
2.
netstat -tlnp | grep 9030
在宿主机查看端口监听。
3. 进入 FE 容器检查进程
ps aux | grep fe
。
|
1. 确保
docker run
或
compose
文件中包含了
-p 9030:9030
。
2. 重启 FE 容器并查看日志。 3. 关闭宿主机的防火墙或添加规则(仅测试环境)。 |
| 数据插入或查询非常慢 |
1. 容器资源(CPU/内存)不足。
2. 存储卷位于慢速磁盘。 3. 表结构或查询设计不佳。 |
1. 使用
docker stats
观察资源瓶颈。
2. 检查宿主机磁盘 I/O 使用率 (
iotop
)。
3. 分析查询计划
EXPLAIN your_sql;
。
|
1. 为 Docker 分配更多资源,或调整 Doris BE 的内存参数。
2. 将数据卷挂载到 SSD 磁盘路径。 3. 优化表模型(选择正确的索引、分桶)。 |
| 容器重启后数据丢失 |
未使用
-v
参数持久化关键目录。
|
检查容器启动命令是否包含对
doris-meta
(FE) 和
storage
(BE) 的卷挂载。
|
务必
使用
-v
将
fe/doris-meta
和
be/storage
挂载到宿主机。数据无价!
|
ALTER SYSTEM ADD BACKEND
执行成功,但 BE 状态一直为
Decommissioned
或
Offline
| BE 节点曾经加入过集群,元数据中已有记录,但信息不匹配。 |
在 FE 中执行
SHOW PROC ‘/backends’;
查看详细状态。
|
先移除错误的 BE 记录,再重新添加:
ALTER SYSTEM DECOMMISSION BACKEND “be_host:port”;
或
ALTER SYSTEM DROP BACKEND “be_host:port”;
然后重新执行
ADD BACKEND
。
|
9. 最佳实践与使用建议
基于多次踩坑经验,总结以下建议,能让你的 Docker Doris 之旅更顺畅。
-
始终使用数据卷持久化
:这是铁律。FE 的
doris-meta和 BE 的storage目录必须通过-v挂载到宿主机。否则,容器停止就意味着数据丢失。 -
使用 Docker Compose 管理多容器
:对于涉及 FE、BE 甚至多个 BE 的场景,一个
docker-compose.yml文件能清晰地定义服务、网络和依赖关系,比一堆docker run命令更易于维护和重现。 -
明确网络策略
:
-
测试/学习
:使用
--network container:fe让 BE 共享 FE 网络,简化配置,直接用localhost通信。 - 模拟多机环境 :使用 Docker 自定义网络,并固定容器 IP,这样更接近真实生产环境的网络模式。
-
测试/学习
:使用
-
配置参数外置
:将 FE 和 BE 的
conf目录挂载出来。这样你可以在宿主机上直接修改配置文件(如fe.conf,be.conf),而无需进入容器,修改后重启容器即可生效。 -
善用日志定位问题
:当服务异常时,第一时间使用
docker logs -f [container_name]查看容器日志。Doris 的日志通常能给出明确的错误原因,如无法绑定端口、磁盘空间不足、内存分配失败等。 - 先验证基础功能 :部署完成后,不要急于导入大量数据。先按照第 5 节的步骤,完成创建数据库、表、插入和查询数据这一最小闭环,确保集群底层通信是正常的。
-
资源限制与监控
:对于长期运行的测试容器,可以考虑使用
-m、--cpus等参数限制其资源使用,避免影响宿主机其他服务。同时,养成用docker stats监控的习惯。 - 镜像版本管理 :记录所使用的 Doris 镜像版本标签。不同版本间的配置可能略有差异,明确版本有助于问题复现和升级。
10. 总结与下一步
通过以上步骤,你应该已经成功在 Docker 中部署了一个包含 FE 和 BE 节点的 Apache Doris 集群,并完成了基础的功能验证。这次部署的核心可以归结为三点: 正确的网络配置让 FE 和 BE 能互相发现 、 关键目录的持久化避免数据丢失 、 通过 SQL 命令完成 BE 节点的最终注册 。
最容易踩坑的地方集中在网络层面,尤其是
FE_SERVERS
和
BE_ADDR
这两个环境变量中的 IP 地址。当你发现 BE 无法注册或 Alive 状态为 false 时,第一个就应该检查这两个地址是否在容器网络内真正可达。
这个 Docker 环境非常适合进行功能探索、SQL 语法学习和小规模数据测试。下一步,你可以尝试:
- 数据导入测试 :使用 Stream Load、Broker Load 等方式从文件向 Doris 导入数据,验证其批量数据处理能力。
-
多 BE 扩展
:在 Docker Compose 中再添加一个
doris-be2服务,体验 Doris 如何横向扩展存储与计算能力。 - 对接外部系统 :尝试使用 BI 工具(如 Superset、Metabase)或你的应用程序连接这个 Doris 数据库进行查询。
当需要向更严肃的测试或开发环境迈进时,可以考虑基于此 Docker 配置,进一步研究 Docker Swarm 或 Kubernetes 上部署 Doris 的 Helm Chart,那时你会对 Doris 在云原生环境下的状态管理和弹性伸缩有更深的理解。
更多推荐



所有评论(0)