
如果你正在寻找一个既能处理海量数据实时分析又能兼顾高并发点查询的国产开源数据仓库那么 Apache Doris 很可能就是你的答案。它凭借其极致的性能、MySQL协议的易用性和统一的实时离线架构在众多大数据组件中脱颖而出。然而当兴奋地准备上手时很多开发者会卡在第一步部署。官方文档虽然详尽但面对多种部署模式单机、集群、K8s和复杂的依赖配置新手很容易迷失方向一个参数配置错误就可能导致整个集群启动失败。这篇文章要解决的正是这个从“想用”到“能用”的关键一步。我们将完全聚焦于使用 Docker 这一最简洁、最可控的方式在单机环境下部署一个功能完整的 Doris 集群FE BE。这不是一个简单的命令罗列而是一个经过实战检验的、带深度避坑指南的完整流程。你将清晰地理解 Doris 的核心架构在 Docker 中如何映射掌握每一个关键配置项的作用并最终获得一个可以立即用于学习、开发和测试的稳定环境。无论你是想快速体验 Doris 的特性还是为团队搭建一个标准的开发测试环境这篇教程都能让你绕过我踩过的那些坑直达终点。1. 为什么选择 Docker 部署 Doris明确你的场景在开始动手之前我们必须先达成共识Docker 部署最适合的是开发、测试和学习环境而不是生产环境。这是一个至关重要的前提判断。生产环境的 Doris 集群需要考虑硬件隔离、网络优化、磁盘 RAID、监控告警等复杂因素通常推荐使用物理机或虚拟机进行裸机部署。那么Docker 部署的价值在哪里环境隔离与纯净Docker 容器提供了与宿主机完全隔离的运行环境避免了因宿主机上已有的 Java 版本、端口冲突、库文件等问题导致的部署失败。一次构建处处运行。极速搭建与销毁你可以在几分钟内从零启动一个包含 FEFrontend和 BEBackend的完整集群测试完成后一键清理不留下任何“垃圾文件”这对于需要频繁验证功能或进行 POC概念验证的场景至关重要。学习与开发的最佳伴侣对于开发者而言一个本地的、轻量的 Doris 集群是学习 SQL 语法、测试数据导入、调试应用连接的最佳沙盒。Docker 部署简化了所有环境准备步骤让你能专注于 Doris 本身的功能。配置可视化与版本管理所有配置都通过docker-compose.yml文件管理清晰明了。你可以轻松地为不同项目维护不同版本的 Doris 集群配置。因此如果你的目标是快速获得一个用于学习和功能验证的 Doris 环境那么 Docker 方案是目前最优雅、最推荐的选择。接下来我们将深入核心理解你要部署的究竟是什么。2. 核心概念快速理解 Doris 的架构与 Docker 化映射Apache Doris 采用经典的对等分布式架构主要包含两个核心组件FrontendFE和 BackendBE。在 Docker 部署中每个组件都会运行在一个独立的容器里。2.1 Frontend (FE) - 大脑与入口FE 是 Doris 的“大脑”负责元数据管理、集群管理、查询的解析和规划。它又分为两种角色Leader FE只有一个负责元数据的写入和集群调度。Follower FE多个负责元数据的同步和读请求的负载均衡。在 Docker 部署中我们通常会先启动一个 FE 作为 Leader后续可以通过类似方式添加 Follower 以实现高可用。FE 容器需要暴露 MySQL 协议端口默认 9030供客户端连接以及 HTTP 端口默认 8030用于 Web 界面访问。2.2 Backend (BE) - 肌肉与存储BE 是 Doris 的“肌肉”负责数据存储、查询执行和分布式计算。数据表被水平分区后存储在不同的 BE 节点上。在 Docker 部署中每个 BE 容器代表一个数据存储与计算节点。BE 需要与 FE 以及其他 BE 节点进行通信因此容器间的网络连通性至关重要。BE 容器需要挂载宿主机目录来持久化数据否则容器重启后数据会丢失。2.3 Docker 网络 - 集群通信的血管Doris 集群内部组件之间FE-FE, FE-BE, BE-BE需要频繁通信。使用 Docker 的bridge网络或自定义网络是确保容器间能用主机名如doris-fedoris-be1相互访问的关键。我们将使用docker-compose来统一管理网络和容器生命周期。理解了这些我们就可以开始准备战场了。3. 环境准备你的机器需要满足什么在运行任何 Docker 命令之前请确保你的基础环境已经就绪。以下是最低要求和建议操作系统Linux (Ubuntu 20.04, CentOS 7), macOS, 或 Windows 10/11 (需使用 WSL2)。本文以Linux/macOS命令行环境为例。Docker Engine版本 20.10.0 或更高。安装方法请参考 Docker 官方文档 。# 验证 Docker 安装及版本 docker --version # 验证 Docker 服务运行状态 docker infoDocker Compose版本 v2.0.0 或更高。Docker Desktop 通常已包含。Linux 可能需要单独安装。# 验证 Docker Compose 安装 docker compose version # 或旧版本 docker-compose --version系统资源CPU至少 2 核。建议 4 核以上以获得更好体验。内存至少4GB。这是硬性要求因为单个 BE 节点默认的 JVM 堆内存就可能占用 1-2GB。建议 8GB 或更多。磁盘空间至少 10GB 可用空间用于存放 Docker 镜像、容器层和数据持久化目录。防火墙与端口确保宿主机的以下端口未被占用或防火墙已放行8030FE 的 HTTP Web 界面端口。9030FE 的 MySQL 协议端口应用连接用。9010BE 的 HTTP 端口。9060BE 的 BRPC 端口内部通信。使用以下命令检查端口占用# Linux/macOS sudo lsof -i:9030 # 或 netstat -tlnp | grep 9030如果端口被占用你需要停止相关服务或在后文的配置中修改 Doris 的端口映射。4. 部署实战一步步构建你的 Doris 集群我们将使用docker-compose来定义和运行一个包含 1个 FE 和 1个 BE 的集群。这是最小可用的集群形态。4.1 第一步创建项目目录与配置文件首先创建一个清晰的工作目录所有文件都将放在这里。mkdir doris-docker cd doris-docker4.2 第二步编写 Docker Compose 配置文件创建docker-compose.yml文件这是整个部署的核心。# docker-compose.yml version: 3.8 services: doris-fe: image: apache/doris:2.0.4-fe-x86_64 # 使用官方镜像指定版本和架构 container_name: doris-fe hostname: doris-fe # 容器主机名用于集群内部通信 environment: - FE_SERVERSfe1:doris-fe:9010 # FE自身地址用于元数据同步 - FE_ID1 # FE节点ID必须唯一 ports: - 8030:8030 # Web UI - 9030:9030 # MySQL Client volumes: - ./fe/doris-meta:/opt/apache-doris/fe/doris-meta # 元数据持久化 - ./fe/conf:/opt/apache-doris/fe/conf # 自定义配置文件挂载点可选 - ./fe/log:/opt/apache-doris/fe/log # 日志持久化 networks: - doris-network healthcheck: # 健康检查确保FE完全启动后再启动BE test: [CMD, curl, -f, http://localhost:8030/api/bootstrap] interval: 10s timeout: 5s retries: 30 command: - /bin/bash - -c - | # 初始化脚本检查元数据目录如果为空则初始化FE if [ ! -f /opt/apache-doris/fe/doris-meta/image/ROLE ]; then /opt/apache-doris/fe/bin/start_fe.sh --daemon sleep 30 # 等待FE启动完成 # 理论上这里可以执行mysql客户端命令添加BE但更推荐在FE启动后通过Web UI或mysql client操作 else /opt/apache-doris/fe/bin/start_fe.sh --daemon fi tail -f /opt/apache-doris/fe/log/fe.out # 保持容器运行并输出日志 doris-be: image: apache/doris:2.0.4-be-x86_64 container_name: doris-be hostname: doris-be depends_on: doris-fe: condition: service_healthy # 等待FE健康后再启动BE environment: - FE_SERVERSfe1:doris-fe:9010 # 告诉BE去哪里找FE - BE_ADDRdoris-be:9050 # BE自身地址 volumes: - ./be/storage:/opt/apache-doris/be/storage # 数据存储持久化 - ./be/log:/opt/apache-doris/be/log # 日志持久化 - ./be/conf:/opt/apache-doris/be/conf # 自定义配置挂载点可选 networks: - doris-network command: - /bin/bash - -c - | # 等待FE服务完全就绪更可靠的方式 until curl -s http://doris-fe:8030/api/bootstrap; do echo Waiting for FE to be ready... sleep 5 done /opt/apache-doris/be/bin/start_be.sh --daemon tail -f /opt/apache-doris/be/log/be.INFO # 保持容器运行并输出日志 networks: doris-network: driver: bridge关键配置解读镜像版本apache/doris:2.0.4-fe-x86_64和apache/doris:2.0.4-be-x86_64。请务必从 Apache Doris Docker Hub 查看最新稳定版。x86_64是架构标签ARM 芯片如 Apple Silicon可能需要找对应版本或自行构建。数据持久化通过volumes将容器内的关键目录映射到宿主机当前目录下的./fe/doris-meta./be/storage等。这是防止数据丢失的生命线。网络自定义的doris-network让doris-fe和doris-be容器可以通过主机名互相访问。启动顺序与健康检查depends_on结合condition: service_healthy确保 BE 在 FE 完全启动后才启动避免 BE 因找不到 FE 而启动失败。启动命令我们使用了一个组合命令它先检查 FE 是否需要初始化然后启动服务最后用tail -f输出日志保持容器不退出。这是一种经典模式。4.3 第三步启动 Doris 集群在包含docker-compose.yml的目录下执行一条命令docker compose up -d-d参数表示在后台运行。你会看到类似下面的输出表示正在拉取镜像并启动容器[] Running 3/3 ✔ Network doris-docker_doris-network Created ✔ Container doris-fe Started ✔ Container doris-be Started使用以下命令查看容器状态docker compose ps如果状态都是Up (healthy)或Up则表示容器已成功运行。初始启动时FE 可能需要 30-60 秒来完成自举和健康检查。4.4 第四步验证集群基础状态检查容器日志确认无报错# 查看FE日志 docker compose logs -f doris-fe # 查看BE日志 docker compose logs -f doris-be在 FE 日志中你应看到2024-xx-xx xx:xx:xx,xxx INFO (UNKNOWN x.x.x.x_9010_168xxxxxx|1) [FeServer.start():52] FE server start successfully in 2022 ms.这样的成功信息。 在 BE 日志中应看到2024-xx-xx xx:xx:xx,xxx INFO (heartbeat_service.cpp:52) BE heartbeat service start successfully.。访问 FE Web 界面打开浏览器访问http://你的宿主机IP:8030。默认用户名密码是root/空密码。系统状态登录后在顶部导航栏点击“集群”可以看到 FE 节点的状态。BE 状态要查看 BE需要先完成下一步“添加 BE 节点”。5. 核心操作将 BE 节点添加到集群这是最关键且最容易出错的一步。容器启动成功并不代表 BE 已经加入了 Doris 集群。我们必须手动执行添加命令。5.1 通过 MySQL 客户端连接 FEDoris 兼容 MySQL 协议所以我们用任何 MySQL 客户端都能连接。这里使用 Docker 容器内自带的mysql客户端。# 进入 FE 容器执行命令 docker compose exec doris-fe mysql -h 127.0.0.1 -P 9030 -uroot连接成功后你会看到 MySQL 提示符mysql。5.2 执行添加 BE 的 SQL 命令在 MySQL 客户端中执行以下命令-- 将 BE 节点添加到集群 -- 格式ALTER SYSTEM ADD BACKEND BE_HOST:BE_HEARTBEAT_PORT; -- BE_HOST 是我们在 docker-compose 中定义的 BE 容器主机名 doris-be -- BE_HEARTBEAT_PORT 默认是 9050 ALTER SYSTEM ADD BACKEND doris-be:9050;执行成功后会返回Query OK, 0 rows affected。5.3 验证 BE 添加状态继续在 MySQL 客户端中执行-- 查看 BE 节点状态 SHOW PROC /backends\G仔细查看输出结果。你需要关注以下几列Alive:必须为true。这表示 FE 和 BE 之间的心跳连接正常。SystemDecommissioned和ClusterDecommissioned: 必须为false。LastHeartbeat: 应该是最近的时间。ErrMsg: 应该为空。如果有错误信息说明添加失败。一个健康的 BE 状态输出示例如下*************************** 1. row *************************** BackendId: 10001 IP: 172.20.0.3 HeartbeatPort: 9050 BePort: 9060 HttpPort: 8040 BrpcPort: 8060 LastStartTime: 2024-01-01 10:00:00 LastHeartbeat: 2024-01-01 10:01:30 Alive: true SystemDecommissioned: false ClusterDecommissioned: false ...现在刷新 FE 的 Web 界面 (http://宿主机IP:8030)进入“集群”-“后端”你应该能看到一个状态为“活着”的 BE 节点。至此一个最小化的 Doris 集群已部署并配置完成6. 功能验证运行你的第一个查询让我们通过一个简单的例子验证集群工作正常。6.1 创建测试数据库和表在刚才的 MySQL 客户端中如果已退出重新执行docker compose exec ...连接执行以下 SQL-- 1. 创建测试数据库 CREATE DATABASE IF NOT EXISTS test_db; USE test_db; -- 2. 创建一张测试表使用 Doris 的 Duplicate 数据模型最简单的模型 CREATE TABLE IF NOT EXISTS test_table ( user_id INT, date DATE, city VARCHAR(20), age SMALLINT, cost DECIMAL(10, 2) ) DUPLICATE KEY(user_id, date) -- 指定排序列 DISTRIBUTED BY HASH(user_id) BUCKETS 10 -- 分桶方式 PROPERTIES ( replication_num 1 -- 副本数单机环境设为1 ); -- 3. 插入几条测试数据 INSERT INTO test_table VALUES (1001, 2024-01-01, 北京, 25, 150.50), (1002, 2024-01-01, 上海, 30, 200.00), (1003, 2024-01-02, 北京, 28, 180.75), (1001, 2024-01-02, 北京, 25, 90.00); -- 4. 执行一个查询 SELECT city, COUNT(*) as user_count, SUM(cost) as total_cost FROM test_table WHERE date 2024-01-01 GROUP BY city ORDER BY total_cost DESC;如果一切正常你将看到查询结果-------------------------------- | city | user_count | total_cost | -------------------------------- | 北京 | 3 | 421.25 | | 上海 | 1 | 200.00 | --------------------------------6.2 通过 Web UI 查看数据在 FE Web 界面 (http://宿主机IP:8030) 中你可以进入“数据表”菜单查看test_db.test_table。点击“查询”菜单可以看到你刚刚执行的 SQL 历史。在“集群”-“后端”中能看到 BE 节点的数据量统计发生变化。7. 常见问题与排查思路 (FAQ)部署过程中遇到问题不要慌大部分问题都有明确的排查路径。下表总结了最常见的问题及解决方法问题现象可能原因排查方式解决方案docker compose up失败提示端口冲突宿主机 8030, 9030 等端口被占用netstat -tlnp | grep 端口号修改docker-compose.yml中的ports映射如9031:9030或停止占用端口的服务。FE 容器不断重启日志报java.net.BindException: Address already in useFE 容器内部端口冲突可能之前运行过未清理干净的容器docker compose logs doris-fe查看错误日志彻底清理旧容器和网络docker compose down -v(会删除数据卷)然后重新up。BE 容器启动失败日志报Fail to get master client from cache. host port0BE 启动时无法连接到 FE网络问题或 FE 未就绪1.docker network inspect doris-docker_doris-network看容器IP。2. 在 BE 容器内ping doris-fe。3. 检查 FE 健康状态。1. 确保depends_on和健康检查配置正确。2. 确认docker-compose.yml中FE_SERVERS环境变量指向正确的 FE 主机名和端口 (doris-fe:9010)。执行ALTER SYSTEM ADD BACKEND成功但SHOW PROC /backends显示Alive: falseFE 和 BE 之间网络不通或 BE 的heartbeat_service未正常启动。1. 在 FE 容器内telnet doris-be 9050。2. 查看 BE 日志docker compose logs doris-be搜索heartbeat或thrift相关错误。1. 确认docker-compose.yml中 BE 的BE_ADDR环境变量设置正确 (doris-be:9050)。2. 检查 BE 日志是否有 JVM 内存不足等启动错误。通过宿主机 IP 无法访问 Web UI (8030)宿主机防火墙限制或 Docker 网络模式问题特别是 macOS/WSL1. 检查防火墙规则。2.curl http://localhost:8030在宿主机测试。3. 确认 Docker Desktop 设置中允许端口映射。1. 关闭防火墙或添加规则。2. 对于 macOS/WSL确保 Docker Desktop 资源足够并尝试重启 Docker。3. 临时使用host网络模式测试不推荐生产。插入或查询数据非常慢资源不足内存、CPU或 BE 节点未正确加入。1.docker stats查看容器资源使用。2. 在 Web UI 或通过SHOW PROC /backends\G确认 BE 状态为Alive: true。1. 为 Docker 分配更多内存和 CPU。2. 检查数据分布单 BE 时replication_num应为 1。容器启动后之前创建的表和数据不见了数据卷未正确持久化或使用了docker compose down不带-v后重新up新容器使用了新的空卷。检查宿主机./fe/doris-meta和./be/storage目录是否有数据文件。务必使用docker compose down -v来删除数据。正常停止应使用docker compose stop启动用docker compose start。数据持久化依赖于宿主机目录。8. 最佳实践与进阶配置当你成功运行起基础集群后可以考虑以下优化和进阶操作让这个 Docker 环境更贴近实用场景。8.1 配置持久化与自定义我们之前将配置目录./fe/conf和./be/conf挂载了出来但它们是空的。要自定义配置你需要先从容器中复制出默认配置文件。# 1. 从运行中的容器复制默认配置文件到宿主机 docker compose cp doris-fe:/opt/apache-doris/fe/conf/fe.conf ./fe/conf/ docker compose cp doris-be:/opt/apache-doris/be/conf/be.conf ./be/conf/ # 2. 根据需要修改配置文件 # 例如调整 FE JVM 堆内存vim ./fe/conf/fe.conf # JAVA_OPTS-Xmx4096m -Xms4096m ... # 例如调整 BE 存储路径vim ./be/conf/be.conf # storage_root_path ./storage; # 这个路径是容器内的我们已通过卷映射到宿主机./be/storage # 3. 重启服务使配置生效 docker compose restart doris-fe doris-be注意修改配置前请备份并充分理解参数含义。错误配置可能导致服务无法启动。8.2 扩展集群规模添加更多 BE/FE要模拟多节点集群只需在docker-compose.yml中定义新的服务即可。添加第二个 BE 节点doris-be2: image: apache/doris:2.0.4-be-x86_64 container_name: doris-be2 hostname: doris-be2 depends_on: doris-fe: condition: service_healthy environment: - FE_SERVERSfe1:doris-fe:9010 - BE_ADDRdoris-be2:9050 volumes: - ./be2/storage:/opt/apache-doris/be/storage - ./be2/log:/opt/apache-doris/be/log networks: - doris-network command: - /bin/bash - -c - | until curl -s http://doris-fe:8030/api/bootstrap; do sleep 5; done /opt/apache-doris/be/bin/start_be.sh --daemon tail -f /opt/apache-doris/be/log/be.INFO然后启动新容器并像步骤5一样在 MySQL 客户端中执行ALTER SYSTEM ADD BACKEND doris-be2:9050;。8.3 数据备份与迁移由于数据持久化在宿主机目录备份变得非常简单# 备份整个 Doris 数据目录包括元数据和存储数据 tar -czf doris-backup-$(date %Y%m%d).tar.gz ./fe/doris-meta ./be/storage # 恢复时解压到新的项目目录然后修改 docker-compose.yml 中的卷映射路径启动即可。8.4 监控与日志收集日志我们已经将日志目录挂载出来 (./fe/log,./be/log)可以直接在宿主机上用tail,grep查看或使用 ELK 等工具收集。监控Doris 的 FE 和 BE 都暴露了丰富的 Prometheus 格式的 Metrics 接口FE:http://fe_host:8030/metrics BE:http://be_host:8040/metrics。你可以配置 Prometheus Grafana 进行可视化监控。8.5 停止与清理正常停止保留数据docker compose stop停止并删除容器保留数据卷docker compose down停止并删除容器及数据卷数据会丢失docker compose down -v删除所有相关镜像、容器、网络谨慎操作docker system prune -a通过 Docker 部署 Apache Doris你获得了一个高度可控、可复现、易于管理的学习和开发环境。这个环境完美地屏蔽了底层系统的复杂性让你能专注于 Doris 的核心功能数据建模、查询优化和实时分析。现在你的数据仓库沙盒已经就绪下一步就是深入探索 Doris 强大的 OLAP 能力用它来解决你实际业务中的数据分析需求了。