Apache Doris 作为高性能 MPP 分析型数据库,其 Frontend(FE)节点负责元数据管理、SQL 解析优化等核心功能,是 Doris 集群的“大脑”。Docker 部署 Doris FE 可大幅简化环境配置、实现快速启停,但很多同学在部署或启动过程中,常会遇到 OpenJDK 内存申请失败的报错,具体如下:
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000600000000, 8589934592, 0) failed; error='Not enough space' (errno=12)
初次遇到该报错易误判为磁盘空间不足,实则核心原因是 Doris FE 默认 JVM 堆内存配置(通常 8GB)超出了系统或 Docker 容器的可用内存限制。本文将从 Docker 部署 Doris FE 完整流程入手,重点讲解内存大小修改方法,并整合报错解析、排查及解决方案,全程实操落地,适用于新手入门和运维日常部署。
一、前置准备(必做)
部署前需确保环境满足以下条件,避免后续出现兼容性或资源不足问题:
- 系统要求:CentOS 7+/Ubuntu 18.04+(推荐 CentOS 7,兼容性更好);
- Docker 环境:已安装 Docker 19.03+,并启动 Docker 服务(
systemctl start docker); - 内存要求:服务器可用内存 ≥ 4GB(若部署单节点测试,建议 ≥ 8GB;生产环境根据集群规模调整);
- 网络要求:开放 8030(FE thrift 服务端口)、8040(FE HTTP 服务端口)端口,避免端口占用。
补充:若使用 Ubuntu 系统,需先检查 Docker 内存限制功能是否启用,执行 docker info 查看,若出现 No swap limit support 警告,需先配置内核参数(后续步骤会补充),否则无法正常限制容器内存。
二、Docker 部署 Doris FE 完整步骤
本次采用官方推荐的 Doris 镜像(apachedoris/doris-fe),全程命令行操作,步骤清晰,新手可直接复制执行。
步骤1:拉取 Doris FE 官方镜像
执行以下命令,拉取最新稳定版 Doris FE 镜像(若需指定版本,可在镜像后添加 :版本号,如 apachedoris/doris-fe:2.0.0):
# 拉取 Doris FE 镜像
docker pull apachedoris/doris-fe
# 查看镜像,确认拉取成功
docker images | grep doris-fe
若拉取缓慢,可配置 Docker 镜像加速器(如阿里云加速器),加快拉取速度。
步骤2:创建数据挂载目录(可选但推荐)
为避免 Docker 容器删除后数据丢失,建议创建宿主机挂载目录,将 FE 的元数据、日志、配置文件挂载到宿主机,后续修改配置、查看日志更便捷:
# 创建挂载目录(自定义路径,建议统一管理)
mkdir -p /data/doris/fe/conf
mkdir -p /data/doris/fe/log
mkdir -p /data/doris/fe/meta
# 赋予目录权限(避免容器内权限不足)
chmod -R 777 /data/doris/fe
步骤3:启动 Doris FE 容器(默认内存配置)
若暂时不修改内存,可直接执行以下命令启动容器(默认 JVM 堆内存 8GB,若服务器内存不足 8GB,会触发本文开头的内存报错):
docker run -d \
--name doris-fe \
--privileged=true \
-p 8030:8030 \
-p 8040:8040 \
-v /data/doris/fe/conf:/opt/apache-doris/fe/conf \
-v /data/doris/fe/log:/opt/apache-doris/fe/log \
-v /data/doris/fe/meta:/opt/apache-doris/fe/meta \
apachedoris/doris-fe
命令说明:
-d:后台运行容器;--name doris-fe:给容器命名,便于后续操作;--privileged=true:赋予容器特权,避免权限不足问题;-p:映射宿主机端口与容器端口(8030 用于 thrift 通信,8040 用于 Web 管理);-v:挂载宿主机目录到容器,实现数据持久化。
启动后,执行 docker ps 查看容器状态,若 STATUS 为 Up,则说明启动成功(若启动失败,大概率是内存不足,后续将重点解决)。
步骤4:验证 FE 启动成功
有两种验证方式,任选其一即可:
- 查看容器日志:
docker logs -f doris-fe,若出现start fe success,则启动成功; - 访问 Web 管理界面:浏览器输入
http://宿主机IP:8040,默认账号 root,密码为空,能成功登录即正常。
三、核心操作:Docker 环境下修改 Doris FE 内存大小
Doris FE 的内存配置由 JVM 堆内存决定,默认配置为 8GB(-Xmx8g -Xms8g),若服务器内存不足(如 8核16G 及以下),需修改内存大小,避免启动报错。以下提供两种修改方式,按需选择。
方式1:挂载配置文件修改(推荐,永久生效)
适合已创建挂载目录的场景,直接修改宿主机挂载的 fe.conf 文件,无需进入容器,修改后重启容器即可生效。
- 编辑宿主机挂载的 fe.conf 配置文件:
- 找到
JAVA_OPTS配置项(默认在文件顶部),修改-Xmx(最大堆内存)和-Xms(初始堆内存)的值,两者建议设为相同,避免动态扩容消耗资源: - 8核16G 服务器(单 FE 节点,测试/小型集群):
JAVA_OPTS="-Xmx4g -Xms4g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:+UseG1GC" - 16核32G 服务器(单 FE 节点,中型集群):
JAVA_OPTS="-Xmx8g -Xms8g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:+UseG1GC" - 32核64G 服务器(主 FE 节点,大型集群):
JAVA_OPTS="-Xmx16g -Xms16g -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=2048m -XX:+UseG1GC" - 保存文件并退出,重启 Doris FE 容器,使配置生效:
方式2:进入容器修改(临时生效,容器删除后失效)
适合未创建挂载目录、临时测试的场景,直接进入容器内部修改配置文件,修改后重启 FE 服务即可。
- 进入 Doris FE 容器:
- 进入 FE 配置文件目录,编辑 fe.conf:
- 同方式1,修改
JAVA_OPTS中的内存参数,保存并退出; - 重启 Doris FE 服务(容器内操作):
- 验证修改生效:查看 JVM 进程,确认内存配置已更新:
补充:Docker 容器内存限制(可选)
除了修改 FE 自身的 JVM 内存,还可通过 Docker 命令限制容器的最大内存使用,避免容器占用过多宿主机内存,影响其他服务。使用 -m/--memory 参数即可,示例如下:
# 启动容器时限制内存为 8GB(需与 FE 的 JVM 内存匹配,建议容器内存 ≥ JVM 堆内存 + 2GB)
docker run -d \
--name doris-fe \
--privileged=true \
-p 8030:8030 \
-p 8040:8040 \
-v /data/doris/fe/conf:/opt/apache-doris/fe/conf \
-v /data/doris/fe/log:/opt/apache-doris/fe/log \
-v /data/doris/fe/meta:/opt/apache-doris/fe/meta \
-m 8g \
apachedoris/doris-fe
说明:若使用 Ubuntu 系统,需先启用 Docker 内存限制功能,修改 /etc/default/grub 文件,添加内核参数后重启服务器,否则 -m 参数无效:
# 编辑 grub 配置文件
vim /etc/default/grub
# 修改 GRUB_CMDLINE_LINUX 配置,添加内存限制参数
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
# 更新 grub 并重启服务器
sudo update-grub
sudo reboot
四、常见问题:Docker 部署 FE 内存报错(errno=12)完整解决
若启动容器时出现本文开头的内存报错(os::commit_memory failed; error='Not enough space' (errno=12)),按以下步骤排查解决,优先级从高到低,新手优先执行方案1。
(一)错误核心解析
先拆解报错信息,避免误判:
8589934592对应 8GB 内存:这是 Doris FE 启动时,JVM 试图向操作系统(或 Docker 容器)提交的内存大小(主要是堆内存);error='Not enough space':并非磁盘空间不足,而是 宿主机可用内存、Docker 容器内存或系统虚拟内存限制过低;errno=12:对应系统错误码ENOMEM,明确表示“没有足够的内存或地址空间供进程使用”。
核心诱因:Doris FE 默认 JVM 堆内存 8GB,若宿主机可用内存不足 8GB,或 Docker 容器内存限制低于 8GB,就会触发该报错。
(二)3步快速排查
- 检查宿主机可用内存:执行
free -h,重点关注available字段(真正可被应用程序使用的内存),要求available ≥ JVM 堆内存 + 2-4GB 预留内存; - 检查 Docker 容器内存限制:执行
docker inspect doris-fe | grep Memory,查看容器最大内存限制,若低于 JVM 堆内存,需调高容器内存; - 检查系统虚拟内存限制:执行
ulimit -v(查看进程虚拟内存上限)和cat /proc/sys/vm/max_map_count(查看 mmap 区域数上限),合格标准:ulimit -v ≥ 8388608 KB(8GB)、vm.max_map_count ≥ 65530。
(三)分步解决方案
方案1:降低 FE 的 JVM 堆内存(最直接、最推荐)
按照本文第三部分“修改 Doris FE 内存大小”的方法,将 JVM 堆内存调整为适配宿主机/容器的大小(如 8核16G 服务器改为 4GB),修改后重启容器即可。
方案2:调高 Docker 容器内存限制
若宿主机内存充足,但容器内存限制过低,可停止容器后,重新启动并增加 -m 参数,示例:
# 停止现有容器
docker stop doris-fe
# 删除现有容器(若需保留数据,挂载目录已持久化,删除容器不影响数据)
docker rm doris-fe
# 重新启动容器,限制内存为 8GB
docker run -d \
--name doris-fe \
--privileged=true \
-p 8030:8030 \
-p 8040:8040 \
-v /data/doris/fe/conf:/opt/apache-doris/fe/conf \
-v /data/doris/fe/log:/opt/apache-doris/fe/log \
-v /data/doris/fe/meta:/opt/apache-doris/fe/meta \
-m 8g \
apachedoris/doris-fe
方案3:调高系统虚拟内存与地址空间限制
若宿主机和容器内存充足,但仍报错,需放开系统内存限制,分临时生效和永久生效两种方式:
- 临时生效(当前会话有效,重启服务器后失效):
- 永久生效(重启服务器后仍有效,生产环境推荐):
方案4:释放宿主机内存(临时应急)
若宿主机内存被其他无关进程占用过多,可临时释放内存(生产环境需避开业务高峰,避免影响其他服务):
# 清理系统缓存(慎用,会清空缓存,短期可能影响读取性能)
sync && echo 3 > /proc/sys/vm/drop_caches
# 查看占用内存最高的进程
top -o %mem
# 杀死无关高内存进程(替换 <PID> 为实际进程ID)
kill -9 <PID>
方案5:关闭 Swap(Doris 官方推荐)
Swap 分区会将内存数据交换到磁盘,导致 Doris FE 运行卡顿,甚至间接引发内存申请失败,建议关闭:
# 临时关闭 Swap
swapoff -a
# 永久关闭 Swap(注释 /etc/fstab 中的 Swap 配置)
sed -i '/swap/s/^/#/' /etc/fstab
五、生产环境配置建议(避坑指南)
1. 内存配置推荐
结合 Doris 官方建议和实际运维经验,整理不同服务器配置对应的 Docker 容器内存和 FE JVM 内存推荐配置,避免盲目设置:
| 宿主机配置 | Docker 容器内存限制 | FE JVM 配置(JAVA_OPTS) | 适用场景 |
|---|---|---|---|
| 8核16G | 8GB | -Xmx4g -Xms4g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:+UseG1GC | 单 FE 节点,测试/小型集群 |
| 16核32G | 16GB | -Xmx8g -Xms8g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:+UseG1GC | 单 FE 节点,中型集群(10-50节点) |
| 32核64G | 32GB | -Xmx16g -Xms16g -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=2048m -XX:+UseG1GC | 主 FE 节点,大型集群(50+节点) |
| 64核128G | 64GB | -Xmx32g -Xms32g -XX:MetaspaceSize=2048m -XX:MaxMetaspaceSize=4096m -XX:+UseG1GC | 主 FE 节点,超大型集群/高并发场景 |
2. 其他注意事项
- 挂载目录必做:生产环境务必创建宿主机挂载目录,避免容器删除后元数据丢失,同时便于后续配置修改和日志排查;
- 内存匹配原则:Docker 容器内存限制 ≥ FE JVM 堆内存 + 2GB,避免容器内存不足导致 JVM 内存申请失败;
- 集群部署建议:生产环境建议部署 FE 集群(1主2备),主备节点内存配置需一致,避免单节点故障影响集群可用性;
- 日志排查:若启动失败,优先查看容器日志(
docker logs -f doris-fe),若出现OutOfMemoryError,说明 JVM 堆内存设置过低,需适当调高; - 版本选择:建议使用稳定版 Doris FE 镜像,避免使用开发版,减少兼容性问题。
六、总结
Docker 部署 Doris FE 核心是“环境准备 → 镜像拉取 → 容器启动 → 内存适配”,其中最易踩坑的就是内存配置问题——默认 8GB JVM 堆内存易导致报错,解决核心是“根据宿主机/容器内存,调整 JVM 堆内存”。
新手可按以下流程操作:先完成 Docker 环境准备,拉取官方镜像,创建挂载目录启动容器,若出现内存报错,优先降低 JVM 堆内存,再根据需求调整容器内存和系统限制,即可快速解决问题。
生产环境需重点关注内存匹配和数据持久化,结合本文推荐的配置方案,可有效避免内存报错和数据丢失问题,确保 Doris FE 稳定运行。