Docker部署Apache Doris:10分钟搭建实时数仓开发测试环境

📅 2026/7/27 16:54:04
Docker部署Apache Doris:10分钟搭建实时数仓开发测试环境
如果你正在寻找一个能替代传统 Hadoop/Spark 生态又想获得亚秒级查询响应的实时数仓方案那么 Apache Doris 很可能已经进入了你的视野。但很多开发者在第一步——部署上就遇到了麻烦官方文档的二进制包部署流程复杂涉及多节点配置、端口、依赖稍有不慎就陷入“启动失败”的泥潭。这篇文章要解决的核心问题就是如何用 Docker 这个现代开发工具将 Doris 的部署门槛降到最低。我的核心判断是对于开发、测试、学习以及中小规模 PoC概念验证场景使用 Docker 部署 Doris 是目前最高效、最可控、最易复现的方式没有之一。它不仅能让你在 10 分钟内看到一个可运行的 Doris 集群更重要的是整个环境是容器化的可以随时销毁、重建完美避免了“在我的机器上可以运行”的窘境。本文将带你从零开始完成一个基于 Docker 的单机多 FEFrontend、单 BEBackend的 Doris 集群部署。你不仅会得到一个可用的数据库更会理解 Doris 的核心架构、Docker 部署的关键配置以及如何连接、测试和排查常见问题。无论你是想快速体验 Doris 的特性还是为团队搭建一个标准的开发测试环境这篇教程都能提供一条清晰的路径。1. 为什么选择 Docker 部署 Doris不仅仅是“方便”在深入操作之前我们需要先达成一个共识为什么 Docker 是部署 Doris 的优选方案这不仅仅是图省事。传统部署的痛点环境依赖复杂需要手动安装 Java特定版本、检查系统时钟同步、配置最大文件打开数等每一步都可能踩坑。配置繁琐易错fe.conf,be.conf中的网络地址、端口、目录路径需要根据每台机器精心调整一旦 IP 变化或目录权限不对服务就无法启动。清理困难部署失败后残留的元数据、数据目录难以彻底清理影响下一次部署。环境不一致开发、测试、生产环境差异导致问题难以复现和排查。Docker 部署带来的改变环境标准化镜像内包含了所有运行时依赖Java、库文件确保在任何支持 Docker 的宿主机上行为一致。配置即代码通过docker-compose.yml或启动命令将所有配置端口、路径、参数明文定义易于版本管理和分享。一键启停与清理docker-compose up -d启动docker-compose down -v即可彻底停止并删除数据卷环境瞬间重置。资源隔离与限制可以方便地为容器分配特定的 CPU、内存资源避免 Doris 进程影响宿主机或其他服务。快速搭建多节点集群通过定义多个服务并配置网络可以快速模拟出多 FE、多 BE 的集群拓扑非常适合学习架构原理。因此Docker 部署的核心价值在于“提升可重复性”和“降低管理成本”特别适合前期技术调研和持续集成/持续部署CI/CD流水线。2. 理解 Doris 的核心架构FE 与 BE 的分工在配置 Docker 之前必须理解 Doris 的基本架构否则配置文件里的参数会像天书一样。Apache Doris 是一个MPP大规模并行处理架构的数据库主要包含两类进程FrontendFE 这是 Doris 的“大脑”和“调度中心”。职责负责元数据管理、集群管理、用户认证、查询的解析与规划。关键角色Leader FE只有一个负责元数据的写入和最终决策。Follower FE多个同步 Leader 的元数据参与选举并提供读服务。Observer FE多个只同步元数据不参与选举主要用于扩展集群的读能力。对外端口通常通过8030(HTTP)、9030(MySQL 协议) 端口对外提供服务。我们用的 MySQL 客户端如mysql, DBeaver就是连接9030端口。BackendBE 这是 Doris 的“肌肉”和“存储仓库”。职责负责数据存储、查询执行、数据压缩与副本管理。工作方式数据表被水平分区Tablet后分布式存储在各个 BE 节点上。查询时FE 将计划下发给多个 BE 并行执行最后汇总结果。对外端口8040(HTTP用于状态检查)、9060(BE 心跳端口) 等。它们如何协作用户通过 MySQL 客户端连接到任意一个 FE9030端口。FE 接收到 SQL 请求进行解析、优化生成分布式执行计划。FE 将执行计划分发给相关的 BE 节点。各个 BE 并行处理自己负责的数据分片Tablet。BE 将中间结果返回给 FE或某个协调 BEFE 进行最终聚合后返回给客户端。在我们的 Docker 部署中将模拟一个最小集群1个 Leader FE, 1个 Follower FE, 1个 BE。这足以运行绝大多数功能测试和 SQL 学习。3. 环境准备确保你的 Docker 环境就绪在开始之前请确保你的操作环境满足以下要求。本文以Linux/macOS环境为例Windows 用户使用 Docker Desktop 也可参考但路径和命令可能需要微调。3.1 基础环境检查操作系统Linux (CentOS 7, Ubuntu 16.04), macOS, 或 Windows 10/11 (WSL2 推荐)。Docker 引擎版本 20.10.0 或更高。运行以下命令检查docker --versionDocker Compose版本 1.27.0 或更高。这是编排多容器的关键工具。docker-compose --version # 或 (新版本Docker) docker compose version如果未安装请参考 官方文档 进行安装。系统资源建议为 Docker 分配至少4GB 内存。Doris BE 进程比较吃内存。可以通过 Docker Desktop 设置或dockerd配置进行调整。3.2 目录规划为了持久化数据避免容器删除后数据丢失我们需要在宿主机上创建目录并映射到容器内。建议规划如下目录结构mkdir -p ~/doris-docker/{fe1,fe2,be1}/data mkdir -p ~/doris-docker/{fe1,fe2}/log mkdir -p ~/doris-docker/be1/log tree ~/doris-docker -L 2预期输出类似/home/yourname/doris-docker ├── be1 │ ├── data │ └── log ├── fe1 │ ├── data │ └── log └── fe2 ├── data └── logdata目录用于存放 Doris 的元数据FE或实际数据文件BE至关重要必须持久化。log目录用于存放运行日志方便排查问题。4. 核心部署流程编写 Docker Compose 配置文件我们将使用docker-compose.yml来定义和启动整个集群。这是最清晰、最易于管理的方式。在~/doris-docker目录下创建docker-compose.yml文件version: 3.8 services: # ------------------- Doris FE 01 (预期为 Leader) ------------------- doris-fe-01: image: apache/doris:2.0.4-fe-x86_64 # 使用官方镜像指定版本和架构 container_name: doris-fe-01 hostname: doris-fe-01 # 容器主机名用于集群内部通信 environment: - FE_SERVERSfe1:192.168.1.1:9010,fe2:192.168.1.2:9010 # 所有 FE 的标识、IP和端口 - FE_ID1 # 每个 FE 的唯一 ID必须与 FE_SERVERS 中的顺序对应 - PRIORITY_NETWORKS192.168.1.0/24 # 优先使用的网络网段用于确定自身 IP volumes: - ./fe1/data:/opt/apache-doris/fe/doris-meta # 元数据持久化 - ./fe1/log:/opt/apache-doris/fe/log # 日志持久化 ports: - 8030:8030 # FE HTTP 端口用于 Web UI 和系统管理 - 9030:9030 # FE MySQL 协议端口用于客户端连接 - 9010:9010 # FE 内部通信端口 networks: doris-net: ipv4_address: 192.168.1.1 # 为容器指定固定 IP便于集群稳定通信 # ------------------- Doris FE 02 (预期为 Follower) ------------------- doris-fe-02: image: apache/doris:2.0.4-fe-x86_64 container_name: doris-fe-02 hostname: doris-fe-02 environment: - FE_SERVERSfe1:192.168.1.1:9010,fe2:192.168.1.2:9010 - FE_ID2 - PRIORITY_NETWORKS192.168.1.0/24 volumes: - ./fe2/data:/opt/apache-doris/fe/doris-meta - ./fe2/log:/opt/apache-doris/fe/log ports: - 8031:8030 # 注意宿主机端口映射不能冲突这里用8031映射容器的8030 - 9031:9030 # 用9031映射容器的9030 # 9010 端口不需要对外暴露仅在容器网络内通信 networks: doris-net: ipv4_address: 192.168.1.2 depends_on: - doris-fe-01 # 等待 fe-01 先启动 # ------------------- Doris BE 01 ------------------- doris-be-01: image: apache/doris:2.0.4-be-x86_64 # BE 镜像 container_name: doris-be-01 hostname: doris-be-01 environment: - FE_SERVERSfe1:192.168.1.1:9010,fe2:192.168.1.2:9010 - BE_ADDR192.168.1.3:9050 # BE 自身的地址和端口 volumes: - ./be1/data:/opt/apache-doris/be/storage # 数据存储持久化 - ./be1/log:/opt/apache-doris/be/log # BE 通常不需要对外暴露太多端口主要供 FE 和内部访问 # 8040 是 BE 的 HTTP 状态端口可用于健康检查 ports: - 8040:8040 networks: doris-net: ipv4_address: 192.168.1.3 depends_on: - doris-fe-01 - doris-fe-02 # ------------------- 自定义网络 ------------------- networks: doris-net: driver: bridge ipam: config: - subnet: 192.168.1.0/24 # 定义一个独立的子网给 Doris 集群使用关键配置解读镜像选择apache/doris:2.0.4-fe-x86_64和apache/doris:2.0.4-be-x86_64是 Apache Doris 官方在 Docker Hub 维护的镜像。务必保持 FE 和 BE 版本一致。固定 IP 网络我们创建了一个自定义的doris-net网络 (192.168.1.0/24)并为每个容器分配了固定 IP。这是集群成功组建的关键。Doris 的 FE 和 BE 通过 IP 地址进行心跳通信和元数据同步使用动态 IP 或宿主机网络容易导致通信失败。环境变量FE_SERVERS告诉每个节点集群中所有 FE 的列表。格式为fe_name:fe_ip:fe_edit_log_port。FE_ID每个 FE 的唯一标识从 1 开始递增必须与FE_SERVERS中的位置对应。PRIORITY_NETWORKS让 FE 进程在有多网卡时优先使用指定网段的 IP 作为自己的fe_ip。BE_ADDRBE 节点自身的地址用于向 FE 注册。端口映射9030这是最重要的端口MySQL 客户端连接端口。我们将fe-01的9030映射到宿主机的9030fe-02的映射到9031这样可以通过不同端口连接到不同的 FE。8030FE 的 HTTP 端口用于访问 Web UI后续管理用。9010FE 内部编辑日志同步端口只需在容器网络内互通。8040BE 的 HTTP 端口用于查看 BE 状态。数据持久化通过volumes将宿主机目录映射到容器内的关键路径确保容器重启或删除后元数据和用户数据不丢失。启动顺序使用depends_on控制启动顺序确保 FE 先于 BE 启动因为 BE 启动时需要向 FE 注册。5. 启动集群并验证状态配置文件就绪后启动集群就变得非常简单。5.1 启动所有服务在docker-compose.yml所在目录执行cd ~/doris-docker docker-compose up -d-d参数表示在后台运行。你会看到 Docker 拉取镜像如果本地没有并依次启动三个容器。使用以下命令查看容器状态docker-compose ps如果一切正常你应该看到三个容器的状态都是Up。5.2 检查 FE 启动日志FE 启动需要一些时间约30-60秒进行元数据初始化。查看 Leader FE 的日志docker logs -f doris-fe-01在日志中搜索关键词“transfer from UNKNOWN to MASTER”或“finished to wait catalog”这通常表示 FE 已成功启动并成为 MasterLeader。5.3 通过 MySQL 客户端连接并初始化集群首先连接到预期为 Leader 的 FEdoris-fe-01# 使用宿主机映射的端口 9030 连接 mysql -h 127.0.0.1 -P 9030 -uroot初始状态下root 用户无密码。如果连接成功你会看到 MySQL 命令行提示符mysql。关键步骤添加 Follower FE 和 BE 到集群仅仅容器启动了还不够需要在 Doris 系统中将它们添加为集群节点。添加 Follower FE (doris-fe-02) 在 MySQL 客户端中执行-- 语法ALTER SYSTEM ADD FOLLOWER fe_host:edit_log_port; ALTER SYSTEM ADD FOLLOWER doris-fe-02:9010;执行成功后可以通过SHOW PROC /frontends;命令查看所有 FE 的状态。稍等片刻你应该能看到两个 FE其中一个是Leader另一个是Follower且Alive列为true。添加 BE (doris-be-01) 在 MySQL 客户端中执行-- 语法ALTER SYSTEM ADD BACKEND be_host:heartbeat_service_port; ALTER SYSTEM ADD BACKEND doris-be-01:9050;执行成功后通过SHOW PROC /backends;命令查看 BE 状态。等待几分钟直到Alive列变为true并且SystemDecommissioned和ClusterDecommissioned列为false。LastHeartbeat列应有最近的时间。5.4 通过 Web UI 验证在浏览器中访问http://你的宿主机IP:8030使用 root 账号默认无密码登录。这是 Doris 内置的管理界面可以更直观地查看集群状态、查询、会话等信息。6. 完整功能测试从建表到查询现在让我们运行一个完整的 SQL 流程验证集群功能是否正常。-- 1. 创建一个测试数据库 CREATE DATABASE IF NOT EXISTS test_db; USE test_db; -- 2. 创建一张明细模型Duplicate表 -- 这是 Doris 最常用的数据模型之一适合日志、行为流水等场景 CREATE TABLE IF NOT EXISTS user_behavior ( user_id INT, item_id INT, category_id INT, behavior_type VARCHAR(10), ts DATETIME ) DUPLICATE KEY(user_id, item_id) -- 指定排序列也是前缀索引列 DISTRIBUTED BY HASH(user_id) BUCKETS 10 -- 分桶方式数据分布到BE的依据 PROPERTIES ( replication_num 1 -- 副本数单机测试设为1 ); -- 3. 插入测试数据 INSERT INTO user_behavior VALUES (1001, 2001, 1, pv, 2024-01-01 10:00:00), (1001, 2002, 2, buy, 2024-01-01 10:05:00), (1002, 2001, 1, pv, 2024-01-01 10:10:00), (1002, 2001, 1, cart, 2024-01-01 10:15:00), (1003, 2003, 3, pv, 2024-01-01 10:20:00); -- 4. 执行查询 -- 4.1 简单查询 SELECT * FROM user_behavior ORDER BY ts; -- 4.2 聚合查询展示 MPP 能力 SELECT user_id, COUNT(*) as action_count, MAX(ts) as last_action FROM user_behavior GROUP BY user_id ORDER BY action_count DESC; -- 4.3 带条件的查询 SELECT behavior_type, COUNT(*) as cnt FROM user_behavior WHERE ts 2024-01-01 10:00:00 AND ts 2024-01-01 11:00:00 GROUP BY behavior_type; -- 5. 查看表结构 DESC user_behavior; -- 6. 查看数据分布验证 BE 工作 SHOW TABLET FROM user_behavior;如果以上所有 SQL 都能成功执行并返回预期结果那么恭喜你一个功能完整的 Doris Docker 集群已经部署并测试成功7. 常见问题与排查思路部署过程中难免会遇到问题。这里列出几个最常见的问题及其排查方法。问题现象可能原因排查方式解决方案mysql客户端连接被拒绝1. FE 容器未启动或启动失败。2. 端口映射错误。3. FE 进程尚未完成初始化。1.docker-compose ps检查容器状态。2.docker logs doris-fe-01查看 FE 日志确认有无错误。3.netstat -tlnp | grep 9030检查宿主机端口监听。1. 等待 FE 启动完成查看日志。2. 检查docker-compose.yml的ports配置。3. 确保使用-h 127.0.0.1而非localhost某些系统解析问题。ALTER SYSTEM ADD FOLLOWER/BACKEND执行成功但SHOW PROC显示Alive为false1. 网络不通FE/BE 之间无法心跳通信。2.FE_SERVERS或BE_ADDR中的 IP/主机名配置错误。3. BE 启动参数问题。1. 在容器内互相 ping 或 telnet 端口如docker exec doris-fe-01 telnet doris-be-01 9050。2. 检查docker-compose.yml中environment和networks的 IP 配置是否一致。3. 查看 BE 日志docker logs doris-be-01看是否有注册失败的错误。1.确保使用自定义固定 IP 网络这是最可靠的方案。2. 核对所有配置文件中的主机名和 IP。3. 重启 BE 容器docker-compose restart doris-be-01。插入数据或查询非常慢甚至超时1. BE 状态不正常。2. 表的分桶数 (BUCKETS) 设置不合理如单机设为100。3. 容器资源CPU/内存不足。1.SHOW PROC /backends;确认 BEAlive为true磁盘容量正常。2. 检查查询计划EXPLAIN your_sql;。3. 使用docker stats查看容器资源使用率。1. 修复 BE 状态。2. 单机测试时BUCKETS设置为 5-10 即可。3. 为 Docker 分配更多内存或调整 BE 内存参数高级。Web UI (8030端口) 无法访问1. 防火墙或安全组限制。2. FE 的http_port配置未被正确映射。1. 检查宿主机防火墙规则。2. 确认docker-compose.yml中 FE 服务有8030:8030映射。1. 临时关闭防火墙测试或添加规则。2. 确保映射正确并尝试用curl 127.0.0.1:8030在宿主机本地测试。容器启动后立即退出1. 持久化目录权限问题导致进程无法写入。2. 环境变量配置错误导致启动脚本失败。1.docker logs container_name查看退出前的日志。2. 检查宿主机data和log目录的权限是否可写。1. 使用chmod 755 ~/doris-docker确保目录有足够权限。2. 仔细检查docker-compose.yml中的environment变量格式和值。最重要的排查工具是日志。FE 的日志在./fe/log/下BE 的日志在./be/log/下。关注INFO、WARN、ERROR级别的日志。8. 最佳实践与生产环境考量本文的 Docker 部署方案主要面向开发、测试和学习。如果你计划用于生产环境需要考虑更多因素数据持久化与备份本文使用的本地目录映射 (volumes) 是简单的持久化方式。在生产环境中应考虑使用更可靠的存储方案如云盘、网络存储NFS或 Docker 卷驱动并确保有定期备份策略。备份不仅包括storage数据目录更重要的是doris-meta元数据目录。可以定期使用 Doris 的BACKUP命令进行逻辑备份。高可用与扩展FE 高可用至少部署 1 Leader 2 Follower共3个避免单点故障。Observer 可用于扩展读负载。BE 扩展根据数据量和查询压力水平添加 BE 节点。在docker-compose.yml中复制doris-be服务定义修改hostname、ipv4_address和BE_ADDR然后执行ALTER SYSTEM ADD BACKEND ...即可。负载均衡在应用层配置多个 FE 的连接地址实现负载均衡和故障转移。资源配置与监控资源限制在docker-compose.yml中为每个服务设置deploy.resources.limitsCPU/内存防止单个容器耗尽主机资源。监控暴露 Doris 的 MetricsFE:8030/metrics BE:8040/metrics给 Prometheus使用 Grafana 进行可视化监控。监控关键指标如查询 QPS、延迟、节点存活状态、磁盘使用率等。安全加固修改默认密码首次登录后立即为 root 用户设置强密码SET PASSWORD FOR root PASSWORD(your_strong_password);创建最小权限用户为业务应用创建专属用户和数据库并授予最小必要权限。网络隔离生产环境的 Docker 集群应部署在独立的内部网络中严格限制外部访问端口通常只暴露9030给应用。版本管理与升级将docker-compose.yml和所有自定义配置文件纳入 Git 等版本控制系统。Doris 版本升级时务必先在测试环境验证。官方镜像提供了不同版本的 Tag升级时修改image标签并谨慎操作注意阅读官方升级文档。通过 Docker 部署 Doris你获得了一个高度一致、可版本化、易于分发的环境定义。这不仅是快速上手的捷径更是迈向现代化数据基础设施运维的重要一步。从这个小集群开始你可以安全地探索 Doris 的所有功能为更复杂的生产部署打下坚实基础。