dashdot 6.3.4 Docker Compose 部署指南
用官方 mauricenino/dashdot:6.3.4 镜像与 Docker Compose 部署 dashdot 服务器监控仪表盘:镜像选型、完整挂载与最小挂载两种形态逐步实测、指标同瞬核对、无状态持久化说明、环境变量注入与升级回滚,全部命令带真实回显。
dashdot 6.3.4 Docker Compose 部署指南
目标:从零开始在一台 Linux 服务器上用 Docker Compose 部署 dashdot v6.3.4 服务器监控仪表盘,覆盖镜像选型、最小挂载与官方完整挂载两种部署形态的逐步实测、指标与宿主真实值的同瞬核对、持久化说明、环境变量注入、版本升级回滚与常用运维命令。已在 Ubuntu 26.04.1 LTS 服务器(Docker 29.9.2 + Docker Compose v5.6.1)、服务端口 8142、部署目录
/opt/dashdot全流程实测通过。
一、环境信息
本文全部命令与回显来自以下真实环境,逐条实测:
| 项目 | 值 |
|---|---|
| 操作系统 | Ubuntu 26.04.1 LTS(内核 7.0.0-38-generic) |
| 硬件 | Intel i7-14700KF 6 vCPU / 15 GiB 内存 / 300 GiB 虚拟盘(VMware 虚机) |
| Docker | 29.9.2(docker version 实测) |
| Docker Compose | v5.6.1(docker compose version 实测) |
| dashdot 版本 | 6.3.4(mauricenino/dashdot:6.3.4) |
| 服务端口 | 8142(宿主)→ 3001(dashdot 默认监听) |
| 部署目录 | /opt/dashdot |
| 隔离网络 | 自建桥接网段 10.89.64.0/24 |
💡 说明:dashdot 的默认监听端口是 3001(服务进程内写死并通过
DASHDOT_PORT可改),宿主侧选用 8142 仅是本机端口规划,读者可按需替换;替换后记得同步修改本文所有命令与反向代理配置中的端口。
二、镜像选型说明
dashdot 官方只维护一个镜像仓库 mauricenino/dashdot,托管在 Docker Hub(官方 README 指定渠道)。tag 策略与选型建议如下:
| tag | 内容 | 适用 |
|---|---|---|
6.3.4 | 锁定到具体版本(本文实测使用的 tag) | 生产/长期运行推荐,升级可控 |
latest | 跟随最新稳定版滚动 | 想自动跟进新版本的个人实验环境 |
nvidia | 在基础镜像上加入 NVIDIA GPU 采集链路(配合 Dockerfile.nvidia 构建产物) | 需要 GPU 组件时专用,且要在 Compose 中声明 GPU 设备 |
选型要点逐条说明:
- 多架构:官方镜像基于
node:20-alpine构建,Dockerfile 按目标平台区分 amd64 / arm64 / arm/v7,并同时预装各架构的 Ookla speedtest 1.1.1 命令行工具,树莓派等 ARM 设备可直接拉取; - 开箱即用的采集工具链:镜像内已预装
lsblk、mdadm、dmidecode、coreutils、util-linux、lm-sensors、speedtest-cli,宿主机无需为采集补装任何依赖; - 体积与端口:
docker images实测镜像 303MB,仅声明暴露 3001/tcp,无内置健康检查(healthcheck 为空),如需对接编排健康检查要自己定义; - 版本锁定:
latest跟随上游滚动,v6 内有过 BREAKING 变更先例(6.0.0 的测速文件单位口径),生产建议钉住6.3.4这样的具体 tag,升级动作显式化。
本机实测拉取(直连 Docker Hub,未走代理):
docker pull mauricenino/dashdot:6.3.4
回显节选(实测首尾):
6.3.4: Pulling from mauricenino/dashdot
...
c3392bbfec26: Pull complete
75728f36894a: Pull complete
Digest: sha256:434a54d2937411a06b09c50e55709cc7d3b092c0fe173a9e5c986f9b5a33c7c6
Status: Downloaded newer image for mauricenino/dashdot:6.3.4
docker.io/mauricenino/dashdot:6.3.4
三、前置条件
- Docker 与 Compose 就绪:
docker version --format '{{.Server.Version}}'
docker compose version
实测回显:
29.9.2
Docker Compose version v5.6.1
- 端口未被占用:确认宿主 8142 空闲(占用时换任一空闲端口,后文同步替换):
ss -ltn | grep 8142
部署前该命令应无输出(无监听者);部署完成后再执行会看到 dashdot 的监听行(见第四节验证步骤)。
- 创建部署目录:
mkdir -p /opt/dashdot
- 理解并接受权限模型:dashdot 要读宿主的
/proc、块设备布局(lsblk)、内存条信息(dmidecode)、传感器(lm-sensors)和文件系统用量(df),这些操作跨越了常规隔离边界。官方 docker-compose 示例的做法是privileged: true+ 把宿主根目录只读挂载进运行环境(/:/mnt/host:ro)。只读挂载保证了 dashdot 只能看不能写;privileged则是 dmidecode、进入宿主网络命名空间等读取动作的前提。安全敏感的读者可用第八节的最小挂载方案折中——代价是部分组件无数据,本文对两种形态都做了实测。
四、部署步骤
以下为官方完整形态(整盘只读挂载 + 特权)从零到可用面板的全过程,所有命令在 /opt/dashdot 下执行。
4.1 编写 docker-compose.yml
创建 /opt/dashdot/docker-compose.yml:
name: dashdot-6.3.4-stack
services:
dash:
image: mauricenino/dashdot:6.3.4
container_name: dashdot-6.3.4-app
restart: unless-stopped
privileged: true
ports:
- "8142:3001"
volumes:
- /:/mnt/host:ro
networks:
dashdot-net:
ipv4_address: 10.89.64.10
networks:
dashdot-net:
driver: bridge
ipam:
config:
- subnet: 10.89.64.0/24
逐项说明:
name:Compose 项目名,决定网络等资源的命名前缀(本例网络名为dashdot-634-stack_dashdot-net);container_name:固定运行实例名,便于日志与排查命令引用;privileged: true:允许 dmidecode 读内存条信息、读取宿主网络命名空间,官方示例原样配置;ports "8142:3001":宿主 8142 → 服务默认端口 3001;volumes /:/mnt/host:ro:宿主根目录只读挂载,dashdot 从/mnt/host下读取系统版本文件、各挂载点用量、网络命名空间等,ro保证面板对宿主零写入;restart: unless-stopped:开机自启、异常退出自动拉起;networks:显式指定网段,避免与其他部署的网络段冲突(10.89.64.0/24 为本机空闲段,读者可自选未占用网段;不需要固定 IP 时此段可整体删除)。
4.2 启动
cd /opt/dashdot && docker compose up -d
实测回显:
Container dashdot-6.3.4-app Created
Container dashdot-6.3.4-app Starting
Container dashdot-6.3.4-app Started
4.3 查看运行状态
docker compose ps
实测回显:
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
dashdot-6.3.4-app mauricenino/dashdot:6.3.4 "docker-entrypoint.s…" dash 16 minutes ago Up 15 minutes 0.0.0.0:8142->3001/tcp, [::]:8142->3001/tcp
4.4 检查启动日志
docker logs dashdot-6.3.4-app | head -30
实测回显(节选,首尾保留):
Version file not found. This is normal on from-source builds.
listening on *:3001
Using default network interface with no modifications
Bound "/mnt/host/etc/os-release" to "/etc/os-release" and "/usr/lib/os-release"
Using os-release from "/etc/os-release" or "/usr/lib/os-release"
Static Server Info: {
os: {
arch: 'x64',
distro: 'Ubuntu',
kernel: '7.0.0-38-generic',
platform: 'linux',
release: '26.04.1 LTS',
uptime: 134563.38,
dash_version: '6.3.4',
dash_buildhash: '24cc5d61e10f5255a44f85b5b35d333a3b9bc6d8'
},
...(cpu/ram/storage/network/gpu/config 各节略)
}
Running speed-test (this may take a few minutes)...
💡 说明:
Version file not found是 v6 镜像构建期写入版本文件的路径提示,属于正常日志而非错误;日志随后会输出六类组件的静态信息 JSON 与首次动态测量(First measurement [CPU/Storage/Network/RAM/GPU]),是核对采集是否正常的最佳入口。
4.5 验证服务可用
curl -s -o /dev/null -w 'root: %{http_code}\n' http://127.0.0.1:8142/
curl -s http://127.0.0.1:8142/ | grep -oE '<title>[^<]*</title>'
ss -ltn | grep 8142
实测回显:
root: 200
<title>dash.</title>
LISTEN 0 4096 0.0.0.0:8142 0.0.0.0:*
LISTEN 0 4096 [::]:8142 [::]:*
再取一份配置端点确认服务端配置已生效:
curl -s http://127.0.0.1:8142/config | head -c 200
实测回显(节选):
{"config":{"port":3001,"routing_path":"/","running_in_docker":true,"accept_ookla_eula":false,"fs_device_filter":[],"fs_type_filter":["cifs","9p","fuse.rclone","fuse.mergerfs","nfs4","iso9660","fuse.shfs","autofs"],...
浏览器访问 http://<服务器IP>:8142,应看到深色玻璃拟态风格的六卡片仪表盘(OS/CPU/Storage/RAM/Network 五个默认组件 + 可选 GPU)。
⚠️ 注意:首次启动会立即触发一次网络测速(日志
Running speed-test),默认用 speedtest-cli,实测耗时约 29 秒;期间 CPU 与网络图表会有明显波动,属正常现象。不希望跑测速的替代方案见第六节DASHDOT_SPEED_TEST_FROM_PATH。
五、数据持久化说明
dashdot 是无状态服务:不使用数据库、不向磁盘写任何运行数据,全部动态指标保存在进程内存中(每个图表默认约 20 个数据点的滚动窗口),测速结果也只在内存缓存、按周期重测。因此:
- 无需配置任何数据卷:官方 compose 示例中唯一的挂载就是
/:/mnt/host:ro,那是采集用途的只读挂载,不是持久化; - 重启即回到初始状态:重建运行实例后历史图表清零、面板设置(深浅色等)回到默认,属预期行为;
- 升级就是换版本:镜像不可变 + 无落盘状态,意味着升级/回滚没有数据迁移负担(见第十节);
- 想把测速结果固定下来:用
DASHDOT_SPEED_TEST_FROM_PATH指向一个本地 JSON 文件(格式{"unit":"bit","speedDown":150000000,"speedUp":50000000,"publicIp":"..."}),dashdot 改为从文件读取测速结果,不再周期实测;此方式下文件路径要以/mnt/host前缀书写(官方 FAQ 说明),例如DASHDOT_SPEED_TEST_FROM_PATH=/mnt/host/opt/dashdot/speed.json。
六、环境变量表
dashdot 全部配置通过 DASHDOT_ 前缀环境变量注入。部署最常用的变量如下(完整参数逐项详解见本专栏的配置详解篇):
| 变量 | 默认值 | 说明 |
|---|---|---|
DASHDOT_PORT | 3001 | 服务监听端口 |
DASHDOT_PAGE_TITLE | dash. | 浏览器标签页标题 |
DASHDOT_WIDGET_LIST | os,cpu,storage,ram,network | 启用的组件(可加 gpu) |
DASHDOT_USE_IMPERIAL | false | 单位切换为英制(华氏度等) |
DASHDOT_ALWAYS_SHOW_PERCENTAGES | false | 图表左上角常显百分比 |
DASHDOT_SHOW_DASH_VERSION | icon_hover | 版本号展示:bottom_right/icon_hover/none |
DASHDOT_ROUTING_PATH | / | 面板挂载子路径(反代子路径场景用) |
DASHDOT_ENABLE_CPU_TEMPS | false | 开启 CPU 温度采集 |
DASHDOT_CPU_TEMPS_MODE | avg | 温度取均值 avg 或峰值 max |
DASHDOT_USE_NETWORK_INTERFACE | 未设置 | 手工指定采集的网卡名 |
DASHDOT_ACCEPT_OOKLA_EULA | false | 接受 Ookla EULA,改用新版 speedtest |
DASHDOT_SPEED_TEST_INTERVAL | 240 | 测速间隔(分钟) |
DASHDOT_SPEED_TEST_FROM_PATH | 未设置 | 从本地文件读取测速结果(固定带宽场景) |
DASHDOT_DISABLE_INTEGRATIONS | false | 关闭集成:CORS 与全部只读 API |
DASHDOT_DISABLE_BACKGROUND_STATS_COLLECTION | false | 关闭后台指标采集(6.3.0 新增) |
在 Compose 中注入的方式(environment: 段),示例把页面标题、百分比常显与温度峰值模式一起打开:
services:
dash:
# ...其余配置同第四节
environment:
DASHDOT_PAGE_TITLE: "my-lab"
DASHDOT_ALWAYS_SHOW_PERCENTAGES: "true"
DASHDOT_CPU_TEMPS_MODE: "max"
修改后重建生效:
cd /opt/dashdot && docker compose up -d --force-recreate
生效核验走 /config 端点(本例为注入上述变量与 DASHDOT_ROUTING_PATH=/dashdot/、DASHDOT_USE_IMPERIAL=true 后的实测节选,此时面板挂在 /dashdot/ 子路径):
curl -s http://127.0.0.1:8142/dashdot/config | python3 -c "import json,sys; d=json.load(sys.stdin)['config']; print(d['page_title'], d['use_imperial'], d['always_show_percentages'], d['routing_path'])"
实测回显:
my-lab True True /dashdot/
💡 说明:布尔值必须写字符串
"true"/"false";DASHDOT_ROUTING_PATH改动后 API 端点也一并移动(如/dashdot/config),浏览器访问路径同步变为http://<IP>:8142/dashdot/。
七、配置参数说明
第六节覆盖了部署高频参数,dashdot 实际共有 60 余个 DASHDOT_ 变量,按作用域分五组:基础(端口/子路径/组件清单)、展示样式(单位制/百分比/版本号/各组件相对宽度与数据点数)、采集行为(各组件轮询间隔 1000ms、磁盘 60000ms、测速周期 240 分钟)、过滤(DASHDOT_FS_DEVICE_FILTER、DASHDOT_FS_TYPE_FILTER,默认过滤 cifs,9p,fuse.rclone,fuse.mergerfs,nfs4,iso9660,fuse.shfs,autofs 等网络/虚拟文件系统)、覆盖(DASHDOT_OVERRIDE_* 系列,用于 VPS 等读不到硬件信息的场景手工指定 CPU/内存/磁盘/网络/GPU 的品牌型号频率等静态值)。
两个部署期容易踩的生效机制提前说明:
- 覆盖类变量只作用于页面展示:服务端
/info永远返回原始采集值,覆盖在浏览器渲染时套用(如设DASHDOT_OVERRIDE_CPU_FREQUENCY=2.8后/config里override.cpu_frequency=2.8、页面显示 2.8 GHz,而/info仍是采集原值),用/config核验而不是/info; - 页面标题是前端运行时注入:HTML 静态源码里
<title>恒为dash.,DASHDOT_PAGE_TITLE由前端脚本加载后改写,用curl看源码验证不了,需浏览器实际打开确认。
八、配置文件挂载
官方完整形态只挂一个只读根:/:/mnt/host:ro。dashdot 在 /mnt/host 下读取的是:etc/os-release(系统版本)、各挂载点的文件系统用量(df 语义)、proc/1/ns/net(进入宿主网络命名空间读网卡速率与流量)。实测该形态下六类组件数据齐全:内存条识别出 brand: 'Not Specified', type: 'DRAM'(VMware 虚机无品牌属正常)、网卡速率读到真实 1000 Mb/s、存储用量与 df 同瞬核对偏差来源明确(见部署篇排障沉淀)。
若不接受整盘只读挂载,官方 FAQ 给出最小挂载清单替代方案:
| 宿主路径 | 挂载目标 | 作用 |
|---|---|---|
/etc/os-release | /mnt/host/etc/os-release:ro | 读宿主系统版本 |
/proc/1/ns/net | /mnt/host/proc/1/ns/net:ro | 读宿主网络流量与速率 |
/mnt | /mnt/host/mnt:ro | 读挂载在 /mnt 下的磁盘用量 |
/media | /mnt/host/media:ro | 读挂载在 /media 下的磁盘用量 |
最小挂载 compose 片段:
services:
dash:
image: mauricenino/dashdot:6.3.4
container_name: dashdot-6.3.4-app
restart: unless-stopped
ports:
- "8142:3001"
volumes:
- /etc/os-release:/mnt/host/etc/os-release:ro
- /proc/1/ns/net:/mnt/host/proc/1/ns/net:ro
- /mnt:/mnt/host/mnt:ro
- /media:/mnt/host/media:ro
⚠️ 注意:最小挂载方案实测有三处明确代价,读者按需取舍——(1)宿主根分区用量不在扫描范围,存储组件拿不到用量数据(首次测量输出
[-1],页面存储卡片无图表);(2)未加privileged时内存品牌读不到(brand: undefined)、CPU 频率显示 NaN、网络首次测量为null;(3)若宿主磁盘挂载在其他自定义路径,需按/xxx:/mnt/host/xxx:ro模式自行追加(用df查看本机全部挂载点后补齐)。官方仍推荐整盘只读挂载的完整形态。
九、等价 docker run
不使用 Compose 时,第四节完整形态等价于:
docker run -d \
--name dashdot-6.3.4-app \
--restart unless-stopped \
--privileged \
-p 8142:3001 \
-v /:/mnt/host:ro \
mauricenino/dashdot:6.3.4
需要注入环境变量时追加 -e 参数(示例开启温度采集):
docker run -d \
--name dashdot-6.3.4-app \
--restart unless-stopped \
--privileged \
-p 8142:3001 \
-v /:/mnt/host:ro \
-e DASHDOT_ENABLE_CPU_TEMPS="true" \
mauricenino/dashdot:6.3.4
需要 GPU 组件时按官方要求换 nvidia tag 并声明 GPU(完整形态示例):
docker run -d \
--name dashdot-6.3.4-app \
--restart unless-stopped \
--privileged \
--gpus all \
-p 8142:3001 \
-v /:/mnt/host:ro \
-e DASHDOT_WIDGET_LIST="os,cpu,storage,ram,network,gpu" \
mauricenino/dashdot:nvidia
Compose 与裸命令二选一即可,不要并用;生产环境建议 Compose(配置版本化、升级回滚一条命令)。
十、常用运维命令
以下命令均在 /opt/dashdot(compose 项目目录)下执行,全部实测。
docker compose ps # 运行状态
docker logs -f dashdot-6.3.4-app # 跟踪日志(测速、采集错误都在这里)
docker compose restart # 重启进程(图表清零属预期)
docker compose stop # 停止
docker compose start # 再启动
docker compose down # 停止并删除运行实例与网络
docker stats --no-stream dashdot-6.3.4-app # 资源占用
资源占用实测(空闲期,测速已完成):
NAME CPU % MEM USAGE / LIMIT MEM %
dashdot-6.3.4-app 1.60% 33.72MiB / 15.07GiB 0.22%
升级:把 compose 文件中的 tag 换成新版本号(如 6.3.5),然后:
cd /opt/dashdot && docker compose up -d
Compose 检测到镜像变更会自动重新拉取并重建,回显与 4.2 相同;升级无数据迁移(无状态)。
回滚:把 tag 改回旧版本(如 6.3.4)再次 docker compose up -d 即可,旧镜像若已被清理会重新拉取。
版本核对:日志或 /config 都能确认当前版本:
docker logs dashdot-6.3.4-app | grep dash_version
curl -s http://127.0.0.1:8142/config | python3 -c "import json,sys; print(json.load(sys.stdin)['version'])"
实测回显:
dash_version: '6.3.4',
6.3.4
卸载:
cd /opt/dashdot && docker compose down --rmi local
docker rmi mauricenino/dashdot:6.3.4
rm -rf /opt/dashdot
十一、常见问题
Q1:启动后存储卡片没有用量图表?
看启动日志的 First measurement [Storage],若为 [-1] 说明没匹配到任何可用挂载点:完整形态下检查 /:/mnt/host:ro 是否漏配;最小挂载方案下这是已知代价(根分区不在扫描路径),把宿主磁盘实际挂载路径按 /xxx:/mnt/host/xxx:ro 补挂,或改用完整形态。核对宿主挂载点用 df 与 lsblk。
Q2:网络卡片速率显示 10000、流量图表为空?
10000 是读不到真实链路速率时的回退值。完整形态确认 /proc/1/ns/net 挂载存在(整盘挂载天然包含);日志里 Using network interface "xxx" 显示的网卡若不对,用 DASHDOT_USE_NETWORK_INTERFACE 指定真实网卡名(如 ens33),本机实测指定后接口速率正确显示 1000 Mb/s。
Q3:CPU 温度一直显示 0?
温度采集默认关闭(DASHDOT_ENABLE_CPU_TEMPS=false),开启后仍为 0 说明环境里没有可读传感器——虚拟机普遍如此(本机 VMware 虚机实测恒为 0),物理机需确认 lm-sensors 可用(sensors 命令有输出)。温度显示不了不影响其他组件。
Q4:内存品牌显示 undefined / Not Specified?
品牌来自 dmidecode,未提权或虚拟机都会拿不到:未提权时为 undefined,提权后虚拟机常见 Not Specified(本机实测)。介意的可用 DASHDOT_OVERRIDE_RAM_BRAND 手工指定。
Q5:访问 /config、/load/ 返回 404(Cannot GET)?*
DASHDOT_DISABLE_INTEGRATIONS=true 会关闭全部只读 API 与 CORS(本机实测 /config 返回 Cannot GET /config 404、响应头 Access-Control-Allow-Origin: * 消失)。这是该变量的设计行为,需要 API 时删掉该变量重建即可。
Q6:改了 DASHDOT_PAGE_TITLE,浏览器标签还是 dash.?
页面标题由前端脚本运行时改写,HTML 源码里永远是 dash.,用 curl/查看源码验证不了;浏览器实际打开页面看标签页,或用 /config 确认 page_title 已是新值。
Q7:测速值和实际带宽差很多?
默认测速通道是旧版 speedtest-cli(未接受 Ookla EULA),实测一次约 29 秒、结果受当时网络波动影响(本机两次实测下行分别约 164 Mb/s 与 115.6 Mb/s)。要更准可设 DASHDOT_ACCEPT_OOKLA_EULA=true 切换 Ookla speedtest;要固定显示值(如内网环境测不准)用 DASHDOT_SPEED_TEST_FROM_PATH 从文件读结果。
Q8:面板想挂在子路径(如 https://example.com/dashdot/)?
设 DASHDOT_ROUTING_PATH=/dashdot/ 并重建;此时 UI 与 API 都在 /dashdot/ 下(实测 /dashdot/config、/dashdot/load/cpu 正常,根路径仍返回页面壳)。反向代理只需把该前缀原样转发。
十二、参考链接
- 官方部署文档(Docker):https://getdashdot.com/docs/installation/docker (文档源码
apps/docs/content/docs/installation/docker.mdx,查询日期 2026-10-31) - 官方部署文档(Docker Compose):https://getdashdot.com/docs/installation/docker-compose
- 官方 FAQ(最小挂载清单出处):https://getdashdot.com/docs/faq
- 镜像仓库:https://hub.docker.com/r/mauricenino/dashdot
- 站内选型参考:《dashdot 6.3.4 介绍与选型指南》