Windows Docker Doris 容器部署 电脑版发表于:2025/2/28 23:22  >#Windows Docker Doris 容器部署 [TOC] 引言 ------------ tn2>Doris 是一款高性能、分布式、可扩展的分析型数据库,适用于海量数据的存储和分析。 在本文中,我们将详细介绍如何在 Windows 系统上使用 Docker 部署 Doris 容器。 Doris中BE和FE介绍 ------------ ### BE(Backend) tn2>存储与计算执行者:BE是Doris中负责存储数据和执行计算任务的核心组件,每个BE节点都拥有自己的存储设备,会将数据存储在本地磁盘中。 数据存储:BE以列式存储的方式存储数据,能够高效地对列进行压缩和编码,从而节省存储空间并加速数据查询。 任务执行:当FE将查询计划发送给BE后,BE会根据计划解析数据块,执行相应的计算操作(如过滤、排序、聚合等),并将结果返回给FE。 数据副本管理:为了保证数据的可靠性和可用性,Doris会在不同的BE节点上存储数据的多个副本,BE负责维护副本的分布和一致性,确保即使部分节点故障,数据仍然可用。 负载均衡:BE节点之间会进行负载均衡,新插入的数据会根据一定的规则均匀地分布到各个BE节点上,避免某些节点负载过高。 ### FE(Frontend) tn2>集群管理与协调者:FE是Doris的管理入口,负责集群的元数据管理、查询计划的生成和任务调度等工作。 元数据管理:FE存储了整个Doris集群的元数据信息,包括数据库、表、列的结构定义、数据分布、副本位置等。它通过心跳机制与BE节点保持通信,实时监控BE的状态和数据分布情况,确保元数据的准确性和一致性。 查询处理:FE接收用户提交的查询请求,对其进行解析和优化,生成高效的查询计划,并将计划发送给相应的BE节点执行。在查询过程中,FE会协调多个BE节点之间的数据传输和计算任务,最终将合并后的结果返回给用户。 用户交互接口:FE为用户提供了一套统一的接口,用户可以通过MySQL客户端、JDBC等工具连接到FE,进行数据库操作和数据查询。 系统管理任务:FE还承担了系统管理的职责,如创建和删除表、设置集群参数、监控集群状态等,它是用户和Doris集群之间的桥梁。 准备工作 ------------ tn2>需要前提安装好Docker。 然后下载好我们需要的镜像。 ```bash docker pull docker.1ms.run/selectdb/doris.fe-ubuntu:2.1.7 docker pull docker.1ms.run/selectdb/doris.be-ubuntu:2.1.7 ``` 安装Doris ------------ tn2>创建一个自定义桥接网络,供 Doris 的 FE 和 BE 容器使用 `--driver bridge`:指定网络驱动为桥接模式,这是 Docker 中最常用的网络驱动 `--subnet`:172.20.80.0/24:指定网络的子网范围 `doris-network`:指定网络名称,便于后续引用 ```bash docker network create --driver bridge --subnet=172.20.80.0/24 doris-network ``` tn2>启动 FE(Frontend)容器 `-itd`:以交互模式、启动后在后台运行容器 `--privileged`:以特权模式运行容器,允许容器访问宿主机的某些关键资源和功能 `--name=fe-01`:指定容器名称为 fe-01 `--env FE_SERVERS="fe1:172.20.80.2:9010"`:设置环境变量 FE_SERVERS,指定 FE 的地址 `--env FE_ID=1`:设置环境变量 FE_ID,指定 FE 的唯一标识 `-p 8030:8030 -p 9030:9030`:将容器的 8030 和 9030 端口映射到宿主机的相同端口 `--network=doris-network`:将容器连接到之前创建的 doris-network 网络 `--ip=172.20.80.2`:指定容器在 doris-network 中的 IP 地址 ```bash docker run -itd --privileged --name=fe-01 --env FE_SERVERS="fe1:172.20.80.2:9010" --env FE_ID=1 -p 8030:8030 -p 9030:9030 --network=doris-network --ip=172.20.80.2 docker.1ms.run/selectdb/doris.fe-ubuntu:2.1.7 ``` tn2>启动 BE(Backend)容器 `-itd`:以交互模式、启动后在后台运行容器 `--privileged`:以特权模式运行容器,允许容器访问宿主机的某些关键资源和功能 `--name=be-02`:指定容器名称为 be-02 `--env FE_SERVERS="fe1:172.20.80.2:9010"`:设置环境变量 FE_SERVERS,指定 FE 的地址 `--env BE_ADDR="172.20.80.6:9050"`:设置环境变量 BE_ADDR,指定 BE 的地址 `-p 8040:8040`:将容器的 8040 端口映射到宿主机的相同端口 `--network=doris-network`:将容器连接到之前创建的 doris-network 网络 `--ip=172.20.80.6`:指定容器在 doris-network 中的 IP 地址 ```bash docker run -itd --privileged --name=be-02 --env FE_SERVERS="fe1:172.20.80.2:9010" --env BE_ADDR="172.20.80.6:9050" -p 8040:8040 --network=doris-network --ip=172.20.80.6 docker.1ms.run/selectdb/doris.be-ubuntu:2.1.7 ``` tn2>然后我们进入fe容器,登录mysql。 ```bash docker exec -it fe-01 /bin/bash mysql -h 127.0.0.1 -P9030 -uroot ```  tn2>添加be节点 ```bash ALTER SYSTEM ADD BACKEND "172.20.80.6:9050"; ``` tn2>然后我们可以查看be节点。 ```bash SHOW BACKENDS; ```  tn2>除此之外我们还可以删除节点但是这里我们就不执行了。 ```bash ALTER SYSTEM DROPP BACKEND "172.20.80.5:9050"; ``` tn2>然后我们登录到Doris验证一下的<a href="http://127.0.0.1:8030/login">Dashboard</a> ,账号是`root`没有密码直接登录。  tn2>登录后点击`Session`一栏。  其他 ------------ ### vm.max_map_count问题 tn2>第二天启动的时候报错be:`sysctl -w vm.max_map_count=2000000` 原因是`vm.max_map_count`参数的默认值通常较小,可能无法满足Doris容器的需求。当Doris容器启动时,如果内核参数 `vm.max_map_count`的值过小,会导致容器启动失败或运行异常。 首先打开cmd执行下面的操作: ```bash wsl --list wsl -d docker-desktop # 设置vm.max_map_count为200万 sysctl -w vm.max_map_count=2000000 # 查看vm.max_map_count sysctl vm.max_map_count ```  tn2>也可以在`C:\Users\bob.he`下面创建`.wslconfig`配置文件添加相关的配置 ```bash [wsl2] kernelCommandLine = "sysctl.vm.max_map_count=2000000" ``` tn2>然后复制be里面的配置 ```bash docker cp be-02:/etc/sysctl.conf "C:/sysctl.conf" ``` tn2>在空白处添加上`vm.max_map_count=2000000`的配置,在空白处添加,然后复制进去。  ```bash docker cp "C:/sysctl.conf" be-02:/etc/sysctl.conf ``` tn2>然后重新启动容器`be-02`,如果还不行就执行下面的命令动作要快。 ```bash docker exec -u root -it be-02 /bin/bash sysctl -w vm.max_map_count=2000000 sysctl vm.max_map_count exit ``` tn2>应该就生效了。 ### Please disable swap memory before installation问题 tn2>然后又报错,这是由于swap导致的,只要我们关闭swap就可以了。 ```bash docker exec -u root -it be-02 /bin/bash swapoff -a ``` tn2>然后就可以了。 永久关闭方法如下: ```bash sed -ri 's/.*swap.*/#&/' /etc/fstab ``` ### 脚本 tn2>每次启动`be-02`好像都需要wsl设置`max_map_count`为`2000000`,不管怎么配置好像都不行所以我写了个`start.ps1`启动脚本. ```bash wsl -d docker-desktop -e /bin/sh -c "sysctl -w vm.max_map_count=2000000" docker start fe-01 docker start be-02 # 等待 1 秒 Start-Sleep -Seconds 1 # 进入指定的 Docker 容器 docker exec -u root -it be-02 /bin/bash -c "sysctl -w vm.max_map_count=2000000 && sysctl vm.max_map_count && swapoff -a" exit ``` tn2>在运行脚本之前,临时调整 PowerShell 的执行策略: 首先以管理员身份打开 PowerShell 。 运行以下命令: ```bash Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process # 选A ``` 然后运行你的脚本: ```bash powershell.exe D:\Doris\start.ps1 ```