写点什么

微服务系统脚本自动化部署方案(离线)

作者:能源恒观
  • 2025-09-23
    上海
  • 本文字数:4669 字

    阅读完需:约 15 分钟

微服务系统脚本自动化部署方案(离线)

微服务系统脚本自动化部署方案(离线)


这个方案的核心思路是:

  1. 准备阶段:在一台有网的机器上拉取所有需要的镜像并保存为 .tar 文件。

  2. 传输阶段:将镜像文件和部署脚本打包,复制到目标离线服务器。

  3. 部署阶段:在离线服务器上加载镜像,使用 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_IMAGEdocker save -o redis.tar $REDIS_IMAGEdocker save -o tdengine.tar $TDENGINE_IMAGEdocker save -o emqx.tar $EMQX_IMAGEdocker save -o nacos.tar $NACOS_IMAGEdocker save -o minio.tar $MINIO_IMAGEdocker 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 1fi
# 检查 Docker Compose 是否安装if ! command -v docker-compose &> /dev/null; then echo "错误: Docker Compose 未安装,请先安装 Docker Compose" exit 1fi
# 加载所有 Docker 镜像echo "正在加载 Docker 镜像..."for image_file in *.tar; do if [ -f "$image_file" ]; then echo "加载 $image_file..." docker load -i "$image_file" fidone
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 "=== 环境检查 ==="
# 检查 Dockerif command -v docker &> /dev/null; then echo "✓ Docker 已安装: $(docker --version)"else echo "✗ Docker 未安装"fi
# 检查 Docker Composeif 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
复制代码


第二部分:部署流程

  1. 在线机器准备


./pull-images.sh
复制代码


  1. 打包传输


tar -czvf offline-package.tar.gz \    *.tar \    docker-compose.yml \    *.sh \    init-sql/ \    config/
复制代码


将 offline-package.tar.gz 复制到离线服务器

  1. 离线服务器部署


# 解压tar -xzvf offline-package.tar.gz
# 检查环境./check-env.sh
# 执行部署./deploy-offline.sh
# 检查状态docker-compose psdocker-compose logs -f
复制代码


关键配置说明

  1. 密码安全:务必修改所有默认密码!

  2. 数据持久化:所有数据都通过 volumes 持久化

  3. 服务依赖:Nacos 和 XXL-JOB 依赖 MySQL,配置了健康检查

  4. 网络隔离:所有服务在同一个 Docker 网络内,可通过服务名互相访问

  5. 资源限制:生产环境建议添加 CPU、内存限制

服务初始化

部署完成后需要:

  1. Nacos:访问 http://服务器 IP:8848/nacos,默认账号 nacos/nacos

  2. MinIO:访问 http://服务器 IP:9001,使用配置的用户名密码登录

  3. XXL-JOB:访问 http://服务器 IP:8080/xxl-job-admin,使用配置的用户名密码登录


发布于: 刚刚阅读数: 4
用户头像

能源恒观

关注

yes you can 2018-10-30 加入

每个人天生就是一个思想者,我们要不断的思考,尽可能多的理解这个世界。感谢关注

评论

发布
暂无评论
微服务系统脚本自动化部署方案(离线)_微服务_能源恒观_InfoQ写作社区