
dhileepbalaji/alertmanagerswarmprom 是 Docker Swarm 监控的启动工具包,集成了 Prometheus、Grafana、cAdvisor、Node Exporter、Alert Manager 和 Unsee,用于实现 Swarm 集群的全面监控。
克隆仓库并部署监控栈:
bash$ git clone https://github.com/dhileepbalaji/swarmprom.git $ cd swarmprom ADMIN_USER=admin \ ADMIN_PASSWORD=admin \ SLACK_URL=https://hooks.slack.com/services/TOKEN \ SLACK_CHANNEL=devops-alerts \ SLACK_USER=alertmanager \ docker stack deploy -c docker-compose.yml mon
0.0.0.0:9323http://<swarm-ip>:9090http://<swarm-ip>:3000http://<swarm-ip>:9093http://<swarm-ip>:9094假设已按照以下指南设置 Traefik:
traefiktraefik-prod 的容器bash$ git clone https://github.com/dhileepbalaji/swarmprom.git $ cd swarmprom
ADMIN_USER 环境变量:bashexport ADMIN_USER=admin
ADMIN_PASSWORD 环境变量:bashexport ADMIN_PASSWORD=changethis
openssl 生成 ADMIN_PASSWORD 的哈希版本(用于 Traefik 的 HTTP 基本认证):bashexport HASHED_PASSWORD=$(openssl passwd -apr1 $ADMIN_PASSWORD)
bashecho $HASHED_PASSWORD
输出示例:
$apr1$89eqM5Ro$CxaFELthUKV21DpI3UTQO.
DOMAIN 环境变量(例如):bashexport DOMAIN=example.com
确保以下子域名指向 Swarm 集群 IP:
grafana.example.comalertmanager.example.comunsee.example.comprometheus.example.com注意:也可使用子域名(如
swarmprom.example.com),确保子域名指向集群 IP 或配置通配符子域名(*)。
traefik-prod):bashexport TRAEFIK_PUBLIC_TAG=traefik-prod
bashexport SLACK_URL=https://hooks.slack.com/services/TOKEN export SLACK_CHANNEL=devops-alerts export SLACK_USER=alertmanager
注意:使用
export声明环境变量后,后续命令可直接使用。
bashdocker stack deploy -c docker-compose.traefik.yml monitoring
测试访问:
https://grafana.example.comhttps://alertmanager.example.comhttps://unsee.example.comhttps://prometheus.example.com访问 http://<swarm-ip>:3000,使用用户名 admin 和密码 admin 登录。可通过 compose 文件或部署时的 ADMIN_USER、ADMIN_PASSWORD 环境变量修改凭据。
swarmprom Grafana 预配置了两个仪表盘和 Prometheus 数据源:
登录后,点击左上角的主页下拉菜单即可查看仪表盘。
URL:http://<swarm-ip>:3000/dashboard/db/docker-swarm-nodes
显示节点资源使用关键指标,支持按节点 ID 筛选:
URL:http://<swarm-ip>:3000/dashboard/db/docker-swarm-services
显示栈和服务资源使用关键指标,支持按节点 ID 筛选:
URL:http://<swarm-ip>:3000/dashboard/db/prometheus
为收集 Swarm 节点指标,需在每个服务器部署 exporters。通过全局服务,Swarm 会在新节点自动启动 cAdvisor、node-exporter 和 dockerd-exporter 实例。Prometheus 可通过 DNS 服务发现访问这些实例。
在与 exporter 服务相同的覆盖网络上运行 Prometheus,可使用 DNS 服务发现:
yamlscrape_configs: - job_name: 'node-exporter' dns_sd_configs: - names: - 'tasks.node-exporter' type: 'A' port: 9100 - job_name: 'cadvisor' dns_sd_configs: - names: - 'tasks.cadvisor' type: 'A' port: 8080 - job_name: 'dockerd-exporter' dns_sd_configs: - names: - 'tasks.dockerd-exporter' type: 'A' port: 9323
Prometheus 执行 DNS 查找时,Docker Swarm 返回每个任务的 IP 列表,从而绕过 Swarm 负载均衡器直接抓取 exporter 实例。
为识别 exporter 所在节点,node-exporter 启动时生成 node-meta.prom 文件,包含节点 ID 和名称:
bash"node_meta{node_id=\"$NODE_ID\", node_name=\"$NODE_NAME\"} 1"
node-exporter 配置示例:
yamlnode-exporter: image: stefanprodan/swarmprom-node-exporter environment: - NODE_ID={{.Node.ID}} volumes: - /etc/hostname:/etc/nodename command: - '-collector.textfile.directory=/etc/node-exporter/'
通过 node_meta 指标,可在 PromQL 查询中关联节点信息。例如,查询节点可用内存:
sum(node_memory_MemAvailable * on(instance) group_left(node_id, node_name) node_meta) by (node_id, node_name)
Prometheus 保留期默认设为 24 小时,可通过 compose 文件或 PROMETHEUS_RETENTION 环境变量修改:
yamlprometheus: image: stefanprodan/swarmprom-prometheus command: - '-storage.tsdb.retention=24h' deploy: resources: limits: memory: 2048M reservations: memory: 1024M
使用主机卷时,可通过放置约束将 Prometheus 固定在特定节点:
yamlprometheus: image: stefanprodan/swarmprom-prometheus volumes: - prometheus:/prometheus deploy: mode: replicated replicas: 1 placement: constraints: - node.labels.monitoring.role == prometheus
swarmprom 包含以下默认告警规则:
节点 CPU 使用率超过 80% 持续 5 分钟时告警:
ALERT node_cpu_usage IF 100 - (avg(irate(node_cpu{mode="idle"}[1m]) * on(instance) group_left(node_name) node_meta * 100) by (node_name)) > 80 FOR 5m LABELS { severity="warning" } ANNOTATIONS { summary = "Swarm 节点 '{{ $labels.node_name }}' CPU 告警", description = "Swarm 节点 {{ $labels.node_name }} CPU 使用率为 {{ humanize $value}}%。", }
节点内存使用率超过 80% 持续 5 分钟时告警:
ALERT node_memory_usage IF sum(((node_memory_MemTotal - node_memory_MemAvailable) / node_memory_MemTotal) * on(instance) group_left(node_name) node_meta * 100) by (node_name) > 80 FOR 5m LABELS { severity="warning" } ANNOTATIONS { summary = "Swarm 节点 '{{ $labels.node_name }}' 内存告警", description = "Swarm 节点 {{ $labels.node_name }} 内存使用率为 {{ humanize $value}}%。", }
节点存储使用率超过 85% 持续 5 分钟时告警:
ALERT node_disk_usage IF ((node_filesystem_size{mountpoint="/rootfs"} - node_filesystem_free{mountpoint="/rootfs"}) * 100 / node_filesystem_size{mountpoint="/rootfs"}) * on(instance) group_left(node_name) node_meta > 85 FOR 5m LABELS { severity="warning" } ANNOTATIONS { summary = "Swarm 节点 '{{ $labels.node_name }}' 磁盘告警", description = "Swarm 节点 {{ $labels.node_name }} 磁盘使用率为 {{ humanize $value}}%。", }
节点存储预计 6 小时内将用尽时告警:
ALERT node_disk_fill_rate_6h IF predict_linear(node_filesystem_free{mountpoint="/rootfs"}[1h], 6*3600) * on(instance) group_left(node_name) node_meta < 0 FOR 1h LABELS { severity="critical" } ANNOTATIONS { summary = "Swarm 节点 '{{ $labels.node_name }}' 磁盘填充告警", description = "Swarm 节点 {{ $labels.node_name }} 磁盘将在 6 小时内填满。", }
可修改 swarm_node 和 swarm_task 文件添加告警规则,重新部署栈即可更新。
Alertmanager 配置 Slack 接收者需通过环境变量设置:
yamlalertmanager: image: stefanprodan/swarmprom-alertmanager environment: - SLACK_URL=${SLACK_URL} - SLACK_CHANNEL=${SLACK_CHANNEL} - SLACK_USER=${SLACK_USER}
Unsee 提供 Alertmanager 告警管理仪表盘,访问 http://<swarm-ip>:9094,使用 admin 凭据登录。
可扩展 swarmprom 以监控 MongoDB、PostgreSQL、Kafka、Redis 等服务,或使用 Prometheus 客户端库埋点自定义应用。
需将服务连接到 mon_net 网络(或让 mon_prometheus 服务连接到应用所在网络),然后通过 JOBS 环境变量添加服务到 Prometheus 配置:
yamlprometheus: image: stefanprodan/swarmprom-prometheus environment: - JOBS=mongo-exporter:9216 kafka-exporter:9216 redis-exporter:9216


探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务