使用Docker快速部署Apache Doris集群:从环境隔离到生产实践

发布时间:2026/7/6 11:28:56
使用Docker快速部署Apache Doris集群:从环境隔离到生产实践 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度1. 这篇文章真正要解决的问题当你需要搭建一个实时数仓或进行海量数据的交互式分析时Apache Doris 是一个极具吸引力的选择。它性能强悍、架构简洁但传统的物理机或虚拟机部署方式往往让很多开发者和数据分析师望而却步。你需要准备多台服务器配置复杂的网络、依赖和环境变量任何一个环节出错都可能导致集群启动失败。这个过程不仅耗时而且难以复现更别提在本地开发测试了。这篇文章要解决的正是这个“从想法到运行”的最后一公里难题。我们将使用 Docker 技术在单台机器上快速、标准化地部署一个功能完整的 Doris 集群。这不仅仅是把安装命令从 Shell 脚本搬到 Dockerfile 那么简单。通过 Docker 部署你将获得环境隔离与一致性彻底告别“在我机器上好好的”问题开发、测试、生产环境高度统一。极速部署与销毁几分钟内拉起一个集群测试完成后一键清理资源零残留。学习与实验的沙盒你可以安全地尝试各种配置、模拟节点故障而不用担心污染宿主机。CI/CD 集成基础为自动化测试和持续交付铺平道路。本文将提供一个超详细的教程从 Docker 和 Doris 的核心概念讲起手把手带你完成单机伪集群的部署并深入讲解配置文件、网络通信、数据持久化等关键细节。无论你是想快速体验 Doris 的新手还是寻求标准化部署方案的运维这篇文章都能让你获得一个可立即复现的可靠方案。2. 基础概念与核心原理在开始动手之前我们需要理清几个关键概念这能帮助你更好地理解后续的每一步操作而不仅仅是照搬命令。Apache Doris 一个基于 MPP 架构的高性能、实时的分析型数据库。它主要包含两个核心组件FE (Frontend) 前端节点负责元数据管理、集群管理、用户认证和查询的接收与规划。你可以把它理解为集群的“大脑”和“调度中心”。BE (Backend) 后端节点负责数据存储、查询执行和计算。它是干活的“肌肉”数据实际存储在 BE 上。一个最小的 Doris 高可用集群需要至少 1 个 FE单节点模式和 1 个 BE。生产环境通常推荐 3 个 FE组成选举组一主两从和多个 BE。Docker 一个容器化平台。你可以把它想象成一个极其轻量的虚拟机。但它不是虚拟机它共享宿主机的操作系统内核只是通过 Namespace 和 Cgroups 技术为进程提供了一个独立的运行环境容器。这带来了启动快、资源占用小、镜像易于分发等巨大优势。Docker Compose 一个用于定义和运行多容器 Docker 应用的工具。通过一个docker-compose.yml文件你可以配置整个应用服务如 FE、BE包括它们的镜像、网络、卷、端口等。然后使用一条命令就能启动或停止所有服务非常适合管理像 Doris 这样的多组件应用。为什么用 Docker 部署 Doris传统部署方式中FE 和 BE 是直接安装在操作系统上的进程。它们对系统环境如 Java 版本、文件句柄数、时钟同步有严格要求且进程间依赖宿主机网络进行通信。Docker 部署则将每个组件FE、BE封装进独立的容器。容器内部是一个预配置好的、纯净的 Linux 环境包含了运行所需的所有依赖。容器之间通过 Docker 创建的虚拟网络进行通信与宿主机环境解耦。这样无论你的宿主机是 Ubuntu、CentOS 还是 macOS只要安装了 Docker都能以完全相同的方式运行 Doris。3. 环境准备与前置条件我们的目标是在一台机器上通过 Docker 模拟出多节点的 Doris 集群。请确保你的环境满足以下要求。3.1 硬件与操作系统要求操作系统 Linux (如 Ubuntu 20.04, CentOS 7), macOS, 或 Windows 10/11 (需使用 WSL2)。本文以Ubuntu 22.04 LTS为例进行演示。内存 至少4GB。建议 8GB 或以上因为 Doris 的 FE 和 BE 均为 Java 进程对内存有一定需求。磁盘空间 至少 10GB 可用空间用于存放 Docker 镜像、容器和数据卷。3.2 软件依赖安装安装 Docker Engine Doris 容器需要 Docker 来运行。# 更新 apt 包索引 sudo apt-get update # 安装必要的依赖包以便 apt 可以通过 HTTPS 使用仓库 sudo apt-get install -y \ ca-certificates \ curl \ gnupg \ lsb-release # 添加 Docker 的官方 GPG 密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 设置 Docker 稳定版仓库 echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # 更新 apt 包索引并安装 Docker Engine sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # 将当前用户加入 docker 组避免每次使用 sudo (操作后需退出终端重新登录) sudo usermod -aG docker $USER安装完成后运行docker --version和docker compose version验证安装成功。安装 Docker Compose (如果未安装插件版) 虽然 Docker 现在内置了docker compose命令但如果你习惯使用独立的docker-compose也可以安装。# 下载 Docker Compose 的稳定版本 (例如 v2.20.0) sudo curl -L https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose # 赋予可执行权限 sudo chmod x /usr/local/bin/docker-compose # 验证安装 docker-compose --version3.3 拉取 Doris 镜像Apache Doris 社区提供了官方的 Docker 镜像。我们直接拉取即可。# 拉取 FE 镜像 (以最新版本为例请查阅官方文档获取确切版本号) docker pull apache/doris:fe-2.0.4 # 拉取 BE 镜像 docker pull apache/doris:be-2.0.4注意 镜像标签如2.0.4请务必根据你的需求从 Docker Hub 或 Doris 官网获取最新稳定版。不同版本间配置可能有差异。4. 核心流程拆解与规划我们将部署一个最简单的集群1个 FE 和 1个 BE。整个流程可以拆解为以下清晰步骤每一步都有其明确目的规划目录结构 在宿主机上创建清晰的目录用于存放配置文件、数据和日志。这是实现数据持久化的关键否则容器重启后所有数据都会丢失。准备配置文件 Doris 的 FE 和 BE 有大量的可配置项。我们需要将最关键的配置从容器内映射到宿主机方便修改和管理。编写 Docker Compose 文件 这是核心蓝图定义了两个服务fe, be并指定了它们的镜像、网络、卷映射、端口、依赖关系等。启动集群 使用一条命令根据蓝图启动所有容器。初始化与连接集群 容器启动后需要通过 MySQL 客户端连接 FE执行 SQL 命令来添加 BE 节点完成集群的搭建。验证与测试 创建数据库、表插入并查询数据确保整个系统工作正常。5. 完整示例与配置实现现在我们开始一步步实现。请在你的工作目录例如~/doris-docker下进行操作。5.1 创建目录与配置文件mkdir -p ~/doris-docker/{fe,be}/{conf,data,log}这个命令创建了以下结构~/doris-docker/ ├── fe/ │ ├── conf/ # 存放 FE 配置文件 │ ├── data/ # 映射 FE 元数据目录 │ └── log/ # 映射 FE 日志目录 └── be/ ├── conf/ # 存放 BE 配置文件 ├── data/ # 映射 BE 数据存储目录 └── log/ # 映射 BE 日志目录5.2 准备 FE 配置文件进入fe/conf目录创建 FE 的核心配置文件fe.conf。这里我们只覆盖最关键的几项其他使用镜像内的默认值。cd ~/doris-docker/fe/conf vim fe.conf将以下内容写入fe.conf# 优先级网络地址用于多网卡环境。容器内通常为 eth0这里指定为容器 IP。 priority_networks 172.20.80.0/24 # 元数据目录指向我们通过卷映射的宿主机目录。 meta_dir /opt/apache-doris/fe/doris-meta # 查询端口和 RPC 端口 query_port 9030 rpc_port 9020 # 是否启用元数据高可用。单机测试可关闭生产环境必须开启。 enable_meta_checkpoint false关键解释priority_networks是 FE 向其他节点宣告自己 IP 地址的网段。在 Docker Compose 网络中每个容器会获得一个固定网段的 IP如172.20.80.x。这里我们预先指定这个网段让 FE 能正确广播自己的地址。5.3 准备 BE 配置文件进入be/conf目录创建 BE 的核心配置文件be.conf。cd ~/doris-docker/be/conf vim be.conf将以下内容写入be.conf# 优先级网络地址必须与 FE 在同一 Docker 网络网段。 priority_networks 172.20.80.0/24 # BE 数据存储目录指向映射的宿主机目录。 storage_root_path /opt/apache-doris/be/storage # BE 心跳服务端口、Web 服务端口、BRPC 端口 heartbeat_service_port 9050 webserver_port 8040 brpc_port 80605.4 编写 Docker Compose 蓝图在项目根目录 (~/doris-docker) 创建docker-compose.yml文件。version: 3.8 services: doris-fe: image: apache/doris:fe-2.0.4 container_name: doris-fe hostname: doris-fe environment: - FE_SERVERSfe1:172.20.80.2:9010 - FE_ID1 volumes: - ./fe/conf/fe.conf:/opt/apache-doris/fe/conf/fe.conf - ./fe/data:/opt/apache-doris/fe/doris-meta - ./fe/log:/opt/apache-doris/fe/log ports: - 8030:8030 # FE HTTP 端口用于 Web UI 和连接 - 9020:9020 # FE RPC 端口 - 9030:9030 # FE MySQL 查询端口用于客户端连接 networks: doris-net: ipv4_address: 172.20.80.2 healthcheck: test: [CMD, mysqladmin, ping, -h, localhost, -P, 9030] interval: 10s timeout: 5s retries: 3 start_period: 30s restart: unless-stopped doris-be: image: apache/doris:be-2.0.4 container_name: doris-be hostname: doris-be depends_on: doris-fe: condition: service_healthy environment: - FE_SERVERSfe1:172.20.80.2:9010 volumes: - ./be/conf/be.conf:/opt/apache-doris/be/conf/be.conf - ./be/data:/opt/apache-doris/be/storage - ./be/log:/opt/apache-doris/be/log networks: doris-net: ipv4_address: 172.20.80.3 restart: unless-stopped networks: doris-net: driver: bridge ipam: config: - subnet: 172.20.80.0/24配置文件深度解析networks: 我们自定义了一个桥接网络doris-net并指定了子网172.20.80.0/24。这确保了 FE 和 BE 容器在固定的 IP 段内priority_networks配置才能生效。environment:FE_SERVERS是 Doris 集群初始化的关键环境变量。格式为FE_NAME:FE_IP:FE_EDIT_LOG_PORT。这里我们告诉 BEFE 的名字是fe1IP 是172.20.80.2端口是9010FE 内部编辑日志端口。healthcheck: 为 FE 服务添加健康检查。只有当 FE 的 MySQL 服务端口 9030就绪后才启动 BE 服务 (depends_on)。这避免了 BE 启动时因连接不上 FE 而失败。volumes: 将宿主机目录挂载到容器内对应路径。这样配置文件、元数据和日志都保存在宿主机容器重建也不会丢失。ports: 将容器内部端口映射到宿主机。8030是 FE Web UI9030是 MySQL 协议端口最重要。6. 启动集群与初始化6.1 启动服务在docker-compose.yml所在目录执行cd ~/doris-docker docker compose up -d-d参数表示后台运行。使用docker compose ps查看服务状态直到两者都是Up (healthy)状态。6.2 连接 FE 并添加 BE 节点Doris 使用 MySQL 协议我们可以用任何 MySQL 客户端连接。这里使用 Docker 自带的mysql客户端。# 连接到 FE 容器内的 MySQL 服务 docker exec -it doris-fe mysql -h 127.0.0.1 -P 9030 -uroot成功连接后你会看到 MySQL 提示符。现在需要将 BE 节点添加到集群中。-- 在 MySQL 客户端中执行以下 SQL -- 添加 BE 节点IP 和端口heartbeat_service_port需与 BE 配置一致 ALTER SYSTEM ADD BACKEND 172.20.80.3:9050;重要 这里的 IP172.20.80.3是我们在docker-compose.yml中为doris-be容器分配的固定 IP端口9050是be.conf中配置的heartbeat_service_port。6.3 验证集群状态继续在 MySQL 客户端中执行-- 查看 FE 节点状态 SHOW PROC /frontends\G -- 输出中应看到 doris-fe:9010且 Alive 为 true -- 查看 BE 节点状态 SHOW PROC /backends\G -- 输出中应看到 172.20.80.3:9050且 Alive 为 trueSystemDecommissioned 为 false。如果 BE 的Alive状态在几分钟后变为true说明集群搭建成功。7. 运行结果与效果验证集群就绪后让我们进行一个完整的端到端测试验证 Doris 是否正常工作。7.1 创建数据库与表-- 1. 创建一个测试数据库 CREATE DATABASE test_db; USE test_db; -- 2. 创建一张明细表Duplicate Key 模型 CREATE TABLE IF NOT EXISTS demo_table ( user_id INT, date DATE, city VARCHAR(32), age SMALLINT, cost BIGINT ) DUPLICATE KEY(user_id, date) DISTRIBUTED BY HASH(user_id) BUCKETS 10 PROPERTIES(replication_num 1);解释 我们创建了一个包含用户ID、日期、城市、年龄和消费金额的表。DUPLICATE KEY指定了前缀索引列DISTRIBUTED BY HASH指定了数据分桶方式replication_num “1”表示副本数为1单机部署。7.2 插入与查询数据-- 3. 插入测试数据 INSERT INTO demo_table VALUES (1001, ‘2023-10-26’, ‘北京’, 25, 150), (1002, ‘2023-10-26’, ‘上海’, 28, 200), (1003, ‘2023-10-27’, ‘深圳’, 30, 180), (1001, ‘2023-10-27’, ‘北京’, 25, 220); -- 4. 执行简单查询 SELECT * FROM demo_table ORDER BY date; -- 5. 执行聚合查询 SELECT city, SUM(cost) as total_cost, AVG(age) as avg_age FROM demo_table GROUP BY city;如果以上步骤都能成功执行并返回正确结果恭喜你一个基于 Docker 的 Apache Doris 集群已经完美运行7.3 访问 Web UI在浏览器中打开http://你的宿主机IP:8030使用用户名root密码为空登录。在 Web UI 中你可以直观地查看集群状态、查询管理、数据表等信息。8. 常见问题与排查思路在部署和运行过程中你可能会遇到以下问题。这里提供系统的排查思路。问题现象可能原因排查方式解决方案docker compose up失败提示端口冲突宿主机 8030, 9030 等端口已被占用netstat -tlnp | grep :8030修改docker-compose.yml中ports映射的宿主机端口如8031:8030或停止占用端口的程序。BE 状态一直为Alive: false1. 网络不通。2.priority_networks配置错误。3. 添加 BE 的 SQL 命令 IP/端口错误。1. 在 FE 容器内ping 172.20.80.3。2. 分别检查 FE 和 BE 容器的ip addr确认 IP 在172.20.80.0/24网段。3. 确认ALTER SYSTEM命令中的 IP 和端口与 BE 配置一致。1. 检查 Docker 网络配置。2. 确保fe.conf和be.conf中的priority_networks与docker-compose.yml的subnet匹配。3. 重新执行正确的ALTER SYSTEM命令。连接 MySQL 客户端失败 (ERROR 2003)1. FE 容器未启动或崩溃。2. FE 的 MySQL 服务未正常监听。1.docker compose ps查看 FE 状态。2.docker logs doris-fe查看 FE 启动日志关注有无 ERROR。3. 进入 FE 容器docker exec -it doris-fe bash执行netstat -tlnp查看 9030 端口是否被java进程监听。1. 根据日志错误修复配置常见于fe.conf格式错误。2. 确保宿主机防火墙未阻止端口映射。插入数据或建表时报错Failed to find enough backendBE 节点未成功添加或状态异常。执行SHOW PROC ‘/backends’\G确认有 Alive 的 BE 且SystemDecommissioned为false。等待 BE 启动完成约1-2分钟或重新检查并添加 BE 节点。容器启动后数据丢失未配置数据卷持久化或卷映射路径错误。检查宿主机~/doris-docker/fe/data和~/doris-docker/be/data目录下是否有文件生成。确保docker-compose.yml中的volumes映射配置正确且宿主机目录有写入权限。通用排查命令docker compose logs [service-name] 查看指定服务的日志。docker exec -it [container-name] bash 进入容器内部。docker network inspect doris-docker_doris-net 查看自定义网络的详细信息确认容器 IP。9. 最佳实践与工程建议将 Docker 部署用于生产或严肃开发环境时需要考虑更多因素。9.1 配置优化JVM 参数 默认镜像的 JVM 参数可能不适合你的机器。可以通过环境变量JAVA_OPTS_FE和JAVA_OPTS_BE来覆盖。在docker-compose.yml的environment部分添加environment: - JAVA_OPTS_FE-Xmx4096m -Xms4096m -XX:UseG1GC - JAVA_OPTS_BE-Xmx8192m -Xms8192m -XX:UseG1GCBE 存储路径 生产环境中storage_root_path应指向 SSD 或高性能云盘挂载的目录。可以在宿主机挂载高性能磁盘到~/doris-docker/be/data。9.2 数据持久化与备份定期备份 FE 元数据 FE 的元数据目录 (doris-meta) 至关重要。除了卷持久化应建立定期备份机制如每天备份到对象存储。BE 数据安全 BE 的数据目录 (storage) 存储用户数据。确保该目录所在的宿主机磁盘有足够的空间和 RAID 保护。多 BE 部署时利用 Doris 的副本机制replication_num 1提供数据冗余。9.3 监控与运维日志收集 将fe/log和be/log目录的日志接入 ELKElasticsearch, Logstash, Kibana或类似日志平台便于问题追踪。指标监控 Doris 的 FE 和 BE 都暴露了 Prometheus 格式的指标FE:8030/metrics BE:8040/metrics。集成 Prometheus 和 Grafana 可以实时监控集群健康度、查询性能、资源使用情况。资源限制 在docker-compose.yml中为服务设置资源限制防止单个容器耗尽主机资源。deploy: resources: limits: cpus: ‘2.0’ memory: 4G reservations: cpus: ‘1.0’ memory: 2G9.4 扩展为多节点集群本教程是单机伪集群。要扩展为真正的多机集群思路如下在多台宿主机上分别安装 Docker。将docker-compose.yml、配置文件和数据目录通过共享存储如 NFS或配置管理工具如 Ansible分发到各主机。修改docker-compose.yml为每个 FE 和 BE 服务指定不同的container_name、hostname和固定 IP。修改fe.conf中的priority_networks为实际物理网络网段并配置所有 FE 地址到FE_SERVERS。在各主机上分别启动对应的服务并在 FE 中添加所有 BE 的 IP。通过 Docker 部署 Apache Doris你将复杂的环境依赖和部署流程封装在了简单的配置文件和命令之中。这套方案不仅适用于个人学习和测试其体现的“基础设施即代码”和“环境一致性”思想更是现代云原生数据平台运维的基石。掌握了它你就拥有了在任意符合要求的机器上快速复制一个分析数据库的能力。接下来你可以深入探索 Doris 的更多特性如物化视图、Rollup 索引、数据湖分析等将其强大的分析能力应用到你的实际业务场景中。 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度