30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度最近在搭建实时数仓测试环境时尝试使用 Docker 部署 Apache Doris本以为能快速启动结果在 FE 和 BE 节点的配置与注册环节踩了不少坑。从容器网络配置、配置文件映射到节点状态检查每一步都可能遇到意想不到的问题。本文将基于实战经验详细拆解 Docker 部署 Doris 的正确流程重点剖析 FE/BE 节点的核心配置项、注册机制以及常见故障的排查思路帮你避开我踩过的那些“坑”。本文适合对 Docker 和 Doris 有一定了解希望快速搭建开发/测试环境的开发者。通过本文你将掌握一套完整的、可复现的 Docker 化 Doris 部署方案并理解其内部节点通信原理为后续的生产环境部署打下坚实基础。1. 背景与核心概念为什么选择 Docker 部署 DorisApache Doris 是一款高性能、实时的 MPP 分析型数据库广泛应用于实时报表、即席查询、数据仓库等场景。其架构主要由两种节点组成FE (Frontend)负责元数据管理、集群管理、查询解析和规划。可以理解为 Doris 的“大脑”管理着库、表、分区等元信息并接收客户端的 SQL 请求。BE (Backend)负责数据存储和查询执行。可以理解为 Doris 的“肌肉”实际存储数据文件并执行 FE 下发的查询计划。在本地开发、功能验证或快速原型搭建阶段使用 Docker 部署 Doris 具有显著优势环境隔离避免污染宿主机环境依赖项如特定 Java 版本被封装在容器内。快速启动一条命令即可拉起包含 FE 和 BE 的完整集群无需复杂的系统配置。一致性确保开发、测试环境与文档或社区示例保持一致减少环境差异导致的问题。易于清理测试完成后直接删除容器和镜像即可不留任何残留。然而Docker 部署也带来了新的挑战主要是网络配置和数据持久化。Doris 的 FE 和 BE 节点之间、客户端与 FE 之间需要通过明确的 IP 和端口进行通信。在容器动态 IP 和网络隔离的背景下如何正确配置这些地址成为部署成功的关键。同时官方也明确指出Docker 部署仅适用于本地开发和测试因为容器停止后数据会丢失且单副本部署不具备高可用性切勿用于生产环境。2. 环境准备与版本说明在开始部署前请确保你的环境满足以下要求。我将以最通用的 Linux 环境为例进行说明macOS 和 Windows 用户使用 Docker Desktop 时大部分命令是相通的。操作系统任何支持 Docker 的 Linux 发行版如 Ubuntu 20.04/22.04, CentOS 7/8、macOS 或 Windows 10/11。Docker 版本建议使用 Docker Engine 20.10 及以上版本或 Docker Desktop 4.x 版本。可通过docker --version命令检查。Docker Compose本文使用docker run命令进行演示你也可以使用 Docker Compose 编排原理相同。硬件资源建议为 Docker 分配至少 4GB 内存和 2个 CPU 核心。Doris BE 节点对内存有一定要求。网络确保宿主机的防火墙或安全组规则允许容器内部及容器与宿主机的通信主要涉及 8030, 9030, 8040, 9050, 9060 等端口。关键版本选择Doris 版本我们选择较为稳定且功能完善的apache/doris:2.0.8-fe-x86_64和apache/doris:2.0.8-be-x86_64镜像。请注意FE 和 BE 需要使用相同的主版本号。Java 环境Doris 2.x 版本需要 JDK 11 或 JDK 17。幸运的是官方 Docker 镜像已内置了正确的 Java 环境我们无需单独安装。你可以通过以下命令预先拉取镜像加速后续部署过程docker pull apache/doris:2.0.8-fe-x86_64 docker pull apache/doris:2.0.8-be-x86_643. 核心配置原理FE 与 BE 如何协同工作在动手部署前理解几个关键配置项的作用至关重要这能帮助你在出问题时快速定位。3.1 FE 核心配置解析FE 的配置文件通常为fe.conf在 Docker 部署中我们需要通过环境变量或卷挂载来覆盖默认配置。以下几个参数是必须关注的priority_networks这是最易出错的配置之一。它用于指定 FE 节点对外服务的 IP 地址所在的 CIDR 网段。在 Docker 中容器通常拥有一个虚拟网卡如eth0其 IP 地址是 Docker 网络分配的。你必须将此参数设置为容器自身的 IP 网段例如172.17.0.0/16Docker 默认网桥或更精确的172.17.0.2/32。如果配置错误BE 节点将无法连接到 FE导致注册失败。query_portMySQL 协议端口客户端如 MySQL 命令行、JDBC连接 Doris 时使用的端口默认为9030。http_portHTTP 端口用于访问 FE 的 Web UI用于系统监控和接收一些 HTTP 请求默认为8030。edit_log_portFE 集群内部元数据同步端口用于多个 FE 实例之间的日志复制默认为9010。单机部署时也需开放。3.2 BE 核心配置解析BE 的配置文件通常为be.conf同样需要注意网络配置。priority_networks作用同 FE用于指定 BE 节点对外服务的 IP 地址。必须确保 FE 能通过此 IP 访问到 BE。在 Docker 网络下通常需要设置为与 FE 在同一 Docker 网络下的容器 IP 网段。be_portBE 上 Thrift Server 的端口用于接收来自 FE 的请求默认为9060。webserver_portBE 的 HTTP 端口用于访问 BE 的 Web UI 和调试接口默认为8040。heartbeat_service_portBE 的心跳服务端口FE 通过此端口向 BE 发送心跳默认为9050。在 FE 上执行ALTER SYSTEM ADD BACKEND命令时指定的端口就是此端口。3.3 Docker 网络模式选择Docker 提供了多种网络模式对于 Doris 集群部署推荐以下两种--network host(主机网络)容器直接使用宿主机的网络命名空间。这样容器内的服务端口直接映射到宿主机配置最简单priority_networks直接设置为宿主机 IP 即可。但缺点是不够隔离且可能引起端口冲突。自定义 Bridge 网络创建一个 Docker 网络让 FE 和 BE 容器都加入其中。这样容器间可以通过容器名或自定义 IP 通信与宿主机隔离更好。这是更推荐的方式我们需要在创建容器时指定--network并正确配置priority_networks为该网络内的容器 IP。本文将采用自定义 Bridge 网络的方式因为它更贴近生产环境的隔离思想也能更好地演示配置要点。4. 完整实战一步步部署 Doris 集群接下来我们开始实际的部署操作。请按照顺序执行以下步骤。4.1 第一步创建 Docker 网络首先我们创建一个专用的 Docker 网络用于 Doris 集群内部通信。docker network create doris-network创建后可以使用docker network inspect doris-network查看网络详情记下Subnet信息例如可能是172.18.0.0/16。后续配置priority_networks时会用到这个网段。4.2 第二步启动 FE 节点启动 FE 节点并挂载数据卷以实现元数据持久化。同时我们需要传递关键的配置参数。# 创建用于持久化 FE 元数据的目录 mkdir -p /opt/doris-data/fe/doris-meta mkdir -p /opt/doris-data/fe/log # 启动 FE 容器 docker run -d \ --name doris-fe \ --network doris-network \ --hostname doris-fe \ -p 8030:8030 \ -p 9030:9030 \ -v /opt/doris-data/fe/doris-meta:/opt/apache-doris/fe/doris-meta \ -v /opt/doris-data/fe/log:/opt/apache-doris/fe/log \ -e FE_SERVERSfe1:172.18.0.2:9010 \ -e FE_ID1 \ apache/doris:2.0.8-fe-x86_64参数详解-d后台运行容器。--name和--hostname指定容器名称和主机名便于识别。--network doris-network将容器加入我们刚创建的网络。-p 8030:8030 -p 9030:9030将容器的 8030 (HTTP) 和 9030 (MySQL) 端口映射到宿主机方便从外部访问。-v ...:/opt/apache-doris/fe/doris-meta将宿主机目录挂载到容器内 FE 元数据目录实现数据持久化。这是防止容器重启后元数据丢失的关键。-e FE_SERVERS指定 FE 集群的服务器列表。格式为fe_name:fe_ip:edit_log_port。这里是单节点所以只配置自己。注意fe_ip需要是容器在doris-network中的 IP。我们可以先启动再用docker inspect查看其 IP或者使用容器名需确保 FE 配置支持主机名解析。为简化我们先假设其 IP 为172.18.0.2。-e FE_ID指定 FE 节点的唯一 ID单节点设为 1 即可。关键点官方镜像的启动脚本会自动根据环境变量FE_SERVERS和FE_ID来生成fe.conf中的priority_networks等配置。但为了更清晰地演示我们也可以选择自定义配置文件。自定义配置启动进阶在宿主机上创建fe.conf文件例如/opt/doris-data/fe/conf/fe.conf内容如下# 设置 Java 环境镜像内已设置可省略 # JAVA_HOME/path/to/java # 关键指定 FE 监听的网络。这里使用容器在 doris-network 中的 IP 段。 priority_networks 172.18.0.0/16 # 元数据目录 meta_dir /opt/apache-doris/fe/doris-meta # 端口配置保持默认即可除非冲突 http_port 8030 rpc_port 9020 query_port 9030 edit_log_port 9010启动容器时额外挂载这个配置文件docker run -d \ --name doris-fe \ --network doris-network \ -p 8030:8030 -p 9030:9030 \ -v /opt/doris-data/fe/doris-meta:/opt/apache-doris/fe/doris-meta \ -v /opt/doris-data/fe/log:/opt/apache-doris/fe/log \ -v /opt/doris-data/fe/conf/fe.conf:/opt/apache-doris/fe/conf/fe.conf \ apache/doris:2.0.8-fe-x86_644.3 第三步检查 FE 节点状态等待约 30 秒后FE 节点应启动完成。我们可以通过 MySQL 客户端连接来检查其状态。# 通过宿主机映射的端口连接 FE mysql -h 127.0.0.1 -P 9030 -uroot如果连接成功会看到 MySQL 命令行提示符MySQL。执行以下命令查看 FE 状态SHOW FRONTENDS\G预期输出中Alive和Join字段都应为trueIsMaster为true因为是单节点。*************************** 1. row *************************** Name: fe_xxxx_xxxx_xxxx_xxxx IP: 172.18.0.2 HostName: doris-fe EditLogPort: 9010 HttpPort: 8030 QueryPort: 9030 RpcPort: 9020 Role: FOLLOWER IsMaster: true ClusterId: xxxxxxxx Join: true Alive: true ReplayedJournalId: xxx LastHeartbeat: 2023-10-27 08:00:00 IsHelper: true ErrMsg: Version: doris-2.0.8-xxxx CurrentConnected: Yes注意IP字段显示的应该是容器在doris-network中的 IP如172.18.0.2而不是127.0.0.1。这证明priority_networks配置生效了。4.4 第四步启动 BE 节点FE 正常启动后我们开始部署 BE 节点。同样需要数据持久化和正确的网络配置。# 创建用于持久化 BE 数据的目录 mkdir -p /opt/doris-data/be/storage mkdir -p /opt/doris-data/be/log # 启动 BE 容器 docker run -d \ --name doris-be \ --network doris-network \ --hostname doris-be \ -p 8040:8040 \ -v /opt/doris-data/be/storage:/opt/apache-doris/be/storage \ -v /opt/doris-data/be/log:/opt/apache-doris/be/log \ apache/doris:2.0.8-be-x86_64参数详解-p 8040:8040映射 BE 的 Web UI 端口到宿主机。-v ...:/opt/apache-doris/be/storage挂载 BE 数据存储目录实现数据持久化。我们没有显式指定priority_networks官方镜像的启动脚本会尝试自动探测。但在复杂网络下最好也自定义配置。自定义 BE 配置启动在宿主机上创建be.conf文件例如/opt/doris-data/be/conf/be.conf内容如下# 指定 BE 监听的网络。必须与 FE 的 priority_networks 配置在同一个物理/虚拟网络内且能被 FE 访问。 priority_networks 172.18.0.0/16 # 数据存储目录 storage_root_path /opt/apache-doris/be/storage # 端口配置 be_port 9060 webserver_port 8040 heartbeat_service_port 9050 brpc_port 8060启动容器时挂载此配置docker run -d \ --name doris-be \ --network doris-network \ -p 8040:8040 \ -v /opt/doris-data/be/storage:/opt/apache-doris/be/storage \ -v /opt/doris-data/be/log:/opt/apache-doris/be/log \ -v /opt/doris-data/be/conf/be.conf:/opt/apache-doris/be/conf/be.conf \ apache/doris:2.0.8-be-x86_644.5 第五步在 FE 中注册 BE 节点BE 容器启动后它并不会自动加入 Doris 集群。我们需要在 FE 中执行 SQL 命令手动添加这个 BE 节点。再次连接到 FE 的 MySQL 端口mysql -h 127.0.0.1 -P 9030 -uroot执行添加 BE 的命令。这里的 IP 和端口至关重要ALTER SYSTEM ADD BACKEND doris-be:9050;doris-be这是 BE 容器的名称。因为在同一个 Docker 自定义网络 (doris-network) 中容器之间可以通过容器名进行 DNS 解析。这比使用动态 IP 更稳定。9050这是 BE 的heartbeat_service_portFE 通过此端口向 BE 发送心跳。为什么不用 IP 而用容器名在 Docker 网络中容器的 IP 可能在重启后发生变化。使用在同一个自定义网络下的容器名Docker 的内置 DNS 会将其解析为当前正确的 IP提高了配置的稳定性。检查 BE 节点状态SHOW BACKENDS\G等待片刻约10-20秒心跳周期如果看到类似以下输出且Alive列为true则说明 BE 注册成功并状态正常。*************************** 1. row *************************** BackendId: 10001 Host: doris-be HeartbeatPort: 9050 BePort: 9060 HttpPort: 8040 BrpcPort: 8060 LastStartTime: 2023-10-27 08:01:00 LastHeartbeat: 2023-10-27 08:02:30 Alive: true SystemDecommissioned: false TabletNum: 0 DataUsedCapacity: 0.000 AvailCapacity: 1.000 TB TotalCapacity: 1.000 TB UsedPct: 0.00% MaxDiskUsedPct: 0.00% RemoteUsedCapacity: 0.0004.6 第六步验证集群功能现在一个简单的单 FE、单 BE 的 Doris 集群已经在 Docker 中运行起来了。让我们创建一个数据库和表插入并查询数据以验证集群功能完整。在 MySQL 客户端中执行以下 SQL-- 创建测试数据库 CREATE DATABASE docker_test_db; USE docker_test_db; -- 创建测试表 CREATE TABLE test_table ( id INT, name VARCHAR(50), score DECIMAL(5,2), create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) DUPLICATE KEY(id) DISTRIBUTED BY HASH(id) BUCKETS 8 PROPERTIES ( replication_num 1 );replication_num 1表示副本数为 1适用于单 BE 节点的测试环境。插入测试数据INSERT INTO test_table (id, name, score) VALUES (1, Alice, 95.5), (2, Bob, 88.0), (3, Charlie, 92.3);查询数据SELECT * FROM test_table ORDER BY id;如果一切正常你将看到插入的三条数据。5. 常见问题与排查思路 (FAQ)在实际部署中你可能会遇到以下问题。这里提供排查思路和解决方案。5.1 BE 节点注册失败SHOW BACKENDS显示Alive为false这是最常见的问题。排查步骤检查 BE 容器日志docker logs doris-be。查看是否有明显的错误如端口冲突、配置文件解析错误、存储路径权限问题等。检查 BE 进程进入 BE 容器docker exec -it doris-be bash执行ps aux | grep be确认be进程是否存在。检查网络连通性这是重中之重。进入 FE 容器docker exec -it doris-fe bash。尝试 ping BE 容器名ping doris-be。应该能解析出 IP 并 ping 通。尝试 telnet BE 的心跳端口telnet doris-be 9050。如果不通说明 BE 的heartbeat_service_port未正常监听或者防火墙/安全组规则阻止了连接。检查priority_networks配置分别进入 FE 和 BE 容器查看/opt/apache-doris/fe/conf/fe.conf和/opt/apache-doris/be/conf/be.conf。确认priority_networks设置是否正确覆盖了容器在doris-network中的 IP。可以通过ifconfig或ip addr查看容器内 IP。关键FE 配置的priority_networks决定了 FE 对外宣称的 IP (SHOW FRONTENDS中的IP列)。BE 配置的priority_networks决定了 BE 对外宣称的 IP。在ALTER SYSTEM ADD BACKEND时使用的地址必须能被 FE 访问到并且与 BE 对外宣称的 IP 一致或能被解析到。使用容器名是最佳实践。重新添加 BE如果确认是地址问题可以先移除错误的 BE再用正确的地址添加。-- 首先在 FE 中移除错误的 BE (假设 BackendId 是 10001) ALTER SYSTEM DECOMMISSION BACKEND 10001; -- 等待 DECOMMISSION 完成或者使用 DROP 强制删除谨慎可能导致数据丢失 -- ALTER SYSTEM DROP BACKEND 10001; -- 然后用正确的地址重新添加 ALTER SYSTEM ADD BACKEND doris-be:9050;5.2 客户端无法连接到 FE 的 MySQL 端口 (9030)排查步骤检查 FE 容器是否正常运行docker ps | grep doris-fe。检查端口映射docker port doris-fe确认 9030 端口是否映射到了宿主机如0.0.0.0:9030。检查宿主机防火墙是否阻止了 9030 端口的入站连接。进入 FE 容器检查fe.conf中query_port配置是否为 9030以及priority_networks是否包含容器对外的 IP。查看 FE 日志/opt/apache-doris/fe/log/fe.log或docker logs doris-fe看是否有绑定地址失败等错误。5.3 数据插入失败或查询报错 “Backend not found”可能原因BE 节点状态异常 (Alivefalse)。表的replication_num例如设为 3大于当前健康的 BE 节点数量。数据导入时指定的 BE 地址错误。解决方案确保SHOW BACKENDS中至少有一个Alivetrue的节点。对于测试环境建表时指定PROPERTIES (replication_num 1)。检查数据导入命令如 Stream Load, Broker Load中配置的 BE 地址是否正确。5.4 容器重启后数据丢失原因启动容器时没有使用-v参数将容器内的数据目录如/opt/apache-doris/fe/doris-meta,/opt/apache-doris/be/storage挂载到宿主机持久化目录。解决方案严格按照本文 4.2 和 4.4 步骤在docker run命令中使用-v参数进行目录挂载。这样即使容器被删除数据仍然保留在宿主机上重新启动一个新容器并挂载相同目录即可恢复。5.5 性能问题或内存不足Docker 默认的资源限制可能较低。如果进行数据量较大的导入或查询可能遇到性能瓶颈或 OOM内存溢出。解决方案启动容器时增加资源限制docker run -d \ --name doris-be \ --network doris-network \ -m 8g \ # 限制内存为 8GB --cpus2 \ # 限制使用 2 个 CPU 核 ... # 其他参数调整 BE 的be.conf中的内存相关参数如mem_limit,storage_page_cache_limit等使其不超过 Docker 容器的内存限制。6. 最佳实践与工程建议基于踩坑经验总结以下最佳实践可以帮助你更稳定地管理和使用 Docker 化的 Doris。使用 Docker Compose 编排对于多节点部署如 1 FE 3 BE使用docker-compose.yml管理服务依赖、网络和配置更加清晰和方便。可以定义好所有服务的镜像、卷、网络、环境变量一键启动整个集群。配置持久化与版本管理将自定义的fe.conf和be.conf文件放在宿主机目录如./doris-config/中并通过卷挂载。将这些配置文件纳入版本控制系统如 Git便于跟踪变更和回滚。日志持久化同样将 FE 和 BE 的日志目录挂载到宿主机便于排查问题。日志路径通常为/opt/apache-doris/fe/log和/opt/apache-doris/be/log。使用固定 IP 或容器名在自定义 Docker 网络中优先使用--hostname或容器名作为节点地址避免使用可能变化的 IP 地址。在ALTER SYSTEM ADD BACKEND时使用容器名如doris-be:9050。健康检查与监控可以编写简单的 Shell 脚本定期使用mysql -e SHOW FRONTENDS; SHOW BACKENDS;检查集群节点状态并集成到监控系统如 Prometheus Grafana中。Doris 本身也提供了丰富的 HTTP 监控指标接口FE:http://fe_host:8030/metrics BE:http://be_host:8040/metrics。资源规划FE对 CPU 要求不高但需要足够的内存来缓存元数据。建议分配 2-4GB 内存。BE既是 CPU 密集型也是内存密集型。内存大小直接影响查询性能和导入速度。建议至少分配 4GB 内存并根据数据量和并发调整。存储BE 的数据目录storage_root_path应挂载到宿主机 SSD 磁盘上以获得最佳的 I/O 性能。备份策略对于测试环境定期备份挂载到宿主机的doris-meta目录FE 元数据和storage目录BE 数据。虽然这不是生产级备份方案但能防止开发测试过程中的意外丢失。明确环境界限始终牢记本文所述的 Docker 部署方式仅适用于开发、测试、体验和学习。生产环境必须使用物理机或虚拟机部署多副本集群并配置负载均衡、监控告警、定期备份等完整的高可用方案。通过以上步骤和注意事项你应该能够成功在 Docker 中部署并运行一个功能完整的 Apache Doris 集群并理解其配置背后的原理。这套方法为快速搭建测试环境、验证功能、学习 Doris 提供了极大的便利。如果在操作过程中遇到其他问题多查看组件日志 (docker logs)并结合 Doris 官方文档和社区资源大部分问题都能找到解决方案。 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度