这次我们来看一个在 Docker 中部署 Apache Doris 的实战项目。Doris 作为一款高性能的实时分析型数据库,在数据仓库和 OLAP 场景下应用广泛。很多开发者选择使用 Docker 来快速搭建 Doris 的测试或开发环境,但在部署过程中,FE(Frontend)和 BE(Backend)节点的配置与注册环节常常是“踩坑”重灾区。这篇文章将直接切入核心,带你一步步完成 Docker 环境下的 Doris 部署,并重点解决 FE/BE 节点配置错误、无法注册、网络不通等典型问题。

如果你正计划在本地或测试服务器上快速拉起一个 Doris 集群,或者在使用 Docker Compose 部署时遇到了节点状态异常,那么这篇文章的内容可以直接参考。我们将重点关注 Docker 网络配置、节点参数的正确设置、以及如何通过 SQL 命令验证集群状态。整个过程不涉及复杂的生产级调优,目标是让你能快速获得一个可运行、可查询的 Doris 单机或伪集群环境。

1. 核心能力速览

在深入部署细节前,我们先快速了解在 Docker 中部署 Doris 的核心要点和常见门槛。

能力项 说明
部署目标 在 Docker 容器内运行 Apache Doris 数据库服务。
核心组件 FE (Frontend):负责元数据管理、集群调度、接收和解析查询请求。BE (Backend):负责数据存储和计算。
典型架构 1个 FE + 1个或多个 BE 构成基本集群。
资源需求 内存 :FE 建议至少 4GB,BE 建议至少 8GB(取决于数据量)。 CPU :现代多核处理器。 磁盘 :需要持久化存储卷用于存放数据。
网络要求 FE 和 BE 容器必须能通过 容器名或 IP 相互通信 ,这是注册成功的关键。
启动方式 可通过 docker run 命令手动启动,或使用 docker-compose.yml 编排文件一键启动。
管理接口 FE 提供 MySQL 协议端口(默认 9030)用于客户端连接,以及 Web UI(默认 8030)用于监控。
适合场景 本地开发测试、功能验证、CI/CD 集成测试、学习 Doris 原理。
不适合场景 高性能生产环境(建议物理机或虚拟机部署)、超大规模数据量测试。

2. 适用场景与使用边界

在 Docker 中部署 Doris,主要服务于以下几类场景:

  • 快速原型验证 :当你需要评估 Doris 的某项功能,如数据导入、查询性能或兼容性时,Docker 能在几分钟内提供一个干净的数据库环境。
  • 开发与测试隔离 :开发人员可以在本地独立运行一个 Doris 实例,避免干扰共享的测试环境。CI/CD 流水线也可以快速创建和销毁 Doris 容器进行集成测试。
  • 学习与研究 :对于想学习 Doris 架构、SQL 语法或运维操作的用户,Docker 部署是最低成本的入门方式。

使用边界与注意事项:

  1. 性能损耗 :Docker 的虚拟化会带来一定的 I/O 和网络性能开销,因此 不推荐 用于对延迟和吞吐量有严格要求的性能基准测试或生产环境。
  2. 数据持久化 :必须将容器内的数据目录(如 /opt/apache-doris/be/storage )挂载到宿主机卷,否则容器重启后数据会丢失。
  3. 资源限制 :务必为容器分配足够的内存( -m )和 CPU 资源,否则 Doris 进程可能因 OOM(内存不足)被系统杀死。
  4. 网络模式 :使用自定义的 Docker 网络( bridge )或 host 网络,确保 FE 和 BE 能稳定通信。避免使用默认的随机网络配置。

3. 环境准备与前置条件

开始部署前,请确保你的环境满足以下要求。

3.1 基础系统环境

  • 操作系统 :Linux (Ubuntu/CentOS)、macOS 或 Windows(需 WSL2)。本文以 Linux 为例。
  • Docker 引擎 :已安装并运行 Docker Engine 20.10.0 或更高版本。可通过 docker --version 验证。
  • Docker Compose :建议安装(V2 版本更佳),用于多容器编排。可通过 docker compose version 验证。
  • 磁盘空间 :至少预留 10GB 可用空间用于存放镜像、数据和日志。

3.2 关键检查点

  • 虚拟化支持 :在 Windows 和部分 Linux 发行版上,需在 BIOS/UEFI 中开启虚拟化支持(如 Intel VT-x/AMD-V)。Windows 用户若遇到 “Virtualization support not detected” 错误,需检查此项。
  • 端口可用性 :确保宿主机的以下端口未被占用,或准备在 Docker 中映射到其他端口。
    • 8030 :FE Web UI
    • 9030 :FE MySQL 查询端口
    • 8040 :BE Web UI
    • 9060 :BE 心跳服务端口
  • 镜像源 :如果从 Docker Hub 拉取镜像速度慢,可以配置国内镜像加速器。

4. 安装部署与启动方式

我们将演示两种主流方式:使用 docker run 命令手动部署,以及使用 docker-compose.yml 文件编排部署。后者更易于管理多节点集群。

4.1 方式一:手动 Docker Run 部署

步骤1:拉取官方镜像 建议使用 Apache Doris 官方或社区维护的镜像。这里以 apache/doris:latest 或特定版本标签为例。

# 拉取 FE 镜像 (通常一个镜像包含所有组件,通过启动命令区分角色)
docker pull apache/doris:latest

步骤2:创建专用 Docker 网络 为了让 FE 和 BE 容器能通过容器名直接通信,创建一个自定义网络。

docker network create doris-network

步骤3:启动 Frontend (FE) 节点

docker run -d \
  --name doris-fe \
  --network doris-network \
  -p 8030:8030 \
  -p 9030:9030 \
  -v /your/local/path/doris-fe:/opt/apache-doris/fe/doris-meta \
  -e FE_SERVERS="fe1:127.0.0.1:9010" \
  -e FE_ID=1 \
  apache/doris:latest \
  /opt/apache-doris/fe/bin/start_fe.sh

参数解释:

  • --network doris-network :加入自定义网络。
  • -p :端口映射,将容器内端口映射到宿主机。
  • -v :数据持久化,将元数据目录挂载到宿主机,防止丢失。
  • -e FE_SERVERS -e FE_ID :环境变量用于配置 FE,在单节点部署时, 127.0.0.1 可能需改为容器内 IP 或容器名。更可靠的配置方式见下文“踩坑点”。

步骤4:启动 Backend (BE) 节点

docker run -d \
  --name doris-be \
  --network doris-network \
  -p 8040:8040 \
  -p 9060:9060 \
  -v /your/local/path/doris-be:/opt/apache-doris/be/storage \
  -e FE_HOST=doris-fe \
  apache/doris:latest \
  /opt/apache-doris/be/bin/start_be.sh

参数解释:

  • -e FE_HOST=doris-fe :告诉 BE 节点 FE 的地址。这里使用了容器名 doris-fe ,因为它们在同一个自定义网络内,可以自动解析。

4.2 方式二:使用 Docker Compose 编排(推荐) 创建 docker-compose.yml 文件,内容如下:

version: '3.8'
services:
  doris-fe:
    image: apache/doris:latest
    container_name: doris-fe
    hostname: doris-fe # 明确设置主机名,用于网络通信
    ports:
      - "8030:8030"
      - "9030:9030"
    volumes:
      - ./data/fe/doris-meta:/opt/apache-doris/fe/doris-meta
      - ./conf/fe.conf:/opt/apache-doris/fe/conf/fe.conf # 挂载自定义配置文件
    environment:
      - FE_ID=1
    command: /opt/apache-doris/fe/bin/start_fe.sh
    networks:
      - doris-net

  doris-be:
    image: apache/doris:latest
    container_name: doris-be
    hostname: doris-be
    ports:
      - "8040:8040"
      - "9060:9060"
    volumes:
      - ./data/be/storage:/opt/apache-doris/be/storage
      - ./conf/be.conf:/opt/apache-doris/be/conf/be.conf
    depends_on:
      - doris-fe
    environment:
      - FE_SERVERS=doris-fe:9010
    command: /opt/apache-doris/be/bin/start_be.sh
    networks:
      - doris-net

networks:
  doris-net:
    driver: bridge

启动集群:

# 在包含 docker-compose.yml 的目录下执行
docker compose up -d

使用 Docker Compose 的优势在于配置集中、启动简单,且通过 depends_on 和自定义网络确保了启动顺序和网络连通性。

5. 功能测试与效果验证

部署完成后,我们需要验证 Doris 集群是否正常运行,以及 FE 和 BE 节点是否成功注册。

5.1 验证服务进程 首先,检查容器是否正常运行。

docker ps | grep doris

应该能看到 doris-fe doris-be 两个容器的状态为 Up

5.2 验证 FE 节点可访问 通过 MySQL 客户端连接 FE 的查询端口(9030)。你需要一个 MySQL 客户端,如 mysql 命令或图形化工具。

# 使用 mysql 命令行客户端连接
mysql -h 127.0.0.1 -P 9030 -uroot

如果连接成功,会进入 MySQL 提示符。初始密码为空,直接回车即可。

-- 连接成功后,执行以下 SQL 查看 FE 节点状态
SHOW PROC '/frontends'\G

预期结果: 你应该看到一行记录,其中 Alive 列为 true Name 列显示 FE 的主机名或 IP。这表明 FE 节点自身是存活的。

5.3 验证 BE 节点注册状态 在 MySQL 客户端中,继续执行 SQL 检查 BE 节点。

-- 查看 BE 节点状态
SHOW PROC '/backends'\G

预期结果: 看到一行 BE 节点的记录。这是 最关键的一步 。你需要关注以下几个列:

  • Alive : 必须为 true 。如果为 false ,说明 BE 进程与 FE 的心跳通信失败。
  • SystemDecommissioned ClusterDecommissioned : 应为 false
  • ErrMsg : 如果 Alive false ,此列会显示错误信息,是排查的关键。

如果 SHOW PROC '/backends' 结果为空,或者 Alive false ,则意味着 BE 节点没有成功注册到 FE ,这是最常见的“坑”。

6. 核心踩坑点:FE/BE 节点配置与注册

绝大多数部署失败都卡在 BE 无法注册到 FE。下面系统性地分析原因和解决方案。

6.1 网络连通性问题(最常见) 问题现象 :BE 的 Alive 状态为 false ErrMsg 可能包含 “failed to send heartbeat” 或连接超时等网络错误。 根本原因 :BE 容器无法通过 FE 配置的地址(如 FE_HOST fe.conf 中的 priority_networks )访问到 FE 的 9010 端口(心跳端口)。 排查与解决:

  1. 进入 BE 容器测试连通性
    docker exec -it doris-be bash
    ping doris-fe # 或 FE 容器的 IP
    curl -v doris-fe:9010
    
    如果 ping 不通或 curl 失败,说明 Docker 网络配置有问题。
  2. 解决方案
    • 确保使用自定义网络 :如前述,在 docker run docker-compose.yml 中明确指定同一个用户自定义网络。
    • 使用容器名作为主机名 :在 BE 的启动命令或配置中,FE 的地址应使用 FE 的容器名(如 doris-fe ),因为 Docker 内置 DNS 可以解析。避免使用 localhost 127.0.0.1
    • 检查防火墙/SELinux :在 Linux 宿主机上,确保 Docker 网络流量未被防火墙阻止。

6.2 FE 配置 priority_networks 错误 问题现象 :FE 启动日志可能警告 “failed to get master client”,或者 BE 注册时 FE 报错地址不匹配。 根本原因 :FE 需要绑定一个明确的、可被其他容器访问的 IP 地址。如果未正确配置 priority_networks ,FE 可能绑定到了容器内的回环地址或一个错误的网络接口。 解决方案

  1. 通过挂载卷的方式,自定义 FE 的配置文件 fe.conf
  2. fe.conf 中添加或修改以下配置:
    # 假设 Docker 分配给 doris-fe 容器的 IP 是 172.20.0.2
    priority_networks = 172.20.0.0/16
    # 或者更精确地指定 IP
    # priority_networks = 172.20.0.2/24
    
  3. 如何获取 FE 容器的 IP?
    docker inspect doris-fe | grep IPAddress
    
  4. 修改配置后,重启 FE 容器。
    docker restart doris-fe
    

6.3 BE 配置 priority_networks be_host 问题现象 :BE 日志显示启动成功,但 FE 的 SHOW PROC '/backends' 中看不到 BE,或者 BE 的 IP 地址是一个奇怪的内部网段。 根本原因 :与 FE 类似,BE 也需要正确配置网络地址,以便 FE 能回连 BE 进行数据传输和管理。 解决方案

  1. 自定义 BE 的配置文件 be.conf
  2. be.conf 中确保配置正确:
    # 指定 BE 的 IP 地址(Docker 分配给 doris-be 容器的 IP)
    priority_networks = 172.20.0.0/16
    # 或者
    # priority_networks = 172.20.0.3/24
    
    # 在某些版本或配置中,也可能需要设置 be_host(通常不必须,priority_networks 优先级更高)
    # be_host = 172.20.0.3
    
  3. 同样,重启 BE 容器使配置生效。

6.4 使用环境变量覆盖配置的陷阱 许多 Docker 镜像支持通过环境变量(如 FE_SERVERS , FE_HOST )来简化配置。但在网络复杂的 Docker 环境中,这些变量传递的 IP 地址可能不正确。 建议 :对于生产测试或学习, 优先使用挂载自定义配置文件 的方式,而不是完全依赖环境变量。这能让你更清晰地控制每个节点的配置。

7. 接口 API 与集群管理

Doris 除了 MySQL 协议接口,还提供了 HTTP API 用于监控和管理。

7.1 FE Web UI 访问 http://<宿主机IP>:8030 ,可以打开 FE 的 Web 管理界面。这里可以查看系统状态、查询管理、会话信息等,是可视化的监控入口。

7.2 通过 SQL 管理集群 大部分管理操作通过 MySQL 客户端执行 SQL 完成。

-- 1. 创建数据库
CREATE DATABASE test_db;

-- 2. 创建表
USE test_db;
CREATE TABLE test_table (
    id INT,
    name VARCHAR(50)
) DISTRIBUTED BY HASH(id) BUCKETS 10
PROPERTIES("replication_num" = "1");

-- 3. 插入数据
INSERT INTO test_table VALUES (1, 'Alice'), (2, 'Bob');

-- 4. 查询数据
SELECT * FROM test_table;

-- 5. 再次检查节点状态(日常运维)
SHOW PROC '/frontends';
SHOW PROC '/backends';

7.3 备份与恢复(简易) 在 Docker 中,由于数据目录已挂载到宿主机,你可以直接备份宿主机上的挂载点目录。更正式的备份需要使用 Doris 的 BACKUP RESTORE 命令,这需要配置 S3 或 HDFS 等存储,在 Docker 测试环境中较为复杂。

8. 资源占用与性能观察

在 Docker 中运行 Doris,需要关注容器的资源使用情况。

  • 查看容器资源占用

    docker stats doris-fe doris-be
    

    这个命令会实时显示 CPU、内存、网络 I/O 和块 I/O 的使用情况。重点关注内存(MEM USAGE / LIMIT),确保没有达到限制导致 OOM。

  • 调整资源限制 :如果发现资源不足,可以在 docker run 时或 docker-compose.yml 中调整。

    # 在 docker-compose.yml 的 service 下
    doris-fe:
      ...
      deploy:
        resources:
          limits:
            memory: 4G
            cpus: '2.0'
    
  • 性能观察要点

    1. 查询延迟 :在 MySQL 客户端执行查询,观察响应时间。
    2. 导入速度 :尝试使用 INSERT INTO ... SELECT 或 Stream Load 导入少量数据,观察速度。
    3. 监控日志 :使用 docker logs -f doris-be 可以跟踪 BE 的日志,查看数据压缩、合并等后台任务的运行情况。

9. 常见问题与排查方法

下表汇总了 Docker 部署 Doris 的其他常见问题。

问题现象 可能原因 排查方式 解决方案
容器启动后立即退出 启动脚本执行失败、配置错误、端口冲突。 docker logs <容器名> 查看启动日志。 根据日志错误修正配置,检查端口占用 ( netstat -tlnp | grep <端口号> )。
MySQL 客户端连接被拒绝 FE 未成功启动、端口映射错误、网络防火墙。 1. docker ps 确认容器运行。
2. docker exec -it doris-fe netstat -tlnp 确认 FE 进程监听 9030。
3. 宿主机 telnet 127.0.0.1 9030 测试连通性。
确保 FE 启动成功,检查 docker run -p 或 compose 文件的端口映射配置。
SHOW PROC '/backends' 显示 BE 但 Alive false 网络不通、BE 的 heartbeat_port (9050) 无法访问、BE 进程假死。 1. 在 FE 容器内 ping curl BE 的 IP:9050。
2. 查看 BE 日志 docker logs doris-be
确保 BE 的 priority_networks 配置正确,网络互通。重启 BE 容器。
数据导入失败 表不存在、权限问题、BE 磁盘空间不足、配置错误。 查看导入命令返回的错误信息。检查 BE 日志。 确认表结构正确,检查挂载的数据卷是否有足够空间和写入权限。
Web UI (8030) 无法访问 端口未映射、FE Web 服务未启动、浏览器缓存。 确认端口映射, docker logs doris-fe 查看有无 Web 服务启动错误。 确保 -p 8030:8030 映射正确,清除浏览器缓存或使用无痕模式。
容器内时间不对 容器时区与宿主机不一致。 docker exec doris-fe date 在 Dockerfile 或启动命令中设置时区环境变量 -e TZ=Asia/Shanghai

10. 最佳实践与使用建议

  1. 配置文件外挂 :始终坚持通过 -v 卷挂载的方式将 fe.conf be.conf 放在宿主机管理。这便于修改、版本控制和复用。
  2. 使用 Docker Compose :对于多节点部署,Docker Compose 在定义网络、依赖关系和统一配置方面远胜于手动 docker run 命令。
  3. 明确网络规划 :在启动前就规划好 Docker 网络模式。对于需要与宿主机其他服务通信的场景, host 模式最简单;对于多容器隔离场景,自定义 bridge 网络更清晰。
  4. 数据持久化 :务必为 doris-meta (FE) 和 storage (BE) 目录配置持久化卷。这是数据的生命线。
  5. 先验证基础功能 :部署完成后,先完成“连接 FE -> 检查节点状态 -> 建库建表 -> 插入查询”这个最小闭环,确保核心流程畅通,再尝试复杂的数据导入和查询。
  6. 善用日志 docker logs 是你最好的朋友。启动失败、节点失联、查询错误,第一时间查看对应容器的日志。
  7. 资源监控 :在长期运行测试时,使用 docker stats cAdvisor Prometheus 等工具监控容器资源,避免无声无息的 OOM。

通过以上步骤,你应该能够成功在 Docker 中部署并运行一个功能完整的 Apache Doris 集群。关键在于理解 Docker 的网络模型,并正确配置 FE/BE 节点的通信地址。当遇到 BE 注册失败时,按照网络连通性 -> FE配置 -> BE配置的顺序进行排查,大部分问题都能迎刃而解。这个 Docker 环境非常适合作为学习和功能验证的沙箱,让你在投入生产环境前充分熟悉 Doris 的特性和操作。

更多推荐