dashdot 6.3.4 Docker Compose 部署指南

用官方 mauricenino/dashdot:6.3.4 镜像与 Docker Compose 部署 dashdot 服务器监控仪表盘:镜像选型、完整挂载与最小挂载两种形态逐步实测、指标同瞬核对、无状态持久化说明、环境变量注入与升级回滚,全部命令带真实回显。

dashdotDockerDocker Compose监控系统监控2026/10/31

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 虚机)
Docker29.9.2(docker version 实测)
Docker Composev5.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

三、前置条件

  1. Docker 与 Compose 就绪:
docker version --format '{{.Server.Version}}'
docker compose version

实测回显:

29.9.2
Docker Compose version v5.6.1
  1. 端口未被占用:确认宿主 8142 空闲(占用时换任一空闲端口,后文同步替换):
ss -ltn | grep 8142

部署前该命令应无输出(无监听者);部署完成后再执行会看到 dashdot 的监听行(见第四节验证步骤)。

  1. 创建部署目录:
mkdir -p /opt/dashdot
  1. 理解并接受权限模型: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_PORT3001服务监听端口
DASHDOT_PAGE_TITLEdash.浏览器标签页标题
DASHDOT_WIDGET_LISTos,cpu,storage,ram,network启用的组件(可加 gpu)
DASHDOT_USE_IMPERIALfalse单位切换为英制(华氏度等)
DASHDOT_ALWAYS_SHOW_PERCENTAGESfalse图表左上角常显百分比
DASHDOT_SHOW_DASH_VERSIONicon_hover版本号展示:bottom_right/icon_hover/none
DASHDOT_ROUTING_PATH/面板挂载子路径(反代子路径场景用)
DASHDOT_ENABLE_CPU_TEMPSfalse开启 CPU 温度采集
DASHDOT_CPU_TEMPS_MODEavg温度取均值 avg 或峰值 max
DASHDOT_USE_NETWORK_INTERFACE未设置手工指定采集的网卡名
DASHDOT_ACCEPT_OOKLA_EULAfalse接受 Ookla EULA,改用新版 speedtest
DASHDOT_SPEED_TEST_INTERVAL240测速间隔(分钟)
DASHDOT_SPEED_TEST_FROM_PATH未设置从本地文件读取测速结果(固定带宽场景)
DASHDOT_DISABLE_INTEGRATIONSfalse关闭集成:CORS 与全部只读 API
DASHDOT_DISABLE_BACKGROUND_STATS_COLLECTIONfalse关闭后台指标采集(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 正常,根路径仍返回页面壳)。反向代理只需把该前缀原样转发。

十二、参考链接

dashdot 6.3.4 Docker Compose 部署指南 - Quzuo