这次我们来看一个在 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 的基本原理和操作,避免复杂的物理机或虚拟机环境搭建。

能解决什么问题?

  1. 环境快速就绪 :无需在宿主机安装复杂的 Java 环境或处理依赖冲突,一个 docker pull docker run 即可获得一个基础的 Doris 实例。
  2. 环境隔离与清理 :测试完成后,直接删除容器和镜像即可彻底清理,不影响宿主机其他服务。
  3. 标准化部署 :使用官方或社区维护的镜像,能保证基础环境的一致性。

不适合什么场景?

  1. 生产环境高可用集群 :单容器部署的 Doris 不具备高可用性,FE 或 BE 容器崩溃会导致服务中断。生产环境需要多实例、跨主机的部署方案。
  2. 高性能压力测试 :Docker 的虚拟化会带来一定的性能开销,且单机资源有限,无法真实反映 Doris 在物理集群上的性能表现。
  3. 海量数据存储与分析 :容器内存储是易失或受限于宿主机单目录的,不适合需要大规模、持久化、高吞吐的数据存储场景。

安全与合规边界

  • 本文部署的 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 自定义网络。

  1. 将应用容器与 Doris 容器加入同一个自定义网络(如上面 Compose 例子中的 doris-net )。
  2. 在应用容器中,使用 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,性能主要受限于:

  1. 宿主机资源 :分配给 Docker 引擎的总 CPU 和内存。
  2. 存储性能 :如果数据卷 ( -v ) 挂载到宿主机机械硬盘,I/O 速度会远低于 SSD,影响数据导入和查询速度。
  3. 网络模式 bridge 网络有一定开销。对于跨容器通信,自定义网络或 host 网络(牺牲隔离性)性能更好。
  4. 配置参数 :容器内 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 之旅更顺畅。

  1. 始终使用数据卷持久化 :这是铁律。FE 的 doris-meta 和 BE 的 storage 目录必须通过 -v 挂载到宿主机。否则,容器停止就意味着数据丢失。
  2. 使用 Docker Compose 管理多容器 :对于涉及 FE、BE 甚至多个 BE 的场景,一个 docker-compose.yml 文件能清晰地定义服务、网络和依赖关系,比一堆 docker run 命令更易于维护和重现。
  3. 明确网络策略
    • 测试/学习 :使用 --network container:fe 让 BE 共享 FE 网络,简化配置,直接用 localhost 通信。
    • 模拟多机环境 :使用 Docker 自定义网络,并固定容器 IP,这样更接近真实生产环境的网络模式。
  4. 配置参数外置 :将 FE 和 BE 的 conf 目录挂载出来。这样你可以在宿主机上直接修改配置文件(如 fe.conf , be.conf ),而无需进入容器,修改后重启容器即可生效。
  5. 善用日志定位问题 :当服务异常时,第一时间使用 docker logs -f [container_name] 查看容器日志。Doris 的日志通常能给出明确的错误原因,如无法绑定端口、磁盘空间不足、内存分配失败等。
  6. 先验证基础功能 :部署完成后,不要急于导入大量数据。先按照第 5 节的步骤,完成创建数据库、表、插入和查询数据这一最小闭环,确保集群底层通信是正常的。
  7. 资源限制与监控 :对于长期运行的测试容器,可以考虑使用 -m --cpus 等参数限制其资源使用,避免影响宿主机其他服务。同时,养成用 docker stats 监控的习惯。
  8. 镜像版本管理 :记录所使用的 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 在云原生环境下的状态管理和弹性伸缩有更深的理解。

更多推荐