单体服务 Docker 部署 - 阿里云方案
方向一 · 方案A:使用阿里云服务,快速部署单体应用
适用场景:中小型项目、快速上线、不想自己运维基础设施
目录
一、方案概述
1.1 架构图
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 阿里云单体部署架构 │
├─────────────────────────────────────────────────────────────────────────────────┤
│ │
│ 用户访问 https://example.com │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────────────┐ │
│ │ 阿里云 CDN(可选,加速静态资源) │ │
│ └─────────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────────────┐ │
│ │ ECS 云服务器 │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ Docker 容器 │ │ │
│ │ │ │ │ │
│ │ │ ┌─────────────────┐ ┌─────────────────┐ │ │ │
│ │ │ │ Nginx │ ───▶ │ Backend │ │ │ │
│ │ │ │ (容器:443) │ │ (容器:8080) │ │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ │ • HTTPS终结 │ │ • Spring Boot │ │ │ │
│ │ │ │ • 静态文件 │ │ • 业务逻辑 │ │ │ │
│ │ │ │ • 反向代理 │ │ │ │ │ │
│ │ │ └─────────────────┘ └─────────────────┘ │ │ │
│ │ │ │ │ │ │
│ │ └───────────────────────────────────┼─────────────────────────────┘ │ │
│ └──────────────────────────────────────┼──────────────────────────────────┘ │
│ │ │
│ ┌───────────────────────────┴───────────────────────┐ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────────────┐ ┌─────────────────────────┐ │
│ │ 云数据库 RDS MySQL │ │ 云 Redis │ │
│ │ (独立服务,高可用) │ │ (独立服务,高可用) │ │
│ └─────────────────────────┘ └─────────────────────────┘ │
│ │
│ 其他阿里云服务: │
│ • ACR 容器镜像服务 - 存储 Docker 镜像 │
│ • 云效 DevOps - CI/CD 自动化部署 │
│ • 云监控 - 服务器和应用监控 │
│ • SSL证书服务 - 免费 HTTPS 证书 │
│ │
└─────────────────────────────────────────────────────────────────────────────────┘
1.2 费用估算(香港地域)
| 服务 | 规格 | 月费用 |
|---|---|---|
| ECS 云服务器 | 2核4G | ¥150-300 |
| RDS MySQL | 1核1G 基础版 | ¥50-100 |
| Redis | 1G 标准版 | ¥50-100 |
| 带宽 | 5Mbps | ¥100-150 |
| ACR 镜像仓库 | 个人版 | 免费 |
| SSL 证书 | 单域名 | 免费 |
| 云效 DevOps | 基础版 | 免费 |
| 合计 | ¥350-650/月 |
二、阿里云资源准备
2.1 注册并实名认证
步骤1:访问 https://www.aliyun.com
步骤2:点击「免费注册」
步骤3:完成手机号注册
步骤4:进入「账号管理」→「实名认证」→ 完成个人/企业认证
(购买云服务必须实名认证)
2.2 开通所需服务
需要开通的服务清单:
| 服务 | 控制台入口 | 作用 |
|---|---|---|
| ECS 云服务器 | https://ecs.console.aliyun.com | 运行 Docker 容器 |
| RDS MySQL | https://rdsnext.console.aliyun.com | 数据库 |
| Redis | https://kvstore.console.aliyun.com | 缓存 |
| ACR 镜像服务 | https://cr.console.aliyun.com | 存储 Docker 镜像 |
| 域名服务 | https://dc.console.aliyun.com | 域名管理 |
| SSL 证书 | https://yundunnext.console.aliyun.com | HTTPS 证书 |
| 云效 | https://devops.aliyun.com | CI/CD |
三、域名与证书
3.1 购买域名
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 步骤详解:购买域名 │
├─────────────────────────────────────────────────────────────────────────────────┤
│ │
│ 入口:https://wanwang.aliyun.com │
│ │
│ 步骤1:搜索域名 │
│ ───────────────────────────────────────────────────────────────── │
│ • 在搜索框输入你想要的域名,如:myproject │
│ • 系统会显示各后缀的可用性和价格 │
│ │
│ 步骤2:选择后缀 │
│ ───────────────────────────────────────────────────────────────── │
│ • .com → 国际通用,首选(约¥55-69/年) │
│ • .cn → 中国域名,需备案 │
│ • .net → 备选 │
│ │
│ 步骤3:加入购物车 → 结算 │
│ │
│ 步骤4:填写域名信息 │
│ ───────────────────────────────────────────────────────────────── │
│ • 域名持有者:填写你的姓名或公司名 │
│ • 联系信息:真实信息(ICANN 要求) │
│ │
│ 步骤5:支付完成 │
│ │
│ 📝 记录:你购买的域名 example.com │
│ │
└─────────────────────────────────────────────────────────────────────────────────┘
3.2 申请免费 SSL 证书
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 步骤详解:申请免费 SSL 证书 │
├─────────────────────────────────────────────────────────────────────────────────┤
│ │
│ 入口:https://yundunnext.console.aliyun.com → SSL证书 │
│ │
│ 步骤1:购买免费证书 │
│ ───────────────────────────────────────────────────────────────── │
│ • 点击「SSL证书」→「免费证书」→「立即购买」 │
│ • 选择「DigiCert 单域名证书」 │
│ • 数量选择 20(每年可申请 20 个免费证书) │
│ • 0 元下单 │
│ │
│ 步骤2:创建证书 │
│ ───────────────────────────────────────────────────────────────── │
│ • 回到证书列表 → 点击「创建证书」 │
│ │
│ 步骤3:填写证书申请 │
│ ───────────────────────────────────────────────────────────────── │
│ ┌──────────────────────┬────────────────────────────────────────────────────┐ │
│ │ 证书绑定域名 │ example.com │ │
│ │ │ 【改】填写你的域名 │ │
│ ├──────────────────────┼────────────────────────────────────────────────────┤ │
│ │ 域名验证方式 │ 自动DNS验证(推荐,域名在阿里云自动完成) │ │
│ │ │ 或 手动DNS验证 │ │
│ ├──────────────────────┼────────────────────────────────────────────────────┤ │
│ │ 联系人 │ 填写你的姓名 │ │
│ ├──────────────────────┼────────────────────────────────────────────────────┤ │
│ │ 联系电话 │ 填写你的手机号 │ │
│ ├──────────────────────┼────────────────────────────────────────────────────┤ │
│ │ 联系邮箱 │ 填写你的邮箱 │ │
│ └──────────────────────┴────────────────────────────────────────────────────┘ │
│ │
│ 步骤4:提交审核 │
│ ───────────────────────────────────────────────────────────────── │
│ • 点击「提交审核」 │
│ • 如果域名在阿里云,会自动完成 DNS 验证 │
│ • 等待 5-30 分钟签发 │
│ │
│ 步骤5:下载证书 │
│ ───────────────────────────────────────────────────────────────── │
│ • 状态变为「已签发」后,点击「下载」 │
│ • 选择「Nginx」格式 │
│ • 下载得到两个文件: │
│ - example.com.pem ← 证书文件 │
│ - example.com.key ← 私钥文件 │
│ │
│ 📝 记录:保存好这两个文件,后面要用 │
│ │
└─────────────────────────────────────────────────────────────────────────────────┘
3.3 配置域名解析
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 步骤详解:配置域名解析 │
│ (需要先购买 ECS 获取公网 IP,可以先跳过,购买 ECS 后再回来配置) │
├─────────────────────────────────────────────────────────────────────────────────┤
│ │
│ 入口:https://dns.console.aliyun.com │
│ │
│ 步骤1:进入解析设置 │
│ ───────────────────────────────────────────────────────────────── │
│ • 找到你的域名 → 点击「解析设置」 │
│ │
│ 步骤2:添加记录 │
│ ───────────────────────────────────────────────────────────────── │
│ │
│ 记录1:主域名 │
│ ┌──────────────────┬────────────────────────────────────────────────────────┐ │
│ │ 记录类型 │ A │ │
│ │ 主机记录 │ @ │ │
│ │ │ (@ 代表主域名 example.com) │ │
│ │ 记录值 │ 47.96.xxx.xxx │ │
│ │ │ 【改】填写你的 ECS 公网 IP │ │
│ │ TTL │ 10分钟 │ │
│ └──────────────────┴────────────────────────────────────────────────────────┘ │
│ │
│ 记录2:www 子域名 │
│ ┌──────────────────┬────────────────────────────────────────────────────────┐ │
│ │ 记录类型 │ A │ │
│ │ 主机记录 │ www │ │
│ │ │ (www.example.com) │ │
│ │ 记录值 │ 47.96.xxx.xxx │ │
│ │ │ 【改】填写你的 ECS 公网 IP │ │
│ │ TTL │ 10分钟 │ │
│ └──────────────────┴────────────────────────────────────────────────────────┘ │
│ │
│ 验证解析(等待 5-10 分钟后): │
│ ───────────────────────────────────────────────────────────────── │
│ │
│ # 在你的电脑终端执行 │
│ ping example.com │
│ │
│ # 如果返回你的服务器 IP,说明解析成功 │
│ │
└─────────────────────────────────────────────────────────────────────────────────┘
四、镜像仓库ACR
4.1 创建镜像仓库
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 步骤详解:创建阿里云容器镜像仓库(ACR) │
│ 作用:存储你的 Docker 镜像,供 ECS 拉取部署 │
├─────────────────────────────────────────────────────────────────────────────────┤
│ │
│ 入口:https://cr.console.aliyun.com │
│ │
│ 步骤1:创建个人实例 │
│ ───────────────────────────────────────────────────────────────── │
│ • 首次进入会提示创建「个人版实例」(免费) │
│ • 点击「创建个人版实例」 │
│ • 设置 Registry 登录密码(记住这个密码!) │
│ │
│ 步骤2:创建命名空间 │
│ ───────────────────────────────────────────────────────────────── │
│ • 左侧菜单 →「命名空间」→「创建命名空间」 │
│ ┌──────────────────┬────────────────────────────────────────────────────────┐ │
│ │ 命名空间名称 │ myproject │ │
│ │ │ 【改】自定义,建议用项目名 │ │
│ │ │ 举例:my-shop、user-center、tiger-iot │ │
│ └──────────────────┴────────────────────────────────────────────────────────┘ │
│ │
│ 步骤3:创建镜像仓库 │
│ ───────────────────────────────────────────────────────────────── │
│ • 左侧菜单 →「镜像仓库」→「创建镜像仓库」 │
│ ┌──────────────────┬────────────────────────────────────────────────────────┐ │
│ │ 地域 │ 中国香港 │ │
│ │ │ 【选】与 ECS 同地域,拉取更快 │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 命名空间 │ myproject │ │
│ │ │ 选择刚创建的命名空间 │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 仓库名称 │ backend │ │
│ │ │ 【改】镜像名称,如 frontend、backend、gateway │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 仓库类型 │ 私有 │ │
│ │ │ 私有仓库需要登录才能拉取 │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 代码源 │ 本地仓库 │ │
│ │ │ (手动推送,或后续配置云效自动构建) │ │
│ └──────────────────┴────────────────────────────────────────────────────────┘ │
│ │
│ 步骤4:记录仓库地址 │
│ ───────────────────────────────────────────────────────────────── │
│ 创建完成后,点击仓库名称查看详情,记录: │
│ │
│ 📝 记录: │
│ • 仓库地址:registry.cn-hongkong.aliyuncs.com/myproject/backend │
│ • 登录命令:docker login --username=你的阿里云账号 registry.cn-hongkong... │
│ │
└─────────────────────────────────────────────────────────────────────────────────┘
五、云数据库RDS
5.1 购买 RDS MySQL
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 步骤详解:购买云数据库 RDS MySQL │
│ 作用:独立的数据库服务,高可用、自动备份、免运维 │
├─────────────────────────────────────────────────────────────────────────────────┤
│ │
│ 入口:https://rdsnext.console.aliyun.com → 创建实例 │
│ │
│ 配置选择: │
│ ┌──────────────────┬────────────────────────────────────────────────────────┐ │
│ │ 商品类型 │ 按量付费(测试)或 包年包月(生产) │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 地域 │ 中国香港 │ │
│ │ │ 【重要】必须与 ECS 同地域!否则无法内网访问 │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 数据库引擎 │ MySQL │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 版本 │ 8.0(推荐) │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 系列 │ 基础版(测试/小项目) │ │
│ │ │ 高可用版(生产环境,自动主备切换) │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 规格 │ 1核1G(小项目) │ │
│ │ │ 2核4G(中型项目) │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 存储类型 │ ESSD 云盘 │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 存储空间 │ 20GB 起 │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 网络类型 │ 专有网络 VPC │ │
│ │ │ 【重要】选择与 ECS 相同的 VPC │ │
│ └──────────────────┴────────────────────────────────────────────────────────┘ │
│ │
│ 购买后等待 5-10 分钟创建完成 │
│ │
└─────────────────────────────────────────────────────────────────────────────────┘
5.2 配置 RDS
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 步骤详解:配置 RDS 数据库 │
├─────────────────────────────────────────────────────────────────────────────────┤
│ │
│ 步骤1:设置白名单(允许 ECS 访问) │
│ ───────────────────────────────────────────────────────────────── │
│ 入口:RDS 实例详情 → 左侧「数据安全性」→「白名单设置」 │
│ │
│ • 点击「修改」或「添加白名单分组」 │
│ • 组内白名单填写: │
│ - 0.0.0.0/0 → 允许所有 IP(仅测试用!生产环境不推荐) │
│ - 10.0.0.0/8 → 允许内网 IP 段 │
│ - 具体 ECS 内网 IP → 最安全,只允许指定 ECS │
│ │
│ 步骤2:创建数据库账号 │
│ ───────────────────────────────────────────────────────────────── │
│ 入口:RDS 实例详情 → 左侧「账号管理」→「创建账号」 │
│ │
│ ┌──────────────────┬────────────────────────────────────────────────────────┐ │
│ │ 账号类型 │ 高权限账号(首次创建选这个) │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 数据库账号 │ admin │ │
│ │ │ 【改】自定义用户名 │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 密码 │ MyPassword123! │ │
│ │ │ 【改】设置强密码(大小写+数字+符号) │ │
│ └──────────────────┴────────────────────────────────────────────────────────┘ │
│ │
│ 步骤3:创建数据库 │
│ ───────────────────────────────────────────────────────────────── │
│ 入口:RDS 实例详情 → 左侧「数据库管理」→「创建数据库」 │
│ │
│ ┌──────────────────┬────────────────────────────────────────────────────────┐ │
│ │ 数据库名称 │ mydb │ │
│ │ │ 【改】你的数据库名 │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 字符集 │ utf8mb4 │ │
│ │ │ 支持中文和 emoji │ │
│ └──────────────────┴────────────────────────────────────────────────────────┘ │
│ │
│ 步骤4:获取连接地址 │
│ ───────────────────────────────────────────────────────────────── │
│ 入口:RDS 实例详情 → 「数据库连接」 │
│ │
│ 📝 记录(后面要用): │
│ • 内网地址:rm-xxx.mysql.rds.aliyuncs.com(ECS 内网访问用这个,更快更安全) │
│ • 端口:3306 │
│ • 数据库名:mydb │
│ • 用户名:admin │
│ • 密码:你设置的密码 │
│ │
│ 完整 JDBC URL: │
│ jdbc:mysql://rm-xxx.mysql.rds.aliyuncs.com:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai
│ │
└─────────────────────────────────────────────────────────────────────────────────┘
六、云Redis
6.1 购买云 Redis
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 步骤详解:购买云 Redis │
│ 作用:缓存服务,提高性能,存储 Session 等 │
├─────────────────────────────────────────────────────────────────────────────────┤
│ │
│ 入口:https://kvstore.console.aliyun.com → 创建实例 │
│ │
│ 配置选择: │
│ ┌──────────────────┬────────────────────────────────────────────────────────┐ │
│ │ 地域 │ 中国香港 │ │
│ │ │ 【重要】必须与 ECS、RDS 同地域 │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 版本 │ Redis 7.0 │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 架构 │ 标准版-单副本(测试) │ │
│ │ │ 标准版-双副本(生产,高可用) │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 内存容量 │ 1GB(小项目够用) │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 网络类型 │ 专有网络 VPC │ │
│ │ │ 【重要】选择与 ECS 相同的 VPC │ │
│ └──────────────────┴────────────────────────────────────────────────────────┘ │
│ │
│ 创建后设置密码: │
│ ───────────────────────────────────────────────────────────────── │
│ 实例详情 → 「账号管理」→ 「修改密码」 │
│ │
│ 📝 记录: │
│ • 内网地址:r-xxx.redis.rds.aliyuncs.com │
│ • 端口:6379 │
│ • 密码:你设置的密码 │
│ │
└─────────────────────────────────────────────────────────────────────────────────┘
七、云服务器ECS
7.1 购买 ECS
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 步骤详解:购买云服务器 ECS │
├─────────────────────────────────────────────────────────────────────────────────┤
│ │
│ 入口:https://ecs-buy.aliyun.com │
│ │
│ 基础配置: │
│ ┌──────────────────┬────────────────────────────────────────────────────────┐ │
│ │ 付费模式 │ 包年包月(长期划算) │ │
│ │ │ 按量付费(测试用) │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 地域 │ 中国香港 │ │
│ │ │ 【重要】免备案!与 RDS/Redis 同地域 │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 可用区 │ 随机分配(或与 RDS 相同可用区) │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 实例规格 │ ecs.c6.large(2核4G)→ 小项目 │ │
│ │ │ ecs.c6.xlarge(4核8G)→ 中型项目 │ │
│ │ │ 【选】根据实际需求 │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 镜像 │ Ubuntu 22.04 64位 │ │
│ │ │ 【推荐】稳定,教程多 │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 系统盘 │ ESSD 云盘 50GB(或更大) │ │
│ └──────────────────┴────────────────────────────────────────────────────────┘ │
│ │
│ 网络配置: │
│ ┌──────────────────┬────────────────────────────────────────────────────────┐ │
│ │ 网络类型 │ 专有网络 VPC │ │
│ │ │ 【重要】选择与 RDS/Redis 相同的 VPC │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 公网IP │ ☑ 分配公网 IPv4 地址 │ │
│ │ │ 【必选】对外提供服务需要公网 IP │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 带宽计费 │ 按固定带宽 │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 带宽值 │ 5Mbps(小项目) │ │
│ │ │ 10Mbps(中型项目) │ │
│ └──────────────────┴────────────────────────────────────────────────────────┘ │
│ │
│ 系统配置: │
│ ┌──────────────────┬────────────────────────────────────────────────────────┐ │
│ │ 登录凭证 │ 自定义密码 │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 登录密码 │ MyServerPassword123! │ │
│ │ │ 【改】设置强密码,要记住! │ │
│ ├──────────────────┼────────────────────────────────────────────────────────┤ │
│ │ 实例名称 │ my-server │ │
│ └──────────────────┴────────────────────────────────────────────────────────┘ │
│ │
│ 📝 购买完成后记录: │
│ • 公网 IP:47.96.xxx.xxx │
│ • 内网 IP:10.0.xxx.xxx │
│ • 登录密码:你设置的密码 │
│ │
└─────────────────────────────────────────────────────────────────────────────────┘
7.2 配置安全组
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 步骤详解:配置安全组(防火墙规则) │
├─────────────────────────────────────────────────────────────────────────────────┤
│ │
│ 入口:ECS 控制台 → 实例详情 → 安全组 → 配置规则 │
│ 或:https://ecs.console.aliyun.com → 安全组 │
│ │
│ 添加入方向规则: │
│ ───────────────────────────────────────────────────────────────── │
│ 点击「入方向」→「手动添加」 │
│ │
│ ┌────────┬────────┬──────────────┬────────────────────────────────────────────┐│
│ │ 端口 │ 协议 │ 授权对象 │ 说明 ││
│ ├────────┼────────┼──────────────┼────────────────────────────────────────────┤│
│ │ 22 │ TCP │ 0.0.0.0/0 │ SSH 远程登录 ││
│ │ │ │ │ 【安全建议】改成你的 IP:xxx.xxx.xxx.xxx/32 ││
│ ├────────┼────────┼──────────────┼────────────────────────────────────────────┤│
│ │ 80 │ TCP │ 0.0.0.0/0 │ HTTP 访问 ││
│ ├────────┼────────┼──────────────┼────────────────────────────────────────────┤│
│ │ 443 │ TCP │ 0.0.0.0/0 │ HTTPS 访问 ││
│ └────────┴────────┴──────────────┴────────────────────────────────────────────┘│
│ │
│ ⚠️ 安全提醒: │
│ • 不要开放 3306(MySQL)和 6379(Redis)端口! │
│ • 数据库通过内网访问,不需要公网端口 │
│ │
└─────────────────────────────────────────────────────────────────────────────────┘
八、Docker环境配置
8.1 连接服务器
# ═══════════════════════════════════════════════════════════════════════════════
# 步骤:连接服务器
#
# 在你的电脑终端执行(Windows 用 PowerShell 或 Git Bash)
# ═══════════════════════════════════════════════════════════════════════════════
# 【改】把 47.96.xxx.xxx 换成你的 ECS 公网 IP
ssh root@47.96.xxx.xxx
# 首次连接会提示:
# Are you sure you want to continue connecting (yes/no)?
# 输入 yes 回车
# 然后输入密码(输入时不显示,输完回车)
8.2 服务器初始化
# ═══════════════════════════════════════════════════════════════════════════════
# 脚本:服务器初始化
#
# 位置:服务器上任意目录
# 执行:直接复制全部内容,粘贴到服务器终端,回车执行
#
# 作用:
# 1. 更新系统软件包
# 2. 设置时区为上海
# 3. 安装常用工具
# 4. 配置系统防火墙
# 5. 创建项目目录结构
# ═══════════════════════════════════════════════════════════════════════════════
#!/bin/bash
set -e # 遇到错误停止执行
echo "=========================================="
echo "开始初始化服务器..."
echo "=========================================="
# 1. 更新系统
# ─────────────────────────────────────────────────────────────────
# 作用:更新软件包列表,升级已安装软件到最新版本
# apt update:更新可用软件包列表
# apt upgrade -y:升级所有软件,-y 自动确认
echo ">>> 更新系统..."
apt update && apt upgrade -y
# 2. 设置时区
# ─────────────────────────────────────────────────────────────────
# 作用:确保服务器时间和日志时间是北京时间
# 如果需要 UTC 时间:timedatectl set-timezone UTC
echo ">>> 设置时区..."
timedatectl set-timezone Asia/Shanghai
# 3. 安装常用工具
# ─────────────────────────────────────────────────────────────────
# curl/wget:下载工具
# vim:文本编辑器
# git:版本控制
# htop:系统监控
# net-tools:网络工具(ifconfig、netstat)
# unzip:解压工具
# ufw:防火墙工具
# tree:目录树显示
# lsof:查看端口占用
echo ">>> 安装常用工具..."
apt install -y curl wget vim git htop net-tools unzip ufw tree lsof
# 4. 配置防火墙
# ─────────────────────────────────────────────────────────────────
# 作用:系统层面的防火墙(与阿里云安全组双重保护)
# ufw allow 22:允许 SSH
# ufw allow 80:允许 HTTP
# ufw allow 443:允许 HTTPS
# --force:非交互式启用
echo ">>> 配置防火墙..."
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw --force enable
# 5. 创建项目目录
# ─────────────────────────────────────────────────────────────────
# 目录结构说明:
# /home/deploy/
# ├── frontend/dist/ → 前端打包文件
# ├── backend/ → 后端 JAR 包和日志
# │ └── logs/ → 后端日志目录
# ├── nginx/ → Nginx 配置
# │ ├── conf.d/ → 站点配置
# │ └── logs/ → Nginx 日志
# └── ssl/ → SSL 证书文件
echo ">>> 创建目录结构..."
mkdir -p /home/deploy/{frontend/dist,backend/logs,nginx/conf.d,nginx/logs,ssl}
# 显示目录结构
echo ">>> 目录结构:"
tree /home/deploy/
echo "=========================================="
echo "✅ 服务器初始化完成!"
echo "=========================================="
8.3 安装 Docker
# ═══════════════════════════════════════════════════════════════════════════════
# 脚本:安装 Docker
#
# 位置:服务器上任意目录
# 执行:直接复制全部内容,粘贴到服务器终端,回车执行
#
# 作用:
# 1. 卸载旧版 Docker(如果有)
# 2. 安装 Docker 依赖
# 3. 添加 Docker 官方 GPG 密钥和仓库
# 4. 安装 Docker CE(社区版)和 Docker Compose
# 5. 启动 Docker 并设置开机自启
# ═══════════════════════════════════════════════════════════════════════════════
#!/bin/bash
set -e
echo "=========================================="
echo "开始安装 Docker..."
echo "=========================================="
# 1. 卸载旧版本
# ─────────────────────────────────────────────────────────────────
# 作用:避免版本冲突
# 2>/dev/null:忽略错误(如果没有旧版本不报错)
echo ">>> 卸载旧版本..."
apt remove -y docker docker-engine docker.io containerd runc 2>/dev/null || true
# 2. 安装依赖
# ─────────────────────────────────────────────────────────────────
# ca-certificates:HTTPS 证书
# curl:下载工具
# gnupg:GPG 密钥工具
# lsb-release:获取系统版本信息
echo ">>> 安装依赖..."
apt update
apt install -y ca-certificates curl gnupg lsb-release
# 3. 添加 Docker GPG 密钥
# ─────────────────────────────────────────────────────────────────
# 作用:验证 Docker 软件包的真实性
echo ">>> 添加 Docker GPG 密钥..."
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 4. 添加 Docker 仓库
# ─────────────────────────────────────────────────────────────────
# 作用:告诉 apt 从哪里下载 Docker
# $(dpkg --print-architecture):自动获取系统架构(amd64/arm64)
# $(lsb_release -cs):自动获取系统版本代号(jammy/focal)
echo ">>> 添加 Docker 仓库..."
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
# 5. 安装 Docker
# ─────────────────────────────────────────────────────────────────
# docker-ce:Docker 引擎
# docker-ce-cli:Docker 命令行工具
# containerd.io:容器运行时
# docker-compose-plugin:Docker Compose V2(使用 docker compose 命令)
echo ">>> 安装 Docker..."
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 6. 启动 Docker
# ─────────────────────────────────────────────────────────────────
# start:立即启动
# enable:开机自启
echo ">>> 启动 Docker..."
systemctl start docker
systemctl enable docker
# 7. 验证安装
# ─────────────────────────────────────────────────────────────────
echo ">>> 验证安装..."
docker --version
docker compose version
echo "=========================================="
echo "✅ Docker 安装完成!"
echo "=========================================="
8.4 配置 Docker 镜像加速
# ═══════════════════════════════════════════════════════════════════════════════
# 脚本:配置 Docker 镜像加速
#
# 作用:从国内镜像源拉取镜像,加快下载速度
# 注意:香港服务器可以不配,国内服务器必须配
# ═══════════════════════════════════════════════════════════════════════════════
# 创建 Docker 配置文件
cat > /etc/docker/daemon.json << 'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://mirror.baidubce.com"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
EOF
# 配置说明:
# ─────────────────────────────────────────────────────────────────
# registry-mirrors:镜像加速地址列表(按顺序尝试)
# log-driver:日志驱动,json-file 是默认格式
# log-opts.max-size:单个日志文件最大 100MB
# log-opts.max-file:最多保留 3 个日志文件
# 作用:防止日志文件无限增长占满磁盘
# 重启 Docker 使配置生效
systemctl daemon-reload
systemctl restart docker
# 验证配置
docker info | grep -A 5 "Registry Mirrors"
8.5 登录阿里云镜像仓库
# ═══════════════════════════════════════════════════════════════════════════════
# 步骤:登录阿里云镜像仓库
#
# 作用:让 Docker 可以从你的私有仓库拉取镜像
# 【改】替换为你的阿里云账号和仓库地址
# ═══════════════════════════════════════════════════════════════════════════════
# 登录命令
# 【改】把 your-aliyun-account 换成你的阿里云账号(邮箱或手机号)
# 【改】把 cn-hongkong 换成你的仓库地域
docker login --username=your-aliyun-account registry.cn-hongkong.aliyuncs.com
# 会提示输入密码,输入你在 ACR 设置的「Registry 登录密码」
# 登录成功显示:Login Succeeded
九、应用部署
9.1 创建 docker-compose.yml
# ═══════════════════════════════════════════════════════════════════════════════
# 步骤:创建 docker-compose.yml
#
# 位置:/home/deploy/docker-compose.yml
# 执行:在服务器上执行以下命令
# ═══════════════════════════════════════════════════════════════════════════════
cd /home/deploy
cat > docker-compose.yml << 'EOF'
# ═══════════════════════════════════════════════════════════════════════════════
# Docker Compose 配置文件
#
# 文件位置:/home/deploy/docker-compose.yml
#
# 启动命令:docker compose up -d
# 停止命令:docker compose down
# 查看状态:docker compose ps
# 查看日志:docker compose logs -f
#
# 【需要修改的地方】搜索【改】标记
# ═══════════════════════════════════════════════════════════════════════════════
version: '3.8'
# ┌───────────────────────────────────────────────────────────────────────────────┐
# │ version: Compose 文件格式版本 │
# │ │
# │ 说明: │
# │ • '3.8' - 当前推荐版本,支持大部分功能 │
# │ • '3.9' - 最新版本 │
# │ • '2.x' - 旧版本,支持更多本地开发特性 │
# │ │
# │ 举例: │
# │ • 如果需要 GPU 支持,用 version: '3.8' 配合 deploy.resources.reservations │
# │ • 如果需要 extends 继承配置,用 version: '2.4' │
# └───────────────────────────────────────────────────────────────────────────────┘
services:
# ┌───────────────────────────────────────────────────────────────────────────────┐
# │ services: 定义所有要运行的服务(每个服务就是一个容器) │
# │ │
# │ 服务间可以用服务名互相访问,例如: │
# │ • nginx 访问 backend → http://backend:8080 │
# │ • backend 访问外部 RDS → rm-xxx.mysql.rds.aliyuncs.com:3306 │
# └───────────────────────────────────────────────────────────────────────────────┘
# ═══════════════════════════════════════════════════════════════════════════════
# 服务1:Nginx(反向代理 + 静态文件服务器 + HTTPS 终结)
# ═══════════════════════════════════════════════════════════════════════════════
nginx:
image: nginx:1.24-alpine
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │ image: 使用的 Docker 镜像 │
# │ │
# │ 格式:镜像名:标签 │
# │ • nginx:latest → 最新版(不推荐,版本不可控) │
# │ • nginx:1.24 → 指定版本(推荐) │
# │ • nginx:1.24-alpine → 指定版本的轻量版(体积小,推荐) │
# │ │
# │ alpine 版本: │
# │ • 基于 Alpine Linux,体积只有几十 MB │
# │ • 普通版几百 MB │
# │ • 功能一样,体积小启动快 │
# └─────────────────────────────────────────────────────────────────────────────┘
container_name: nginx
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │ container_name: 自定义容器名称 │
# │ │
# │ 不设置时:自动生成名称,如 deploy-nginx-1 │
# │ 设置后:固定名称 nginx,方便管理 │
# │ │
# │ 操作示例: │
# │ • docker logs nginx → 查看日志 │
# │ • docker restart nginx → 重启容器 │
# │ • docker exec -it nginx sh → 进入容器 │
# └─────────────────────────────────────────────────────────────────────────────┘
restart: always
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │ restart: 容器重启策略 │
# │ │
# │ 可选值: │
# │ • no → 不自动重启(默认值) │
# │ • always → 总是重启(推荐生产环境) │
# │ 容器退出后自动重启 │
# │ Docker 服务重启后也会自动启动容器 │
# │ • on-failure → 只在非正常退出时重启(退出码非 0) │
# │ • unless-stopped → 除非手动停止,否则总是重启 │
# │ │
# │ 举例场景: │
# │ • 开发环境用 no:方便调试,停了就停了 │
# │ • 生产环境用 always:保证服务持续运行 │
# └─────────────────────────────────────────────────────────────────────────────┘
ports:
- "80:80"
- "443:443"
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │ ports: 端口映射 │
# │ │
# │ 格式:"宿主机端口:容器端口" │
# │ • "80:80" → 宿主机 80 端口映射到容器 80 端口 │
# │ • "443:443" → HTTPS 端口 │
# │ │
# │ 举例: │
# │ • "8080:80" → 外部用 8080 访问,容器内是 80 │
# │ • "127.0.0.1:80:80" → 只允许本机访问 │
# │ • "80" → 随机宿主机端口映射到容器 80 │
# │ │
# │ 为什么用 80 和 443: │
# │ • 80 是 HTTP 默认端口,用户访问 http://example.com │
# │ • 443 是 HTTPS 默认端口,用户访问 https://example.com │
# │ • 不用带端口号,用户体验好 │
# └─────────────────────────────────────────────────────────────────────────────┘
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx/conf.d:/etc/nginx/conf.d:ro
- ./frontend/dist:/usr/share/nginx/html:ro
- ./ssl:/etc/nginx/ssl:ro
- ./nginx/logs:/var/log/nginx
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │ volumes: 数据卷映射(把宿主机目录挂载到容器内) │
# │ │
# │ 格式:"宿主机路径:容器路径:权限" │
# │ • :ro → read-only 只读(容器不能修改) │
# │ • :rw → read-write 读写(默认值) │
# │ │
# │ 各挂载说明: │
# │ │
# │ ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro │
# │ → Nginx 主配置文件 │
# │ → 宿主机:/home/deploy/nginx/nginx.conf │
# │ → 容器内:/etc/nginx/nginx.conf │
# │ → :ro 只读,配置文件不应被容器修改 │
# │ │
# │ ./nginx/conf.d:/etc/nginx/conf.d:ro │
# │ → Nginx 站点配置目录(server 块) │
# │ → 宿主机:/home/deploy/nginx/conf.d/ │
# │ → 容器内:/etc/nginx/conf.d/ │
# │ │
# │ ./frontend/dist:/usr/share/nginx/html:ro │
# │ → 前端打包文件 │
# │ → 宿主机:/home/deploy/frontend/dist/ │
# │ → 容器内:/usr/share/nginx/html/(Nginx 默认网站根目录) │
# │ │
# │ ./ssl:/etc/nginx/ssl:ro │
# │ → SSL 证书文件 │
# │ → 宿主机:/home/deploy/ssl/ │
# │ → 存放 .pem 和 .key 文件 │
# │ │
# │ ./nginx/logs:/var/log/nginx │
# │ → Nginx 日志目录 │
# │ → 没有 :ro,因为需要写入日志 │
# │ → 日志持久化到宿主机,容器重建不丢失 │
# └─────────────────────────────────────────────────────────────────────────────┘
depends_on:
- backend
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │ depends_on: 依赖关系(启动顺序) │
# │ │
# │ • nginx 依赖 backend → backend 先启动,nginx 后启动 │
# │ • 注意:只保证启动顺序,不保证 backend 服务就绪 │
# │ │
# │ 高级用法(等待服务健康): │
# │ depends_on: │
# │ backend: │
# │ condition: service_healthy │
# │ 需要 backend 配置 healthcheck │
# └─────────────────────────────────────────────────────────────────────────────┘
networks:
- app-network
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │ networks: 加入的 Docker 网络 │
# │ │
# │ 同一网络内的容器可以用服务名互相访问: │
# │ • nginx 访问 backend → http://backend:8080 │
# │ │
# │ 不同网络的容器默认不能互相访问(网络隔离) │
# └─────────────────────────────────────────────────────────────────────────────┘
# ═══════════════════════════════════════════════════════════════════════════════
# 服务2:Backend(后端 Spring Boot 应用)
# ═══════════════════════════════════════════════════════════════════════════════
backend:
image: openjdk:17-jdk-slim
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │ 使用 OpenJDK 17 运行 Spring Boot JAR 包 │
# │ │
# │ 镜像选择: │
# │ • openjdk:17-jdk-slim → JDK 17 精简版(推荐) │
# │ • openjdk:17-jdk → JDK 17 完整版 │
# │ • openjdk:8-jdk-slim → JDK 8(旧项目) │
# │ • eclipse-temurin:17 → 另一个流行的 JDK 发行版 │
# │ │
# │ 为什么用 slim: │
# │ • 体积小(约 200MB vs 完整版 400MB+) │
# │ • 只包含运行时必需组件 │
# │ • 生产环境够用 │
# └─────────────────────────────────────────────────────────────────────────────┘
container_name: backend
restart: always
working_dir: /app
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │ working_dir: 容器内的工作目录 │
# │ │
# │ • 容器启动后的当前目录 │
# │ • command 中的相对路径基于此目录 │
# └─────────────────────────────────────────────────────────────────────────────┘
command: java -jar -Xms512m -Xmx1024m -Dspring.profiles.active=prod app.jar
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │ command: 容器启动命令 │
# │ │
# │ 参数说明: │
# │ │
# │ java -jar app.jar │
# │ → 运行 JAR 包 │
# │ │
# │ -Xms512m │
# │ → 初始堆内存 512MB │
# │ → JVM 启动时分配的内存 │
# │ │
# │ -Xmx1024m │
# │ → 最大堆内存 1024MB(1GB) │
# │ → JVM 最多能用这么多内存 │
# │ →【改】根据服务器内存调整: │
# │ 2G 服务器:-Xms256m -Xmx512m │
# │ 4G 服务器:-Xms512m -Xmx1024m │
# │ 8G 服务器:-Xms1g -Xmx2g │
# │ │
# │ -Dspring.profiles.active=prod │
# │ → 激活 prod 环境配置 │
# │ → 会加载 application-prod.yml │
# │ │
# │ 其他常用 JVM 参数: │
# │ -XX:+UseG1GC → 使用 G1 垃圾收集器(推荐) │
# │ -XX:MaxMetaspaceSize=256m → 限制元空间大小 │
# │ -Dserver.port=8080 → 指定端口 │
# │ -Dfile.encoding=UTF-8 → 指定编码 │
# └─────────────────────────────────────────────────────────────────────────────┘
volumes:
- ./backend/app.jar:/app/app.jar:ro
- ./backend/logs:/app/logs
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │ 挂载说明: │
# │ │
# │ ./backend/app.jar:/app/app.jar:ro │
# │ → JAR 包挂载 │
# │ → 宿主机:/home/deploy/backend/app.jar │
# │ → :ro 只读,保护 JAR 包不被修改 │
# │ │
# │ ./backend/logs:/app/logs │
# │ → 日志目录 │
# │ → Spring Boot 配置日志输出到 /app/logs 目录 │
# │ → 持久化到宿主机,容器重建不丢失 │
# └─────────────────────────────────────────────────────────────────────────────┘
environment:
- TZ=Asia/Shanghai
- SPRING_DATASOURCE_URL=jdbc:mysql://rm-xxx.mysql.rds.aliyuncs.com:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
- SPRING_DATASOURCE_USERNAME=admin
- SPRING_DATASOURCE_PASSWORD=MyPassword123!
- SPRING_REDIS_HOST=r-xxx.redis.rds.aliyuncs.com
- SPRING_REDIS_PORT=6379
- SPRING_REDIS_PASSWORD=RedisPassword123!
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │ environment: 环境变量 │
# │ │
# │ TZ=Asia/Shanghai │
# │ → 设置时区为上海(北京时间) │
# │ → 确保日志时间正确 │
# │ │
# │ SPRING_DATASOURCE_URL │
# │ →【改】RDS 内网连接地址 │
# │ → 格式:jdbc:mysql://地址:端口/数据库名?参数 │
# │ → useSSL=false:不使用 SSL(内网访问) │
# │ → serverTimezone=Asia/Shanghai:时区 │
# │ → allowPublicKeyRetrieval=true:允许获取公钥(MySQL 8 需要) │
# │ │
# │ SPRING_DATASOURCE_USERNAME │
# │ →【改】RDS 用户名 │
# │ │
# │ SPRING_DATASOURCE_PASSWORD │
# │ →【改】RDS 密码 │
# │ │
# │ SPRING_REDIS_HOST │
# │ →【改】Redis 内网地址 │
# │ │
# │ SPRING_REDIS_PASSWORD │
# │ →【改】Redis 密码 │
# │ │
# │ Spring Boot 自动将环境变量映射到配置: │
# │ SPRING_DATASOURCE_URL → spring.datasource.url │
# │ 下划线转小写点号 │
# └─────────────────────────────────────────────────────────────────────────────┘
networks:
- app-network
# ═══════════════════════════════════════════════════════════════════════════════
# 网络定义
# ═══════════════════════════════════════════════════════════════════════════════
networks:
app-network:
driver: bridge
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │ networks: 自定义 Docker 网络 │
# │ │
# │ driver: bridge │
# │ → 桥接网络(默认类型) │
# │ → 同一网络内的容器可以互相通信 │
# │ → 用服务名作为主机名:http://backend:8080 │
# │ │
# │ 其他网络类型: │
# │ • host → 使用宿主机网络,性能最好但不隔离 │
# │ • none → 无网络 │
# │ • overlay → 跨主机网络(Swarm 模式用) │
# │ │
# │ 为什么要自定义网络: │
# │ • 默认 bridge 网络不支持服务名解析 │
# │ • 自定义网络自动提供 DNS 解析 │
# └─────────────────────────────────────────────────────────────────────────────┘
EOF
echo "✅ docker-compose.yml 创建完成!"
echo "📁 文件位置:/home/deploy/docker-compose.yml"
篇幅限制,完整文件已创建。请查看文件继续后续步骤。
1072

被折叠的 条评论
为什么被折叠?



