Docker Compose
前置条件
部署前请确认以下条件:
| 前置项 | 说明 |
|---|---|
| 被监控的中间件已就绪 | MongoDB/MySQL/Redis/Kafka/Elasticsearch 等 |
| 中间件账号权限 | 见 部署总览。MongoDB 基础采集需 clusterMonitor;若要用慢查询诊断,还需目标库的 dbAdmin(运维平台会为其开启 profiling),完整示例见 数据源 |
| 资源 | 4C/8G/100G+ 磁盘 |
观测范围:主机资源、上述中间件的运行指标、各微服务日志、MongoDB 慢查询诊断、以及基于这些数据的告警。 不观测 内部的业务数据(工作表内容、用户数据等)。
第 1 步:确定安装位置
不要和管理器的目录混用
私有部署管理器会独占并重写 /data/mingdao/script/ 目录。若将运维平台的 ops.yaml 和数据卷放入该目录,重装或覆盖安装时可能互相影响。
请把运维平台放在独立目录,例如 /data/mingdao/mdis/,再通过 networks 段接入所在的 Docker 网络。这样既能通过服务名访问系统中间件,也能与安装器目录隔离。清理、备份和单独挂载数据盘时仅需操作该目录;同时避免与产品业务库目录混放,降低误删风险。
先确认产品服务所在的网络名(通常是 script_default):
docker network ls
第 2 步:拉取镜像(离线包下载)
docker pull registry.cn-hangzhou.aliyuncs.com/mdpublic/ops-allinone:1.5.7
第 3 步:创建配置文件
mkdir -p /data/mingdao/mdis && cat > /data/mingdao/mdis/ops.yaml <<\EOF
x-ops-image: &ops_image registry.cn-hangzhou.aliyuncs.com/mdpublic/ops-allinone:1.5.7 # 所有服务共用,靠 ROLE 区分角色
x-common-env: &common_env
TZ: "Asia/Shanghai"
ENV_OPS_TOKEN: "your-ops-access-token-change-me" # 访问令牌,首次部署务必修改
# ENV_OPS_SUB_PATH: /mdis # 反代挂子路径时填,直接端口访问则删
# ⚠️ 被监控对象(MySQL/MongoDB/Redis/Kafka/Elasticsearch/主机/
# Flink)不在本文件配置。部署完成后打开「数据源」页添加,
# 或下载 YAML 模板批量导入(导入时会逐条测连接)。详见下方「采集配置从哪里读」。
ENV_PROMETHEUS_SERVER: "http://ops-prometheus:9090"
# 告警子系统(1.4.0)
ENV_OPS_MONGODB_URI: "mongodb://ops-mongo:27017" # 告警自有存储
ENV_MONGODB_COLLECTION_PREFIX: "mdis_"
ENV_ALERT_CRYPTO_KEY: "change-me-to-32-byte-secret" # 凭据加密密钥,务必改随机串
services:
gateway:
image: *ops_image
restart: always
ports:
- "48881:48881"
environment:
<<: *common_env
ROLE: gateway
depends_on:
- ops-prometheus
- ops-grafana
- ops-loki
- ops-tempo
- ops-alloy
- ops-mongo
ops-prometheus:
image: *ops_image
restart: always
volumes:
- ./volume/data/mdis/prometheus/:/data/mdis/prometheus/
environment:
<<: *common_env
ROLE: prometheus
ops-grafana:
image: *ops_image
restart: always
volumes:
- ./volume/data/mdis/grafana/:/data/mdis/grafana/
environment:
<<: *common_env
ROLE: grafana
GF_SECURITY_ALLOW_EMBEDDING: "true"
GF_AUTH_ANONYMOUS_ENABLED: "true"
GF_AUTH_ANONYMOUS_ORG_ROLE: Editor
GF_SECURITY_COOKIE_SAMESITE: lax
GF_USERS_DEFAULT_THEME: light
ops-loki:
image: *ops_image
restart: always
ports:
- "3100:3100" # 供服务侧推送服务日志,与运维平台同机时可删掉这行
volumes:
- ./volume/data/mdis/loki/:/data/mdis/loki/
environment:
ROLE: loki
ENV_LOKI_RETENTION: "720h" # 日志保留时长,默认 30 天
# 日志落对象存储(可选,不填用容器本地文件系统)。endpoint 必须是「本容器网络里能解析到」
# 的地址:自建 MinIO 若不在同一个网络(例如另起的 stack 或部署在宿主机上),要填宿主机 IP +
# 宿主机映射端口,不能写对方的容器名,否则报 no such host。
# MinIO / US3 用 path style(true);腾讯云 COS 只支持 virtual-hosted,必须填 false。
# ENV_S3_ENDPOINT: "http://192.168.1.12:9000"
# ENV_S3_BUCKET: "mdis-loki"
# ENV_S3_ACCESS_KEY: "your-access-key"
# ENV_S3_SECRET_KEY: "your-secret-key"
# ENV_S3_FORCE_PATH_STYLE: "true"
ops-tempo:
image: *ops_image
restart: always
volumes:
- ./volume/data/mdis/tempo/:/data/mdis/tempo/
environment:
ROLE: tempo
ENV_TEMPO_RETENTION: "720h" # 链路数据保留时长,默认 30 天
# 注:单机部署不具备链路追踪能力,此处不配置对象存储;链路 + 对象存储属于集群场景,见 Kubernetes 文档。
ops-alloy:
image: *ops_image
restart: always
ports:
# Alloy 的 OTLP 接收端口。单机部署不产生链路数据(见本页前置条件),
# 这两个端口保留但通常用不上,端口冲突时可直接删掉。
- "4317:4317" # OTLP gRPC
- "4318:4318" # OTLP HTTP
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./volume/data/mdis/alloy/:/data/mdis/alloy/
environment:
ROLE: alloy
ENV_TEMPO_GRPC_URL: "http://ops-tempo:4317"
ENV_PROMETHEUS_REMOTE_WRITE_URL: "http://ops-prometheus:9090/prometheus/server/api/v1/write"
ENV_LOKI_PUSH_URL: "http://ops-loki:3100/loki/api/v1/push"
# 告警子系统自有 MongoDB(1.4.0 新增,存规则/状态/历史/渠道/数据源,与被监控目标解耦)
ops-mongo:
image: *ops_image
restart: always
environment:
ROLE: mongo
volumes:
- ./volume/data/mdis/mongo/:/data/mdis/mongo
agent:
image: *ops_image
restart: always
environment:
<<: *common_env
ROLE: agent
nodeagent:
image: *ops_image
restart: always
volumes:
- /:/host:ro,rslave
network_mode: host
pid: host
environment:
<<: *common_env
ROLE: nodeagent
# 直接复用微服务所在的网络,这样可以用服务名(如 sc)访问被监控的中间件。
# name 填 docker network ls 里微服务网络的实际名字。
networks:
default:
external: true
name: script_default
EOF
第 4 步:启动与访问
docker compose -f /data/mingdao/mdis/ops.yaml up -d # 启动
docker compose -f /data/mingdao/mdis/ops.yaml down # 停止
浏览器访问 http://部署服务器IP:48881,登录 Token 为 ops.yaml 里的 ENV_OPS_TOKEN。
第 5 步:验证
部署完成后建议执行随包提供的端到端回归脚本,确认全链路正常:
pip install playwright && playwright install chromium
python3 mdis_regression.py --base http://<主机IP>:48881 --token <ENV_OPS_TOKEN>
退出码 0 为全部通过。遇到问题优先查看 UI「数据源」页的采集状态列,再查阅 常见问题。
后续接入
登记要监控的对象
统一入口:UI「数据源」页。 ops.yaml 只描述运维平台自身依赖, 不描述要监控谁。
新增数据源、改密码、启停都在数据源页,改完即时生效(30 秒内),无需重启任何容器。
批量接入
批量接入多个实例时,用数据源页右上角的「批量导入」:
- 先「下载 YAML 模板」,里面每类数据源各有一条带注释的示例
- 修改为当前环境的连接地址后上传
- 建议先点「仅校验」——只做格式校验和逐条连接探测,不写入数据
- 确认无误再点「导入」
按「类型 + 名称」幂等:同名条目是更新而不是新建,同一份文件可以反复导入。 更新已有条目时密码留空 = 沿用原密码。连接探测失败不会阻止导入(配置可先保存, 服务稍后再启动),但导入结果会逐条标出异常。
自动化部署可以直接调接口,可不经过页面:
curl -X POST "http://部署服务器IP:48881/api/alert/sources/import" \
-H "Content-Type: application/yaml" \
--data-binary @datasources.yaml
接 入服务日志与链路
- 服务日志 结构化服务日志需要在微服务侧配
ENV_LOKI_URL才会推送到运维平台。 单机部署填http://运维平台主机IP:3100。完整说明见接入服务日志。 - 容器日志:部署后自动采集,无需配置。
- 链路追踪:面向集群部署,单机暂不支持。
还可以做
- Node Exporter:监控这台机器以外的服务器
- 对象存储:让日志不受本机磁盘限制、长期留存
- 功能介绍:资源监控、告警、日志查询、慢查询诊断使用说明