Docker部署Apache Doris:快速搭建MPP分析数据库测试环境

Docker部署Apache Doris:快速搭建MPP分析数据库测试环境 这次我们来看一个用 Docker 部署 Apache Doris 的实战方案。Doris 是一个高性能、实时的 MPP 分析型数据库对于需要快速处理海量数据的场景非常有用。但传统部署方式步骤繁琐依赖复杂而 Docker 能极大简化这个过程。这篇文章的重点不是讲 Doris 的原理而是让你能快速、干净地在本地或测试环境跑起来一个 Doris 集群并验证其核心功能。如果你关心如何快速搭建一个数据分析测试环境或者想评估 Doris 的性能又或者希望有一个可复现、易清理的部署方式那么 Docker 部署是你的首选。本文将带你完成从环境准备、拉取镜像、启动容器、集群配置到基础功能测试的全过程。我们会重点关注 Docker 部署的便捷性、网络配置、数据持久化以及如何通过常用客户端进行连接和操作。1. 核心能力速览在开始动手之前我们先快速了解通过 Docker 部署 Doris 的核心特性和优势这能帮你判断是否适合你的场景。能力项说明部署方式基于 Docker 容器化部署支持单机与集群模式。核心优势环境隔离避免污染宿主机环境。快速启动镜像拉取后即可启动省去编译和复杂配置。易于维护容器启停、升级、销毁非常方便。资源可控可限制 CPU、内存使用。硬件门槛较低。建议宿主机内存 ≥ 4GB磁盘空间 ≥ 10GB。CPU 和显卡无特殊要求纯 CPU 运行。网络要求需要配置容器网络确保 FE前端、BE后端节点间及客户端能互通。数据持久化支持通过 Docker Volume 或绑定挂载实现数据持久化避免容器删除后数据丢失。启动方式通过docker run命令或docker-compose.yml文件一键启动。管理接口提供 Web UI默认端口 8030用于监控集群状态。客户端支持支持 MySQL 客户端、DBeaver、JDBC 等方式连接默认端口 9030。适合场景开发测试、功能验证、概念证明(POC)、学习研究、快速搭建演示环境。2. 适用场景与使用边界Docker 化部署的 Doris 主要服务于特定场景明确边界能帮助你更好地决策。它非常适合以下场景快速体验与学习开发者或学生想快速了解 Doris 的功能特性无需在本地安装复杂的依赖。功能测试与开发为应用程序开发提供一个隔离的、可随时重置的数据库测试环境。概念验证(POC)在投入生产环境前快速搭建一个集群来验证 Doris 是否满足业务的技术需求。演示与环境隔离需要干净的、可重复的演示环境或者同时运行多个不同版本的 Doris 进行测试。它有以下限制和不适合的场景生产环境对于核心生产系统通常建议使用物理机或虚拟机进行更稳定、性能可预估的部署。Docker 部署在资源隔离、网络性能、存储 I/O 方面可能存在额外开销和不确定性。超大规模数据与高性能压测Docker 的虚拟化层会带来一定的性能损耗对于极限性能测试或处理 PB 级数据的场景可能无法完全发挥硬件潜力。对持久化要求极高的场景虽然支持数据卷但其可靠性和性能与专业的分布式存储方案仍有差距。生产环境的数据持久化需要更周密的规划。资源极度受限的环境Docker 守护进程本身会消耗一定资源在资源非常紧张的机器上可能不适用。合规与安全提醒部署时请注意网络端口的暴露范围避免将管理界面如8030和查询端口9030直接暴露在公网。务必为root用户设置强密码并考虑创建具有最小权限的专属业务用户进行数据操作。用于测试的数据请确保其来源合法不涉及敏感信息。3. 环境准备与前置条件在拉取镜像和运行容器之前请确保你的基础环境已经就绪。操作系统支持 Linux (如 Ubuntu, CentOS)、macOS 和 Windows。本文以Linux (Ubuntu 22.04)环境为主要示例命令在 macOS 上通常也通用。Windows 用户建议使用 WSL2 或 Docker Desktop。Docker 引擎这是必须的。确保已安装并运行 Docker。检查安装docker --version检查服务状态sudo systemctl status docker(Linux)如果未安装请参考 Docker 官方文档进行安装。Docker Compose (可选但推荐)用于通过一个 YAML 文件定义和运行多容器应用管理集群非常方便。检查安装docker-compose --version如果未安装可单独安装或使用 Docker Desktop已内置。资源检查内存运行一个简单的 Doris 集群1 FE 1 BE建议预留至少 2GB 空闲内存。使用free -h命令查看。磁盘空间Doris 镜像约 1-2GB运行后数据会增长。确保有至少 10GB 可用空间。使用df -h命令查看。CPU现代多核 CPU 即可。网络端口确保以下端口在宿主机上未被占用或准备好使用其他端口。8030: FE 的 HTTP 端口Web UI。9030: FE 的 MySQL 协议端口客户端连接。8040: BE 的 HTTP 端口。9050: BE 的 heartbeat 端口内部通信。4. 安装部署与启动方式我们将介绍两种主流的启动方式使用docker run命令手动启动以及使用docker-compose编排文件一键启动集群。后者更适用于多节点部署是推荐的做法。4.1 方式一使用 docker run 启动单节点快速体验这种方式适合快速启动一个 All-in-One 的 Doris 节点进行功能体验。步骤 1拉取官方镜像Apache Doris 在 Docker Hub 上提供了官方镜像。建议拉取特定版本以获得稳定体验。# 拉取最新版本镜像 (可能为开发版) # docker pull apache/doris # 拉取指定版本镜像例如 2.0.5更稳定 docker pull apache/doris:2.0.5-rc07步骤 2创建数据持久化目录为了避免容器删除后数据丢失我们在宿主机上创建目录用于挂载。mkdir -p /opt/doris/doris-data步骤 3运行 Doris 容器这里我们启动一个容器同时运行 FE 和 BE 服务通过start_fe.sh --daemon和start_be.sh --daemon。docker run -d \ --name doris-quickstart \ -p 8030:8030 \ -p 9030:9030 \ -p 8040:8040 \ -p 9050:9050 \ -v /opt/doris/doris-data:/opt/doris/be/storage \ -e DORIS_ROLEALL \ apache/doris:2.0.5-rc07参数解释-d: 后台运行容器。--name: 为容器指定一个名称。-p: 端口映射将容器内端口映射到宿主机。-v: 数据卷挂载将宿主机/opt/doris/doris-data目录挂载到容器内 BE 的数据存储目录。-e DORIS_ROLEALL: 设置环境变量告诉启动脚本同时启动 FE 和 BE。步骤 4查看容器日志与状态# 查看容器是否运行 docker ps | grep doris # 查看容器启动日志特别是首次启动 docker logs -f doris-quickstart等待几分钟直到在日志中看到 FE 和 BE 启动成功的提示。4.2 方式二使用 Docker Compose 启动集群推荐使用 Docker Compose 可以清晰地定义 FE、BE 节点及其网络、数据卷是部署集群的最佳实践。步骤 1创建项目目录及配置文件mkdir doris-cluster cd doris-cluster步骤 2创建docker-compose.yml文件编辑该文件定义 1 个 FE 和 2 个 BE 的集群。version: 3.8 services: doris-fe: image: apache/doris:2.0.5-rc07 container_name: doris-fe-01 hostname: doris-fe-01 environment: - DORIS_ROLEFE - FE_SERVERSfe1:doris-fe-01:9010 - FE_ID1 ports: - 8030:8030 # Web UI - 9030:9030 # MySQL Client volumes: - ./fe-data/doris-meta:/opt/doris/fe/doris-meta - ./fe-data/log:/opt/doris/fe/log networks: - doris-net command: [“/opt/doris/start_fe.sh”] doris-be-01: image: apache/doris:2.0.5-rc07 container_name: doris-be-01 hostname: doris-be-01 environment: - DORIS_ROLEBE - FE_SERVERSfe1:doris-fe-01:9010 volumes: - ./be-data-01/storage:/opt/doris/be/storage - ./be-data-01/log:/opt/doris/be/log networks: - doris-net depends_on: - doris-fe command: [“/opt/doris/start_be.sh”] doris-be-02: image: apache/doris:2.0.5-rc07 container_name: doris-be-02 hostname: doris-be-02 environment: - DORIS_ROLEBE - FE_SERVERSfe1:doris-fe-01:9010 volumes: - ./be-data-02/storage:/opt/doris/be/storage - ./be-data-02/log:/opt/doris/be/log networks: - doris-net depends_on: - doris-fe command: [“/opt/doris/start_be.sh”] networks: doris-net: driver: bridge步骤 3启动集群# 在 docker-compose.yml 所在目录执行 docker-compose up -d-d参数表示后台启动。步骤 4查看集群状态# 查看所有容器状态 docker-compose ps # 查看 FE 节点日志 docker-compose logs -f doris-fe等待 FE 日志显示fe is ready to start或类似成功信息。5. 功能测试与效果验证集群启动后我们需要验证其是否正常工作并进行基本的数据库操作。5.1 验证 Web 管理界面FE 启动后可以通过 Web UI 查看集群状态。打开浏览器访问http://你的宿主机IP:8030。使用默认用户名root密码为空直接登录。登录后在导航栏进入System-Backend。如果能看到doris-be-01和doris-be-02两个 BE 节点且Alive状态为true则说明 FE 和 BE 之间的心跳通信正常集群部署成功。5.2 使用 MySQL 客户端连接并操作Doris 兼容 MySQL 协议我们可以使用任何 MySQL 客户端进行连接。步骤 1进入 FE 容器执行 SQL# 进入 FE 容器内部 docker exec -it doris-fe-01 /bin/bash # 使用 MySQL 客户端连接本机 FE mysql -h 127.0.0.1 -P 9030 -uroot成功连接后会看到 MySQL 命令行提示符mysql。步骤 2执行基础 SQL 测试-- 1. 查看集群版本 SELECT VERSION(); -- 2. 创建测试数据库 CREATE DATABASE IF NOT EXISTS test_db; USE test_db; -- 3. 创建测试表使用 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 2); -- 4. 插入测试数据 INSERT INTO test_table VALUES (1001, ‘2024-01-15’, ‘北京’, 25, 150.50), (1002, ‘2024-01-15’, ‘上海’, 30, 200.00), (1001, ‘2024-01-16’, ‘北京’, 25, 80.00), (1003, ‘2024-01-16’, ‘广州’, 28, 300.75); -- 5. 查询数据 SELECT * FROM test_table ORDER BY date, user_id; -- 6. 执行聚合查询 SELECT city, COUNT(*) as user_count, SUM(cost) as total_cost FROM test_table GROUP BY city; -- 7. 查看表结构 DESC test_table;如果每一步都能成功执行并返回预期结果说明 Doris 数据库的核心功能完全正常。5.3 验证数据持久化这是 Docker 部署的关键验证点确保数据不会因容器重启而丢失。写入数据在 MySQL 客户端中再插入几条新数据。INSERT INTO test_table VALUES (1004, ‘2024-01-17’, ‘深圳’, 35, 500.00); SELECT * FROM test_table WHERE user_id 1004;重启容器在宿主机上重启整个 Docker Compose 集群。cd /path/to/doris-cluster docker-compose restart重新连接并查询等待容器重启完毕后重新进入 FE 容器并连接 MySQL查询刚才插入的数据。docker exec -it doris-fe-01 mysql -h127.0.0.1 -P9030 -uroot -D test_db -e “SELECT * FROM test_table WHERE user_id 1004;”如果数据依然存在则证明通过 Docker Volume 挂载的数据持久化是成功的。6. 接口 API 与外部连接除了 MySQL 协议Doris 还提供了 HTTP API 和标准 JDBC/ODBC 驱动方便与应用程序集成。6.1 通过 JDBC 连接Java 示例你可以从 Doris 官网下载 JDBC 驱动或在 Maven 中引入依赖。!-- pom.xml 示例 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version !-- 建议使用 8.x 版本 -- /dependencyJava 连接代码示例import java.sql.*; public class DorisJdbcDemo { public static void main(String[] args) { String url “jdbc:mysql://你的宿主机IP:9030/test_db?useSSLfalseserverTimezoneUTC”; String user “root”; String password “”; // 初始为空 try (Connection connection DriverManager.getConnection(url, user, password); Statement statement connection.createStatement()) { String query “SELECT city, AVG(age) as avg_age FROM test_table GROUP BY city”; ResultSet resultSet statement.executeQuery(query); while (resultSet.next()) { System.out.println(“City: “ resultSet.getString(“city”) “, Average Age: “ resultSet.getFloat(“avg_age”)); } } catch (SQLException e) { e.printStackTrace(); } } }6.2 使用 DBeaver 等图形化客户端连接打开 DBeaver新建一个数据库连接。选择连接类型为MySQL。在连接设置中主机你的宿主机 IP端口9030数据库test_db(或留空)用户名root密码留空如果未修改点击“测试连接”如果成功即可像操作 MySQL 一样管理和查询 Doris 数据库。7. 资源占用与性能观察了解 Docker 容器的资源消耗对于评估和调优很重要。7.1 查看容器资源占用使用docker stats命令可以实时查看容器的 CPU、内存、网络 I/O 和磁盘 I/O 使用情况。# 查看所有运行中容器的资源统计 docker stats # 查看指定容器的资源统计 docker stats doris-fe-01 doris-be-01 doris-be-02在集群空闲时每个 BE 容器内存占用可能在 1GB 左右FE 容器占用更少。当执行数据导入或复杂查询时内存和 CPU 使用率会显著上升。7.2 调整容器资源限制如果宿主机资源紧张或想限制 Doris 容器使用的资源可以在docker-compose.yml中为每个服务添加资源限制。services: doris-fe: # ... 其他配置 ... deploy: resources: limits: cpus: ‘1.0’ # 限制使用 1 个 CPU 核 memory: 2G # 限制内存为 2GB reservations: memory: 1G # 保证至少 1GB 内存 doris-be-01: # ... 其他配置 ... deploy: resources: limits: cpus: ‘2.0’ memory: 4G修改后运行docker-compose up -d重启服务使配置生效。7.3 监控集群内部状态通过 Doris 的 Web UI (8030端口) 可以获取更详细的集群性能指标System - Backend查看 BE 节点状态、磁盘使用情况、上次心跳时间。Cluster - Load查看数据导入作业的状态。Query Profile在Monitor或通过SHOW PROC “/current_queries”;命令查看正在运行和历史的查询分析其资源消耗和耗时。8. 常见问题与排查方法部署和运行过程中可能会遇到一些问题以下是常见问题的排查思路。问题现象可能原因排查方式解决方案容器启动失败立即退出1. 端口被占用。2. 镜像损坏或拉取不完整。3. 启动命令或环境变量错误。1.docker logs 容器名查看详细错误日志。2.netstat -tlnp | grep 端口号检查端口占用。3.docker images确认镜像存在。1. 更换宿主机端口或停止占用端口的进程。2. 删除镜像并重新拉取docker rmi apache/doris:tagdocker pull ...。3. 检查docker run或docker-compose.yml语法。BE 节点在 Web UI 中显示为 Dead1. 网络不通BE 无法向 FE 发送心跳。2. BE 启动参数或配置错误。3. 宿主机资源内存不足。1. 进入 FE 容器ping doris-be-01。2. 查看 BE 容器日志docker logs doris-be-01。3. 使用docker stats查看 BE 容器状态。1. 确保docker-compose.yml中所有服务在同一个自定义网络如doris-net下。2. 检查 BE 启动日志中的错误信息修正配置。3. 为容器分配更多内存或清理宿主机资源。MySQL 客户端无法连接1. 防火墙阻止了 9030 端口。2. FE 服务未成功启动。3. 连接地址或端口错误。1. 在宿主机上telnet 宿主机IP 9030测试连通性。2.docker-compose logs fe查看 FE 启动日志。3. 确认连接命令中的 IP 和端口。1. 关闭防火墙或添加规则放行 9030 端口。2. 根据 FE 日志解决启动问题。3. 确保使用-h 宿主机IP -P 9030连接。数据插入或查询非常慢1. 资源不足CPU/内存/磁盘IO。2. 表结构设计不合理分桶、分区。3. 数据量过大未使用合适的索引。1. 使用docker stats和top命令监控资源。2. 通过EXPLAIN分析查询计划。3. 检查 Doris Web UI 中的查询 Profile。1. 为容器分配更多资源或优化宿主机环境。2. 参考 Doris 最佳实践重新设计表结构。3. 对常用查询条件建立 Rollup 索引。容器删除后数据丢失启动容器时未使用-v参数挂载数据卷。检查启动命令或docker-compose.yml中是否定义了volumes。务必使用数据卷挂载将容器内关键目录如/opt/doris/be/storage,/opt/doris/fe/doris-meta映射到宿主机。docker-compose up报网络错误自定义网络doris-net可能已存在但配置冲突。运行docker network ls查看网络列表。尝试先清理旧网络docker-compose down然后docker network prune再重新启动。9. 最佳实践与使用建议遵循以下建议可以让你的 Docker 化 Doris 环境更稳定、更易管理。版本固定在生产测试或重要开发环境中务必在docker-compose.yml或docker run命令中指定 Doris 镜像的完整版本标签如apache/doris:2.0.5-rc07避免因拉取到最新的latest标签而导致意外升级和兼容性问题。配置分离将需要自定义的 Doris 配置文件如fe.conf,be.conf通过 Volume 挂载到容器内而不是直接修改镜像中的文件。这样升级镜像时配置不会丢失。volumes: - ./custom-fe.conf:/opt/doris/fe/conf/fe.conf:ro数据备份定期备份挂载到宿主机的数据目录./fe-data,./be-data-*。虽然数据已持久化但备份是防止误操作或硬件故障的最后防线。日志收集将容器内的日志目录/opt/doris/fe/log,/opt/doris/be/log也挂载到宿主机方便使用tail,grep等工具查看和分析日志也便于接入 ELK 等日志系统。健康检查在docker-compose.yml中为服务添加健康检查指令确保集群状态更可控。healthcheck: test: [“CMD”, “mysqladmin”, “ping”, “-h”, “localhost”, “-P”, “9030”, “-uroot”] interval: 30s timeout: 10s retries: 3 start_period: 40s安全加固修改默认密码首次登录 Web UI 或 MySQL 后立即为root用户设置强密码。SET PASSWORD FOR ‘root’ PASSWORD(‘YourStrongPassword123!’);创建业务用户避免直接使用root进行业务操作创建具有特定库表权限的普通用户。限制网络访问在防火墙或 Docker 网络层面限制只有特定的应用服务器 IP 才能访问 Doris 的 9030 和 8030 端口。性能调优Docker 部署的性能瓶颈往往在磁盘 I/O。如果进行性能测试请确保数据卷挂载的宿主机目录位于高性能 SSD 上并考虑使用docker run的--device-read-bps、--device-write-bps等参数进行限制测试或直接使用物理机部署进行最终性能评估。10. 总结与下一步通过 Docker 部署 Apache Doris我们获得了一个极其便捷的、开箱即用的实时数据分析环境。这种方法屏蔽了底层依赖的复杂性让你能专注于 Doris 的核心功能体验和业务逻辑验证。最关键的优势在于环境的一致性和可销毁性这对于需要频繁搭建和重置测试场景的团队来说价值巨大。你应该最先验证的功能就是基础的 CRUD 和聚合查询这能确认整个数据通路是否畅通。最容易踩的坑通常是网络配置导致 BE 节点无法注册以及忘记挂载数据卷导致容器重启后数据丢失。按照本文的步骤重点检查docker-compose.yml中的网络定义和volumes配置能避开大部分问题。部署成功后下一步可以深入探索 Doris 更强大的特性数据导入尝试通过 Stream Load、Broker Load 等方式从 HDFS、S3 或本地文件导入更大规模的数据集。表结构优化学习使用分区、分桶、Rollup 物化视图来优化查询速度。生态集成验证 Doris 与 Flink、Spark、Kafka 等大数据组件的连接。高可用部署尝试部署多个 FE 节点Follower 和 Observer来实现 FE 的高可用。把这个 Docker Compose 配置文件保存好它就是你可随时复现的 Doris 测试环境蓝图。当你需要为一个新项目快速验证数据分析方案时它会节省你大量时间。