用 Docker 部署 Apache Doris 实现分布式查询,核心是启动 1 个 FE 和 2 个 BE 容器,共用 bridge 网络并正确配置 FE_SERVERS 与 BE_ADDR;宿主机必须提前设置 vm.max_map_count=2000000,BE 才能注册成功并支持分布式查询。

用 Docker 部署 Apache Doris 并实现分布式查询,核心在于正确启动 FE(Frontend)和 BE(Backend)两个角色,并确保它们能互相发现、注册成功。单机上通过容器编排模拟分布式行为是完全可行的,不需要多台物理机。
必须提前配置的系统参数
Doris 的 BE 进程对 Linux 内存映射区域数量敏感,宿主机必须调高 vm.max_map_count,否则 BE 启动失败或状态异常:
- 执行命令临时生效:
sudo sysctl -w vm.max_map_count=2000000 - 写入配置永久生效:
echo "vm.max_map_count=2000000" | sudo tee -a /etc/sysctl.conf && sudo sysctl -p - 验证是否生效:
sysctl vm.max_map_count,输出应为2000000
使用 docker-compose 部署最小分布式集群
推荐采用 1 个 FE + 2 个 BE 的结构——这是功能完整、资源可控、又能体现“分布式查询”特性的最小组合。所有服务在同一台机器运行,但彼此独立,BE 会自动向 FE 注册并参与数据存储与计算分发。
创建 docker-compose.yml,内容如下:
version: '3.8'
services:
doris-fe:
image: apache/doris:2.0.0-fe-x86_64
container_name: doris-fe
environment:
- FE_SERVERS=fe1:127.0.0.1:9010
- FE_ID=1
ports:
- "8030:8030" # Web UI
- "9020:9020" # RPC
- "9030:9030" # MySQL protocol
- "9010:9010" # Edit log
volumes:
- ./fe/conf:/opt/doris-fe/conf
- ./fe/log:/opt/doris-fe/log
- ./fe/data:/opt/doris-fe/doris-meta
networks:
- doris-net
<p>doris-be1:
image: apache/doris:2.0.0-be-x86_64
container_name: doris-be1
environment:</p><ul><li>FE_SERVERS=fe1:127.0.0.1:9010</li><li>BE_ADDR=127.0.0.1:9050
ports:</li><li>"8040:8040"</li><li>"9050:9050"</li><li>"9060:9060"
volumes:</li><li>./be1/conf:/opt/doris-be/conf</li><li>./be1/log:/opt/doris-be/log</li><li>./be1/data:/opt/doris-be/storage
depends_on:</li><li>doris-fe
networks:</li><li>doris-net</li></ul><p>doris-be2:
image: apache/doris:2.0.0-be-x86_64
container_name: doris-be2
environment:</p><ul><li>FE_SERVERS=fe1:127.0.0.1:9010</li><li>BE_ADDR=127.0.0.1:9051
ports:</li><li>"8041:8040"</li><li>"9051:9050"</li><li>"9061:9060"
volumes:</li><li>./be2/conf:/opt/doris-be/conf</li><li>./be2/log:/opt/doris-be/log</li><li>./be2/data:/opt/doris-be/storage
depends_on:</li><li>doris-fe
networks:</li><li>doris-net</li></ul><p>networks:
doris-net:
driver: bridge
关键点说明:
- 两个 BE 使用不同端口映射(如
9050/9051),避免宿主机端口冲突 -
BE_ADDR必须设为容器内可解析的地址(127.0.0.1在容器内即本机),且与 FE 的FE_SERVERS中 IP 和端口一致 - 所有容器共用
doris-net网络,保障内部通信;FE 和 BE 之间不依赖宿主机localhost,而是走 Docker 内网
验证分布式查询能力
集群启动后,需确认 BE 已成功加入并能协同处理查询:
- 启动命令:
docker-compose up -d,等待约 2–3 分钟 - 检查状态:
docker-compose ps,所有服务应显示Up - 连接 MySQL 客户端:
mysql -h 127.0.0.1 -P 9030 -u root - 执行诊断 SQL:
-- 查看前端节点(应有 1 行,Join 和 Alive 均为 true) SELECT host, join, alive FROM frontends(); <p>-- 查看后端节点(应有 2 行,Alive 均为 true) SELECT host, port, alive FROM backends();</p><p>-- 创建测试表(Doris 自动按 BE 数量分片) CREATE TABLE test_dist ( id BIGINT, name STRING, dt DATE ) DISTRIBUTED BY HASH(id) BUCKETS 10;</p><p>-- 插入少量数据 INSERT INTO test_dist VALUES (1, 'Alice', '2026-05-07'), (2, 'Bob', '2026-05-07');</p><p>-- 执行查询(FE 会将任务拆解,调度到多个 BE 并行执行) SELECT COUNT(*) FROM test_dist;
若 backends() 返回两行且 alive=true,且 COUNT(*) 查询能秒级返回结果,即表明分布式查询链路已通。
常见问题排查提示
如果 BE 显示 alive=false 或无法注册:
- 检查宿主机
vm.max_map_count是否真正生效(不是容器内,是 Docker 宿主机) - 确认
docker-compose.yml中两个 BE 的BE_ADDR和端口不重复,且与各自ports映射逻辑一致 - 查看 BE 日志:
docker logs doris-be1,重点搜索register to FE或failed to connect - 确保没有防火墙或 SELinux 阻断容器间通信(Docker bridge 网络通常默认放行)


















