本文面向首次部署的运维人员,说明如何用 Docker Compose 部署 nms-web 前端和 spring-boot-admin 后端。
浏览器
└─ nms-web:9312(Nginx,静态前端)
└─ spring-boot-admin:9311(Spring Boot)
├─ MySQL:3306
└─ Redis:6379
后端使用 MySQL 保存业务数据和 Quartz 调度数据,使用 Redis 保存缓存、验证码等临时数据。生产环境必须为 MySQL 和 Redis 配置持久化存储。
nms-web 与 spring-boot-admin 镜像及版本标签。src/main/resources/db/mtab.sql,并按需执行 Quartz 相关脚本。stop-writes-on-bgsave-error yes,避免持久化失败时继续写入并丢失数据。创建部署目录并准备 .env:
mkdir -p /opt/nms
cd /opt/nms
.env 示例:
# 镜像。使用不可变版本标签,避免生产环境使用 latest。
NMS_WEB_IMAGE=your-registry/nms-web:20260812-1029
NMS_ADMIN_IMAGE=your-registry/spring-boot-admin:20260812-1029
# 对外端口
WEB_PORT=9312
ADMIN_PORT=9311
# 后端运行参数
SPRING_PROFILES_ACTIVE=prod
JAVA_OPTS=-Xms300m -Xmx300m
# MySQL:容器与宿主机均可访问的地址
DB_URL=jdbc:mysql://mysql:3306/nms_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
DB_USERNAME=nms_db
DB_PASSWORD=replace-with-a-strong-password
# Redis:容器与宿主机均可访问的地址
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=replace-with-a-strong-password
REDIS_DATABASE=0
参数说明:
| 参数 | 必填 | 说明 |
|---|---|---|
NMS_WEB_IMAGE | 是 | 前端镜像,固定为明确版本标签。 |
NMS_ADMIN_IMAGE | 是 | 后端镜像,固定为明确版本标签。 |
WEB_PORT | 是 | 前端宿主机端口,容器内固定为 80。 |
ADMIN_PORT | 是 | 后端宿主机端口,容器内固定为 9311。 |
SPRING_PROFILES_ACTIVE | 是 | Spring Profile,生产环境通常为 prod。 |
JAVA_OPTS | 是 | JVM 内存参数,需按宿主机内存调整。 |
DB_URL | 是 | 完整 JDBC URL。时区建议设置为 Asia/Shanghai。 |
DB_USERNAME / DB_PASSWORD | 是 | MySQL 业务账号及密码。 |
REDIS_HOST / REDIS_PORT | 是 | Redis 主机名和端口。Compose 内同网络时主机名可填写 redis。 |
REDIS_PASSWORD | 视配置而定 | Redis 设置密码时必填;无密码 Redis 需从后端启动参数中移除该项。 |
REDIS_DATABASE | 否 | Redis DB 序号,默认 0。 |
不要将 .env 提交到 Git,也不要在镜像 Dockerfile 中固化真实密码。
在 /opt/nms/compose.yaml 创建如下文件。示例假设 MySQL 和 Redis 已在同一 Compose 网络中运行;如果它们在其他主机,请将 DB_URL 和 REDIS_HOST 改为实际可达地址,并移除 depends_on。
services:
nms-web:
image: ${NMS_WEB_IMAGE}
container_name: nms-web
restart: unless-stopped
ports:
- "${WEB_PORT}:80"
environment:
TZ: Asia/Shanghai
depends_on:
spring-boot-admin:
condition: service_started
networks:
- nms
spring-boot-admin:
image: ${NMS_ADMIN_IMAGE}
container_name: spring-boot-admin
restart: unless-stopped
ports:
- "${ADMIN_PORT}:9311"
environment:
TZ: Asia/Shanghai
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE}
SERVER_PORT: 9311
JAVA_OPTS: ${JAVA_OPTS}
DB_URL: ${DB_URL}
DB_USERNAME: ${DB_USERNAME}
DB_PASSWORD: ${DB_PASSWORD}
REDIS_HOST: ${REDIS_HOST}
REDIS_PORT: ${REDIS_PORT}
REDIS_PASSWORD: ${REDIS_PASSWORD}
REDIS_DATABASE: ${REDIS_DATABASE:-0}
networks:
- nms
networks:
nms:
name: nms
启动:
docker compose --env-file .env pull
docker compose --env-file .env up -d
docker compose ps
以下示例适用于独立 Redis 容器。/srv/nms/redis/data 必须真实存在且 Redis 容器用户可写。
redis.conf:
bind 0.0.0.0
protected-mode yes
port 6379
dir /data
dbfilename dump.rdb
save 3600 1
save 300 100
save 60 10000
stop-writes-on-bgsave-error yes
appendonly no
requirepass replace-with-a-strong-password
Compose 服务:
redis:
image: redis:7.2-alpine
container_name: redis
restart: unless-stopped
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
ports:
- "6379:6379"
volumes:
- /srv/nms/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf:ro
- /srv/nms/redis/data:/data
networks:
- nms
docker compose ps
docker logs --tail 100 spring-boot-admin
curl -I http://127.0.0.1:${WEB_PORT}/
预期结果:
nms-web 和 spring-boot-admin 均为 running。HTTP/1.1 200 OK。MISCONF 错误。若部署 Redis,额外验证持久化:
docker exec redis redis-cli -a '<REDIS_PASSWORD>' BGSAVE
docker exec redis redis-cli -a '<REDIS_PASSWORD>' INFO persistence | grep rdb_last_bgsave_status
输出应包含 rdb_last_bgsave_status:ok。
每次构建发布唯一标签,例如 20260812-1136。不要覆盖已发布版本标签;固定标签会使缓存和回滚判断变得困难。
更新 .env 中相应镜像后执行:
docker compose --env-file .env pull nms-web spring-boot-admin
docker compose --env-file .env up -d --no-deps nms-web spring-boot-admin
docker compose ps
仅升级前端:
docker compose --env-file .env pull nms-web
docker compose --env-file .env up -d --no-deps nms-web
升级后用 docker inspect nms-web 或 docker inspect spring-boot-admin 检查 .Config.Image 和 .Image,确认容器实际引用了预期镜像。
保留上一版本标签即可快速回滚。将 .env 中的镜像改回上一版本,然后执行:
docker compose --env-file .env pull
docker compose --env-file .env up -d --no-deps nms-web spring-boot-admin
不要在未验证新版本前删除旧镜像。MySQL 数据库变更必须先评估是否可向后兼容;不可逆迁移需要单独备份和回滚方案。
email:[email protected]
Content type
Image
Digest
sha256:07f7f1f97…
Size
21.2 MB
Last updated
about 7 hours ago
docker pull muziyuyang/nms-web:20261006-1517