微服务系统脚本自动化部署方案(离线)
作者:能源恒观
- 2025-09-23 上海
本文字数:4669 字
阅读完需:约 15 分钟

微服务系统脚本自动化部署方案(离线)
这个方案的核心思路是:
准备阶段:在一台有网的机器上拉取所有需要的镜像并保存为 .tar 文件。
传输阶段:将镜像文件和部署脚本打包,复制到目标离线服务器。
部署阶段:在离线服务器上加载镜像,使用 docker-compose 定义和启动所有服务。
第一部分:准备离线镜像包和脚本(在线机器上执行)
首先,创建一个工作目录,例如 offline-deploy。
mkdir offline-deploy && cd offline-deploy
复制代码
1. 镜像拉取脚本 (pull-images.sh)
#!/bin/bash
# pull-images.sh
# 此脚本在具有互联网连接的机器上执行
set -e # 遇到错误立即退出
echo "开始拉取所有需要的 Docker 镜像..."
# 定义需要拉取的镜像版本
MYSQL_IMAGE="mysql:8.0"
REDIS_IMAGE="redis:7-alpine"
TDENGINE_IMAGE="tdengine/tdengine:3.2.0.0"
EMQX_IMAGE="emqx:5.6.1"
NACOS_IMAGE="nacos/nacos-server:v2.3.2"
MINIO_IMAGE="minio/minio:RELEASE.2024-08-23T18-31-37Z"
XXL_JOB_IMAGE="xuxueli/xxl-job-admin:2.4.1"
# 拉取所有镜像
echo "拉取 MySQL..."
docker pull $MYSQL_IMAGE
echo "拉取 Redis..."
docker pull $REDIS_IMAGE
echo "拉取 TDengine..."
docker pull $TDENGINE_IMAGE
echo "拉取 EMQX..."
docker pull $EMQX_IMAGE
echo "拉取 Nacos..."
docker pull $NACOS_IMAGE
echo "拉取 MinIO..."
docker pull $MINIO_IMAGE
echo "拉取 XXL-JOB..."
docker pull $XXL_JOB_IMAGE
# 如果有自己的微服务镜像,也在这里一起拉取
# echo "拉取业务微服务..."
# docker pull your-registry/your-app:v1.0
echo "所有镜像拉取完成!"
# 保存镜像为 tar 文件
echo "正在将镜像保存为 tar 文件..."
docker save -o mysql.tar $MYSQL_IMAGE
docker save -o redis.tar $REDIS_IMAGE
docker save -o tdengine.tar $TDENGINE_IMAGE
docker save -o emqx.tar $EMQX_IMAGE
docker save -o nacos.tar $NACOS_IMAGE
docker save -o minio.tar $MINIO_IMAGE
docker save -o xxl-job.tar $XXL_JOB_IMAGE
# docker save -o your-app.tar your-registry/your-app:v1.0
echo "镜像已保存到当前目录的 tar 文件中。"
复制代码
给脚本执行权限并运行:
chmod +x pull-images.sh
./pull-images.sh
复制代码
2. Docker Compose 编排文件 (docker-compose.yml)
version: '3.8'
services:
# MySQL 服务
mysql:
image: mysql:8.0
container_name: mysql_db
restart: always
environment:
MYSQL_ROOT_PASSWORD: "StrongPassword123!" # 请修改
MYSQL_DATABASE: "microservice"
TZ: Asia/Shanghai
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./config/mysql/conf.d:/etc/mysql/conf.d
networks:
- micro_net
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p$$MYSQL_ROOT_PASSWORD"]
interval: 30s
timeout: 10s
retries: 3
# Redis 服务
redis:
image: redis:7-alpine
container_name: redis_cache
restart: always
command: redis-server --requirepass RedisPass123! --appendonly yes # 请修改密码
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- micro_net
healthcheck:
test: ["CMD", "redis-cli", "-a", "RedisPass123!", "ping"]
interval: 30s
timeout: 5s
retries: 3
# TDengine 服务
tdengine:
image: tdengine/tdengine:3.2.0.0
container_name: tdengine_db
restart: always
environment:
TAOS_ROOT_PASSWORD: "TaosData123!" # 请修改
ports:
- "6030:6030" # 客户端端口
- "6041:6041" # REST API 端口
- "6044:6044" # 查询端口
volumes:
- tdengine_data:/var/lib/taos
- tdengine_log:/var/log/taos
networks:
- micro_net
# EMQX MQTT 服务
emqx:
image: emqx:5.6.1
container_name: emqx_broker
restart: always
environment:
EMQX_NODE_NAME: "emqx@node.emqx"
EMQX_DASHBOARD__DEFAULT_USERNAME: "admin" # 请修改
EMQX_DASHBOARD__DEFAULT_PASSWORD: "EmqxPass123!" # 请修改
ports:
- "1883:1883" # MQTT TCP
- "8083:8083" # MQTT WebSocket
- "8084:8084" # MQTT/SSL
- "18083:18083" # Dashboard
volumes:
- emqx_data:/opt/emqx/data
- emqx_log:/opt/emqx/log
networks:
- micro_net
# Nacos 服务发现与配置中心
nacos:
image: nacos/nacos-server:v2.3.2
container_name: nacos_server
restart: always
environment:
MODE: standalone
NACOS_SERVER_IP: nacos
SPRING_DATASOURCE_PLATFORM: mysql
MYSQL_SERVICE_HOST: mysql
MYSQL_SERVICE_PORT: 3306
MYSQL_SERVICE_DB_NAME: nacos
MYSQL_SERVICE_USER: root
MYSQL_SERVICE_PASSWORD: "StrongPassword123!" # 与MySQL密码一致
JVM_XMS: 512m
JVM_XMX: 512m
ports:
- "8848:8848" # Nacos 控制台
- "9848:9848" # Nacos gRPC API
volumes:
- nacos_logs:/home/nacos/logs
depends_on:
mysql:
condition: service_healthy
networks:
- micro_net
# MinIO 对象存储
minio:
image: minio/minio:RELEASE.2024-08-23T18-31-37Z
container_name: minio_storage
restart: always
environment:
MINIO_ROOT_USER: minioadmin # 请修改
MINIO_ROOT_PASSWORD: Mini0Pass123! # 请修改
ports:
- "9000:9000" # API端口
- "9001:9001" # 控制台端口
volumes:
- minio_data:/data
command: server /data --console-address ":9001"
networks:
- micro_net
# XXL-JOB 任务调度中心
xxl-job:
image: xuxueli/xxl-job-admin:2.4.1
container_name: xxl_job_admin
restart: always
environment:
PARAMS: >-
--spring.datasource.url=jdbc:mysql://mysql:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
--spring.datasource.username=root
--spring.datasource.password=StrongPassword123! # 与MySQL密码一致
--xxl.job.login.username=admin
--xxl.job.login.password=XxlJobPass123! # 请修改
ports:
- "8080:8080" # XXL-JOB 控制台
volumes:
- xxl-job_logs:/data/applogs
depends_on:
mysql:
condition: service_healthy
networks:
- micro_net
# 数据卷定义
volumes:
mysql_data:
redis_data:
tdengine_data:
tdengine_log:
emqx_data:
emqx_log:
nacos_logs:
minio_data:
xxl-job_logs:
# 网络定义
networks:
micro_net:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
复制代码
3. 初始化 SQL 脚本 (init-sql/init.sql)
创建目录和初始化脚本:
mkdir -p init-sql
复制代码
-- init-sql/init.sql
-- 创建 Nacos 数据库
CREATE DATABASE IF NOT EXISTS nacos CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建 XXL-JOB 数据库
CREATE DATABASE IF NOT EXISTS xxl_job CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 使用 Nacos 官方提供的建表SQL
-- 需要从 https://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql 下载
-- 或者让Nacos容器自动初始化
-- XXL-JOB 建表SQL
-- 需要从 https://github.com/xuxueli/xxl-job/blob/master/doc/db/tables_xxl_job.sql 下载
复制代码
4. 加载和部署脚本 (deploy-offline.sh)
#!/bin/bash
# deploy-offline.sh
# 此脚本在离线服务器上执行
set -e # 遇到错误立即退出
echo "=== 开始离线部署 ==="
# 检查 Docker 是否安装
if ! command -v docker &> /dev/null; then
echo "错误: Docker 未安装,请先安装 Docker"
exit 1
fi
# 检查 Docker Compose 是否安装
if ! command -v docker-compose &> /dev/null; then
echo "错误: Docker Compose 未安装,请先安装 Docker Compose"
exit 1
fi
# 加载所有 Docker 镜像
echo "正在加载 Docker 镜像..."
for image_file in *.tar; do
if [ -f "$image_file" ]; then
echo "加载 $image_file..."
docker load -i "$image_file"
fi
done
echo "所有镜像加载完成!"
# 创建必要的目录
echo "创建配置目录..."
mkdir -p config/mysql/conf.d
# 启动所有服务
echo "启动所有服务..."
docker-compose up -d
echo "=== 部署完成! ==="
echo ""
echo "服务访问信息:"
echo "MySQL: localhost:3306"
echo "Redis: localhost:6379"
echo "TDengine: localhost:6030 (客户端), localhost:6041 (REST API)"
echo "EMQX Dashboard: http://localhost:18083"
echo "Nacos Console: http://localhost:8848/nacos"
echo "MinIO Console: http://localhost:9001"
echo "XXL-JOB Admin: http://localhost:8080/xxl-job-admin"
echo ""
echo "查看服务状态: docker-compose ps"
echo "查看日志: docker-compose logs -f [服务名]"
echo "停止服务: docker-compose down"
复制代码
5. 环境检查脚本 (check-env.sh)
#!/bin/bash
# check-env.sh
# 检查服务器环境
echo "=== 环境检查 ==="
# 检查 Docker
if command -v docker &> /dev/null; then
echo "✓ Docker 已安装: $(docker --version)"
else
echo "✗ Docker 未安装"
fi
# 检查 Docker Compose
if command -v docker-compose &> /dev/null; then
echo "✓ Docker Compose 已安装: $(docker-compose --version)"
else
echo "✗ Docker Compose 未安装"
fi
# 检查磁盘空间
echo "磁盘空间:"
df -h .
# 检查内存
echo "内存信息:"
free -h
echo "=== 检查完成 ==="
复制代码
给所有脚本执行权限:
chmod +x pull-images.sh deploy-offline.sh check-env.sh
复制代码
第二部分:部署流程
在线机器准备:
./pull-images.sh
复制代码
打包传输:
tar -czvf offline-package.tar.gz \
*.tar \
docker-compose.yml \
*.sh \
init-sql/ \
config/
复制代码
将 offline-package.tar.gz 复制到离线服务器
离线服务器部署:
# 解压
tar -xzvf offline-package.tar.gz
# 检查环境
./check-env.sh
# 执行部署
./deploy-offline.sh
# 检查状态
docker-compose ps
docker-compose logs -f
复制代码
关键配置说明
密码安全:务必修改所有默认密码!
数据持久化:所有数据都通过 volumes 持久化
服务依赖:Nacos 和 XXL-JOB 依赖 MySQL,配置了健康检查
网络隔离:所有服务在同一个 Docker 网络内,可通过服务名互相访问
资源限制:生产环境建议添加 CPU、内存限制
服务初始化
部署完成后需要:
Nacos:访问 http://服务器 IP:8848/nacos,默认账号 nacos/nacos
MinIO:访问 http://服务器 IP:9001,使用配置的用户名密码登录
XXL-JOB:访问 http://服务器 IP:8080/xxl-job-admin,使用配置的用户名密码登录
划线
评论
复制
发布于: 刚刚阅读数: 4
版权声明: 本文为 InfoQ 作者【能源恒观】的原创文章。
原文链接:【http://xie.infoq.cn/article/734c5fd98597f543d580edbdc】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。

能源恒观
关注
yes you can 2018-10-30 加入
每个人天生就是一个思想者,我们要不断的思考,尽可能多的理解这个世界。感谢关注
评论