NetXMS 7.0.1 Docker Compose 部署指南

使用 Docker Compose 部署 NetXMS 7.0.1 完整监控栈:db/init/server/agent/web 五服务编排、nxdbmgr 数据库初始化(含 213 张表验证)、Web 控制台首次登录、数据持久化与备份、等价 docker run、JVM 堆限制实测与升级排障实录。

NetXMSNetXMS自托管监控2026/11/01

NetXMS 7.0.1 Docker Compose 部署指南

目标:使用 Docker Compose 一键部署 NetXMS 7.0.1 完整监控栈(服务端 netxmsd、Web 控制台、监控代理 nxagentd、PostgreSQL 数据库与一次性数据库初始化任务共五个服务),覆盖数据库初始化、Web 控制台首次登录、数据持久化、JVM 堆限制、升级与排障全流程。全部步骤与回显均来自 Ubuntu 22.04 实测环境。

组件定位与技术背景见 《NetXMS 介绍与选型指南》,本文专注落地部署。

一、环境信息与版本选型

1.1 实测环境

项目值
操作系统Ubuntu 22.04.5 LTS(x86_64)
Docker Engine27.x(含 Compose v2 插件)
NetXMS 版本7.0.1(构建号 7.0-824-g44d7a0dfb5,2026-10-30 发布)
数据库PostgreSQL 17
部署目录/opt/data/quzuo/tmp/netxms/stack
服务端监听端口宿主机 4701 → NXCP 4701(客户端连接端口)
Web 控制台端口宿主机 8137 → HTTPS 8443
管理账号admin / q1w2e3r4(初始化时由 -p 参数设定)

1.2 版本选型

镜像标签对应版本说明
ghcr.io/netxms/server:7.0.1NetXMS 7.0.1当前最新稳定版(7.0 系列首个补丁版)
ghcr.io/netxms/server:7.0.0NetXMS 7.0.07.0 大版本首发版
ghcr.io/netxms/server:6.2.6NetXMS 6.2.66.2 系列维护版,供暂不上 7.0 的环境过渡

版本信息于 2026-11-01 经 GitHub Releases 实查确认;三版要点与 7.0 系列新特性(热备 HA、NETCONF、Syslog over TLS、AI Operators 等)的完整梳理见 《NetXMS 介绍与选型指南》第二章。本文锁定 7.0.1。

1.3 镜像清单与体积

部署共需 4 个镜像,实测体积如下(docker images 回显):

镜像体积职责
ghcr.io/netxms/server:7.0.1311MB监控服务端 netxmsd + 命令行工具集(nxdbmgr/nxget/nxadm 等)
ghcr.io/netxms/agent:7.0.1193MB监控代理 nxagentd
ghcr.io/netxms/web:7.0.1796MBWeb 控制台(Jetty 托管 Java 应用)
postgres:17646MB指标/事件/对象数据存储

关键差异:server 镜像内含全套 CLI 工具,排障时可直接进容器执行;web 镜像体积最大,因为内嵌了 Jetty 与 JDK。

二、前置条件

  • 已安装 Docker Engine 与 Compose v2 插件:
docker --version && docker compose version
  • 已规划部署目录与数据盘(本文使用 /opt/data/quzuo/tmp/netxms/stack,生产建议放到独立数据盘);
  • 宿主机 4701 与 8137 端口未被占用(验证:ss -lntp | grep -E '4701|8137' 应无输出);
  • 镜像来自 GitHub 容器仓库 ghcr.io,境内网络拉取缓慢时可配置 Docker 代理(/etc/systemd/system/docker.service.d/http-proxy.conf 设置 HTTPS_PROXY=http://<代理地址> 后重启 docker),或先在有网络的机器 docker pull 后 docker save/docker load 搬运。

三、部署文件与目录结构

3.1 目录规划

/opt/data/quzuo/tmp/netxms/stack/
├── compose.yaml          # 五服务编排
├── conf/
│   ├── netxmsd.conf      # 服务端配置(数据库连接在此)
│   └── nxagentd.conf     # 代理配置
└── data/                 # 持久化数据(部署后自动生成)
    ├── db/               # PostgreSQL 数据目录
    ├── server/           # 服务端运行数据(服务器密钥 .server_key 等)
    └── agent/            # 代理本地数据

说明:data/server 目录承载服务端的服务器密钥(.server_key)等本机数据,务必持久化——密钥丢失会导致历史加密数据与代理会话失效。

3.2 服务端配置 netxmsd.conf

保存为 conf/netxmsd.conf:

## Logging
LogFile={stdout}

## Database configuration - PostgreSQL
DBDriver=pgsql.ddr
DBServer=db
DBName=netxms
DBLogin=netxms
DBPassword=q1w2e3r4
DebugLevel=5

逐项说明:

配置项含义备注
LogFile={stdout}日志输出到标准输出容器化部署的标准做法,日志由 docker logs 收集
DBDriver=pgsql.ddr数据库驱动PostgreSQL 对应 pgsql.ddr;另有 mysql.ddr/mssql.ddr 等
DBServer=db数据库主机Compose 网络内的服务名,等价于真实部署中的数据库 IP/主机名
DBName=netxms数据库名与 db 服务的 POSTGRES_DB 环境变量一致
DBLogin / DBPassword数据库账号与 db 服务的 POSTGRES_USER/POSTGRES_PASSWORD 一致
DebugLevel=5调试级别 0–9生产建议 0–3,5 便于首次部署排障

3.3 代理配置 nxagentd.conf

保存为 conf/nxagentd.conf:

[CORE]
# 允许来自监控服务器网段的连接(full access)
MasterServers=10.89.63.0/24

### Logging
LogFile={stdout}
#DebugLevel=0

SubAgent=filemgr

逐项说明:MasterServers 指定允许连接本代理的管理服务器地址/网段(代理侧访问控制,0.0.0.0/0 表示不限但仅限实验环境);LogFile={stdout} 同服务端;SubAgent=filemgr 加载文件管理子代理(提供远程文件浏览等扩展指标)——注意该模块在官方 agent 镜像中未随附,首启会产生一条加载失败日志,排障实录见第九章 9.2 节;生产部署时应按实际需要保留或删除此行。

3.4 Compose 编排文件

保存为 compose.yaml:

name: netxms-701-stack

services:
  db:
    image: postgres:17
    container_name: netxms-7.0.1-db
    restart: unless-stopped
    environment:
      POSTGRES_USER: netxms
      POSTGRES_PASSWORD: q1w2e3r4
      POSTGRES_DB: netxms
    volumes:
      - ./data/db:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U netxms"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - netxms-net

  # 一次性初始化任务:库未初始化时执行 nxdbmgr init(-p 指定 admin 初始密码)
  init:
    image: ghcr.io/netxms/server:7.0.1
    container_name: netxms-7.0.1-init
    depends_on:
      db:
        condition: service_healthy
    volumes:
      - ./conf/netxmsd.conf:/etc/netxmsd.conf
    entrypoint: ["/bin/sh", "-c", "nxdbmgr -q get DBLockStatus >/dev/null 2>&1; rc=$$?; if [ \"$$rc\" -ne 0 ]; then echo \"DB not initialized (rc=$$rc), running init...\"; nxdbmgr -p q1w2e3r4 init pgsql; else echo \"DB already initialized (rc=$$rc)\"; fi"]
    networks:
      - netxms-net

  server:
    image: ghcr.io/netxms/server:7.0.1
    container_name: netxms-7.0.1-server
    hostname: server
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
      init:
        condition: service_completed_successfully
    volumes:
      - ./conf/netxmsd.conf:/etc/netxmsd.conf
      - ./data/server:/var/lib/netxms
    ports:
      - "4701:4701"
    networks:
      - netxms-net

  agent:
    image: ghcr.io/netxms/agent:7.0.1
    container_name: netxms-7.0.1-agent
    hostname: agent
    restart: unless-stopped
    depends_on:
      - server
    volumes:
      - ./conf/nxagentd.conf:/etc/nxagentd.conf
      - ./data/agent:/var/lib/netxms
    networks:
      - netxms-net

  web:
    image: ghcr.io/netxms/web:7.0.1
    container_name: netxms-7.0.1-web
    restart: unless-stopped
    depends_on:
      - server
    environment:
      KEYSTORE_PASSWORD: "changeit"
      JAVA_OPTIONS: "-Xms256m -Xmx512m"
    command:
      - /bin/sh
      - -c
      - |
        touch $${JETTY_BASE}/jetty-ssl.properties
        echo "jetty.sslContext.keyStorePassword=$${KEYSTORE_PASSWORD:-changeit}" > $${JETTY_BASE}/jetty-ssl.properties
        echo "jetty.ssl.sniRequired=false" >> $${JETTY_BASE}/jetty-ssl.properties
        echo "jetty.ssl.sniHostCheck=false" >> $${JETTY_BASE}/jetty-ssl.properties
        exec java $$JAVA_OPTIONS -jar $${JETTY_HOME}/start.jar $${JETTY_BASE}/jetty-ssl.properties
    ports:
      - "8137:8443"
    networks:
      - netxms-net

networks:
  netxms-net:
    driver: bridge
    ipam:
      config:
        - subnet: 10.89.63.0/24

编排要点逐项解读:

服务关键设计
db带健康检查(pg_isready),后续服务按 condition: service_healthy 等待数据库真正可用
init一次性任务:先用 nxdbmgr -q get DBLockStatus 探测库是否已初始化,未初始化才执行 nxdbmgr -p q1w2e3r4 init pgsql;-p 参数同时设定控制台管理账号 admin 的初始密码
server依赖 init 成功完成(service_completed_successfully)才启动,保证启动时库表已就绪;对宿主机暴露 NXCP 端口 4701
agent通过 Compose 网络内部 DNS 名连接服务端,不额外暴露端口(服务端经 NXCP 主动连接代理 4700)
web覆盖默认启动命令生成 Jetty SSL 配置后启动;JAVA_OPTIONS 显式限制 JVM 堆 256–512MB;宿主机 8137 映射容器 8443
网络固定子网 10.89.63.0/24,与代理配置的 MasterServers 网段对应

💡 技术拓展:Compose 依赖等待条件有三种——service_started(容器启动即算,最弱)、service_healthy(健康检查通过,适合数据库类服务)、service_completed_successfully(依赖的任务容器以 0 退出,适合一次性初始化任务)。NetXMS 部署同时用到后两种:db 用 healthcheck 保证"库进程可受理连接",init 用 completed 保证"库表结构已建好",二者缺一都可能让 server 在启动阶段报数据库错误。

四、部署步骤(从零到可用)

4.1 创建目录与配置文件

mkdir -p /opt/data/quzuo/tmp/netxms/stack/conf
cd /opt/data/quzuo/tmp/netxms/stack

随后按 3.2/3.3/3.4 节内容落盘三个文件(netxmsd.conf、nxagentd.conf、compose.yaml)。

4.2 拉取镜像

docker compose pull

实测回显(镜像已存在时校验即完成):

 Image ghcr.io/netxms/web:7.0.1 Pulling
 Image postgres:17 Pulling
 Image ghcr.io/netxms/server:7.0.1 Pulling
 Image ghcr.io/netxms/agent:7.0.1 Pulling
 Image postgres:17 Pulled
 Image ghcr.io/netxms/web:7.0.1 Pulled
 Image ghcr.io/netxms/agent:7.0.1 Pulled
 Image ghcr.io/netxms/server:7.0.1 Pulled

4.3 一键启动

docker compose up -d

Compose 会自动按依赖顺序执行:db 启动并过健康检查 → init 建库表后退出 → server/agent/web 启动。首次启动到服务端就绪约需 30–60 秒。

4.4 确认初始化结果

init 服务是幂等设计:库未初始化时执行 nxdbmgr init,已初始化时直接跳过。重复执行 docker compose up -d 不会破坏既有数据,实测日志:

docker logs netxms-7.0.1-init
DB already initialized (rc=0)
DB already initialized (rc=0)
DB already initialized (rc=0)

(回显为多次重启栈时的累积日志,每次启动 init 都会探测一遍。)

如需手工执行一次全新初始化(如换库重建),先创建空数据库,再对它执行 init,实测全程回显如下:

docker exec netxms-7.0.1-db psql -U netxms -c "CREATE DATABASE netxms_init_test;"
CREATE DATABASE
docker exec netxms-7.0.1-server nxdbmgr -c /tmp/init_test_netxmsd.conf -p q1w2e3r4 init pgsql
NetXMS Database Manager Version 7.0.1 Build 7.0-824-g44d7a0dfb5

Initializing database...
Database initialized successfully

(/tmp/init_test_netxmsd.conf 是指向新建空库的临时配置文件,内容与 3.2 节相同、仅 DBName 改为目标库名;经 docker cp 放入后用 -c 指定,用完即删。)

init 成功后验证建表数量(7.0.1 全新库在 public 模式下建 213 张表):

docker exec netxms-7.0.1-db psql -U netxms -d netxms_init_test -t -c "SELECT count(*) FROM information_schema.tables WHERE table_schema='public';"
   213

⚠️ nxdbmgr init 只能对空库执行;对已初始化的库重复执行会被拒绝。-p q1w2e3r4 指定控制台管理账号 admin 的初始密码,不指定时随机生成并在输出中提示——务必记录。

4.5 启动状态验证

docker compose ps

实测回显:

NAME                  IMAGE                         COMMAND                  SERVICE   CREATED             STATUS                       PORTS
netxms-7.0.1-agent      ghcr.io/netxms/agent:7.0.1    "/usr/bin/nxagentd -…"   agent     About an hour ago   Up 51 minutes                162/udp, 514/udp, 4700/tcp
netxms-7.0.1-db         postgres:17                   "docker-entrypoint.s…"   db        About an hour ago   Up About an hour (healthy)   5432/tcp
netxms-7.0.1-server     ghcr.io/netxms/server:7.0.1   "/usr/bin/netxmsd -c…"   server    About an hour ago   Up 55 minutes                0.0.0.0:4701->4701/tcp, [::]:4701->4701/tcp, 4703/tcp
netxms-7.0.1-web        ghcr.io/netxms/web:7.0.1      "/docker-entrypoint.…"   web       About an hour ago   Up About an hour             8080/tcp, 0.0.0.0:8137->8443/tcp, [::]:8137->8443/tcp

服务端就绪判定看日志中的数据库驱动加载与锁定记录:

docker logs netxms-7.0.1-server 2>&1 | grep -E 'Database driver|Database lock'
2026.11.01 06:58:40.252 *I* [db.drv             ] Database driver "pgsql.ddr" loaded and initialized successfully
2026.11.01 06:58:40.313 *D* [db.cpool           ] Database Connection Pool initialized
2026.11.01 06:58:40.831 *D* [db.lock            ] Database lock set

4.6 Web 控制台首次登录

浏览器访问 https://<宿主机IP>:8137/(自签名证书,需确认安全例外)。命令行验证入口路由:

curl -k -sL -o /dev/null -w 'FINAL %{url_effective} HTTP %{http_code}\n' https://localhost:8137/
FINAL https://localhost:8137/nxmc-light.app HTTP 200

根路径返回 302 并最终落到 Web 控制台应用入口 /nxmc-light.app(HTTP 200 即为就绪)。首次登录使用初始化时设定的管理员账号:

  • 用户名:admin
  • 密码:q1w2e3r4

登录后第一件事建议修改 admin 密码(控制台右上角用户菜单 → Change password),并按需创建分级运维账号。

⚠️ 若需程序化接入,控制台登录之外另有 WebAPI 令牌机制(服务端配置 WebAPI.AuthTokenMaxLifetime 默认 86400 秒控制令牌最长有效期),令牌经控制台用户菜单生成。

4.7 代理接入验证

栈内 agent 启动后会自动出现在服务端对象树(Default 区域 → node "agent")。从 server 侧对 agent 做一次指标读取以验证 NXCP 通道(agent 为 Compose 网络内服务名):

docker exec netxms-7.0.1-server nxget agent Agent.Version
7.0.1
docker exec netxms-7.0.1-server nxget agent System.Uptime
20502

返回版本号与运行秒数即证明服务端 ↔ 代理链路正常。nxget 的完整参数说明与常用指标清单见本专栏 CLI 命令篇。

五、数据持久化与备份

持久化目录容器内路径内容备份方式
./data/db/var/lib/postgresql/data全部监控数据pg_dump -U netxms netxms > netxms_$(date +%F).sql
./data/server/var/lib/netxms服务器密钥等目录级拷贝
./data/agent/var/lib/netxms代理本地数据目录级拷贝

数据库逻辑备份示例(在 db 服务上执行):

docker exec netxms-7.0.1-db pg_dump -U netxms netxms > /opt/data/quzuo/tmp/netxms/netxms_backup.sql

官方还提供跨库迁移格式:nxdbmgr export <file> 导出全部配置与数据、nxdbmgr import <file> 恢复(可加 -s 跳过采集数据只迁配置),适合跨数据库引擎(如 PostgreSQL 迁 MySQL)场景。

六、等价 docker run 方式

不便使用 Compose 时,等价的五步 docker run 如下(需自建网络,效果与 compose.yaml 一致):

docker network create --subnet 10.89.63.0/24 netxms-net
docker run -d --name netxms-7.0.1-db --network netxms-net \
  -e POSTGRES_USER=netxms -e POSTGRES_PASSWORD=q1w2e3r4 -e POSTGRES_DB=netxms \
  -v /opt/data/quzuo/tmp/netxms/stack/data/db:/var/lib/postgresql/data \
  postgres:17
docker run --rm --name netxms-7.0.1-init --network netxms-net \
  -v /opt/data/quzuo/tmp/netxms/stack/conf/netxmsd.conf:/etc/netxmsd.conf \
  ghcr.io/netxms/server:7.0.1 \
  nxdbmgr -p q1w2e3r4 init pgsql
docker run -d --name netxms-7.0.1-server --network netxms-net --hostname server \
  -v /opt/data/quzuo/tmp/netxms/stack/conf/netxmsd.conf:/etc/netxmsd.conf \
  -v /opt/data/quzuo/tmp/netxms/stack/data/server:/var/lib/netxms \
  -p 4701:4701 \
  ghcr.io/netxms/server:7.0.1
docker run -d --name netxms-7.0.1-agent --network netxms-net --hostname agent \
  -v /opt/data/quzuo/tmp/netxms/stack/conf/nxagentd.conf:/etc/nxagentd.conf \
  -v /opt/data/quzuo/tmp/netxms/stack/data/agent:/var/lib/netxms \
  ghcr.io/netxms/agent:7.0.1
docker run -d --name netxms-7.0.1-web --network netxms-net \
  -e KEYSTORE_PASSWORD=changeit -e JAVA_OPTIONS="-Xms256m -Xmx512m" \
  -p 8137:8443 \
  ghcr.io/netxms/web:7.0.1 \
  /bin/sh -c 'touch $JETTY_BASE/jetty-ssl.properties && echo "jetty.sslContext.keyStorePassword=$KEYSTORE_PASSWORD" > $JETTY_BASE/jetty-ssl.properties && echo "jetty.ssl.sniRequired=false" >> $JETTY_BASE/jetty-ssl.properties && echo "jetty.ssl.sniHostCheck=false" >> $JETTY_BASE/jetty-ssl.properties && exec java $JAVA_OPTIONS -jar $JETTY_HOME/start.jar $JETTY_BASE/jetty-ssl.properties'

与 Compose 版差异:docker run 方式没有依赖编排能力,需严格按"db → 等 10 秒健康 → init → server/agent/web"顺序执行;init 用 --rm 即跑即销毁。

七、JVM 堆内存限制

Web 控制台是栈内唯一的 Java 进程。compose.yaml 中通过 JAVA_OPTIONS: "-Xms256m -Xmx512m" 将堆限制在 256–512MB,避免其按容器默认值吃掉过多宿主内存。修改位置即 compose.yaml 的 web 服务 environment.JAVA_OPTIONS(docker run 方式则改 -e JAVA_OPTIONS)。

修改后重启 web 服务并实测生效值:

docker compose up -d web && docker exec netxms-7.0.1-web jps -v
1 start.jar -Djava.io.tmpdir=/tmp/jetty -Xms256m -Xmx512m
100 Jps -Dapplication.home=/usr/lib/jvm/java-25-amazon-corretto -Xms8m -Djdk.module.main=jdk.jcmd

start.jar 进程的参数中出现 -Xms256m -Xmx512m 即验证生效(Jps 行为本次 jps 命令自身)。服务端 netxmsd 与代理 nxagentd 为 C++ 进程,无 JVM 参数。

八、升级与版本管理

升级到新的 7.0.x 补丁版的标准流程(以 7.0.1 → 7.0.2 为例):

  1. 备份数据库(第五章 pg_dump);
  2. 修改 compose.yaml 中 server/agent/web 三个镜像 tag 为目标版本;
  3. 拉取并滚动重建:
docker compose pull && docker compose up -d
  1. 若提示需要数据库结构升级,在 server 镜像内执行一次:
docker run --rm --network netxms-701-stack_netxms-net \
  -v /opt/data/quzuo/tmp/netxms/stack/conf/netxmsd.conf:/etc/netxmsd.conf \
  ghcr.io/netxms/server:7.0.2 nxdbmgr upgrade
  1. 回到第 3 步重启栈,并以 docker exec netxms-7.0.1-server netxmsd -v 确认版本。

回滚与多版本并存:改回旧 tag 重建即可,但数据库结构只能升不能降——跨版本回滚必须恢复升级前的 pg_dump 备份。6.2 → 7.0 属大版本迁移,务必先在测试库验证 nxdbmgr upgrade 输出无错误后再动生产;7.0.1 起升级失败会返回非零退出码,可直接用于自动化流水线判断。

九、排障实录(实测沉淀)

9.1 代理端口被占用导致启动即退出

现象:agent 容器反复重启,日志出现绑定失败(宿主上重复启动了第二个 nxagentd 实例时同样触发):

2026.11.01 07:07:09.887 *E* [subagents          ] Initialization of subagent "FILEMGR" (/usr/lib/x86_64-linux-gnu/netxms/filemgr.nsm) failed
2026.11.01 07:07:09.888 *I* [startup            ] System hardware ID is 01B6CB61198C1584EE20BD17CE6330091A7A4833
2026.11.01 07:07:10.889 *E* [comm               ] Unable to bind IPv4 socket (98 Address already in use)
2026.11.01 07:07:10.889 *E* [sa                 ] Unable to bind socket (98 Address already in use)
2026.11.01 07:07:10.890 *E* [comm               ] Cannot bind at least one socket, terminating agent process

定位:98 Address already in use 表明 4700 端口(NXCP 代理监听口)已被占用——通常是同机残留了另一个 nxagentd 进程(例如旧栈未清理)。处理:确认没有重复实例后重新启动该服务(docker compose up -d --force-recreate agent);裸机部署则 pgrep -a nxagentd 找到残留进程后终止。另注意首行 FILEMGR 子代理加载失败是独立问题,见 9.2。

9.2 子代理模块不存在导致警告

现象:agent 日志首启出现 Initialization of subagent "FILEMGR" (/usr/lib/x86_64-linux-gnu/netxms/filemgr.nsm) failed。

定位:nxagentd.conf 中配置了 SubAgent=filemgr,但官方 agent 镜像未包含 filemgr.nsm 模块文件。该警告不阻断代理运行(仅该子代理功能缺失),但会污染日志。处理:不需要文件管理功能的部署直接删除 nxagentd.conf 中 SubAgent=filemgr 一行后重建 agent 服务;确需该功能时换用包含对应模块的发行包。

9.3 控制台命令行登录报 Authentication failed (server error 61)

现象:从 server 侧进入交互控制台执行命令时全部报 Authentication failed (server error 61: Internal error),实测回显:

=== show objects ===
Authentication failed (server error 61: Internal error)
=== get DBLockStatus ===
Authentication failed (server error 61: Internal error)

定位:该错误在本地管理账号被锁定(多次密码错误触发 IntruderLockout)或凭据状态异常时出现。处理:用数据库管理工具强制解锁账号后恢复正常,实测解锁后同样两条命令均成功:

=== show objects ===
Object ID 1 "Entire Network"
   Class=Network  Status=NORMAL  IsModified=0  IsDeleted=0
   Parents: <>
   Children: <4>
   Last change.........: 01.Nov.2026 06:58:41
=== get DBLockStatus ===
DBLockStatus = 10.89.63.3

解锁操作使用数据库管理工具的 unlock-user 子命令(用法与回显见本专栏 CLI 命令篇)。

9.4 重复 up -d 触发重复初始化的担忧(实为幂等)

现象:担心每次 docker compose up -d 都会重新执行建库破坏数据。

定位与结论:init 服务的入口脚本先探测 DBLockStatus——已初始化的库返回 0,脚本打印 DB already initialized (rc=0) 后直接退出(见 4.4 节实测日志),幂等成立,可放心反复重建栈。

十、卸载与清理

docker compose down             # 停止并删除容器与网络(保留数据目录)
docker compose down -v          # 额外清理命名卷(本文数据在 bind mount,不受影响)
rm -rf /opt/data/quzuo/tmp/netxms/stack/data   # 彻底清除数据(不可恢复,先确认备份)
docker rmi ghcr.io/netxms/server:7.0.1 ghcr.io/netxms/agent:7.0.1 ghcr.io/netxms/web:7.0.1

十一、参考链接