一、云服务器
1. 安装Docker
# 1. 一键安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun2. 启动 Docker 并设置开机自启
systemctl start docker
systemctl enable docker3. 验证是否安装成功(看到版本号即成功)
docker --version二、创建容器镜像服务
阿里云容器镜像服务(ACR)是目前国内最稳、最快的“镜像中转站”。
容器镜像服务(Container Registry)提供多地域镜像托管能力,稳定的国内外镜像构建服务,便捷的镜像授权功能,方便用户进行镜像全生命周期管理。
按照下面的步骤,创建一个私有且免费的仓库。
1. 进入控制台
- 登录 阿里云官网。
- 在顶部搜索栏输入 “容器镜像服务”,点击进入。
- 页面上会让你选择,点击 “个人实例”(个人开发完全免费,够用了)。
2. 设置仓库密码(最关键)
进入个人实例页面后,直接提示设置仓库密码,该密码独立于账号密码。
账户名提示为阿里云的账号名。
3. 创建命名空间(相当于文件夹)
- 点击左侧菜单的 【命名空间】。
- 点击 【创建命名空间】。
- 名称建议起一个你喜欢的(比如
my-app-space)。 - 默认选“私有”,这样除了你谁也看不见。
4. 创建镜像仓库(具体的保险箱)
- 点击左侧菜单的 【镜像仓库】。
- 点击 【创建镜像仓库】。
- 命名空间:选刚才创建那个。
- 仓库名称:起个名字(比如
spring-boot-server)。 - 摘要:随便写。
- 仓库类型:选择 “私有”。
- 点击“下一步”,代码源选择 【本地仓库】,最后点击 【创建镜像仓库】。
5. 拿到你的地址
创建完成后,点击进入这个仓库,你会看到一串 “公网地址”,类似于: registry.cn-hangzhou.aliyuncs.com/my-app-space/spring-boot-server
三、GitHub代码仓库设置
该部分设置主要是为了将用户名、密码等私密信息保存在GitHub中,而不是在yml的脚本代码中写死,以提高安全性。
注意在**“仓库级别”的设置**,而不是 GitHub 个人全局设置 (Personal Settings)。
- 点击你仓库顶部的那个
Settings。 - 在左侧找到
Secrets and variables(通常在Security分组下面)。 - 点击
Actions。 - 点击右侧绿色的
New repository secret。
进入正确的 Actions 秘密区域,把 ALI_REGISTRY、ALI_USERNAME 和 ALI_PASSWORD 存进去。**
ALI_REGISTRY:registry.cn-hangzhou.aliyuncs.com(如果你的区域在上海,那就是cn-shanghai)。ALI_USERNAME: 你的阿里云账号名。ALI_PASSWORD: 你刚才设的那个固定密码。
注意,实际仓库名类似crpi-padfae7kjadfdb.cn-hangzhou.personal.cr.aliyuncs.com
四、GitHub Actions 脚本
1. 创建文件夹层级
在你的 Spring Boot 项目根目录下,必须严格按照这个路径新建文件夹(注意前面的点):
- 新建文件夹:
.github - 在
.github里面新建文件夹:workflows - 在
workflows里面新建文件:deploy.yml
2. 编写脚本内容
name: Java Docker CI/CD
on:
push:
branches: [ "main" ] # 如果你的主分支叫 master,请改为 master
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: 1. 拉取代码
uses: actions/checkout@v4
- name: 2. 设置 JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: maven
- name: 3. Maven 编译打包
run: mvn clean package -DskipTests
- name: 4. 登录阿里云私有仓库
run: docker login --username=${{ secrets.ALI_USERNAME }} --password=${{ secrets.ALI_PASSWORD }} ${{ secrets.ALI_REGISTRY }}
- name: 5. 构建并推送镜像
run: |
# 【请修改】把下面的 "空间名/仓库名" 换成你阿里云上真实的名称
IMAGE_NAME=${{ secrets.ALI_REGISTRY }}/你的空间名/你的仓库名:latest
docker build -t $IMAGE_NAME .
docker push $IMAGE_NAME五、本地项目准备 (Dockerfile)
在你的 Spring Boot 项目根目录下(也就是和 pom.xml 同级的地方),新建一个文本文件,命名为 Dockerfile(无后缀),内容如下:
FROM openjdk:17-jdk-alpine
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]六、观察Actions执行结果
推送代码后,Actions会自动触发,观察执行结果。
执行成功后,可以去阿里云容器服务仓库看到上传的镜像,具体位置在 镜像仓库 -> 镜像版本。
七、初次启动
由于你的仓库是私有的,服务器第一次拉取镜像需要“打个招呼”。请在你的云服务器执行:
1. 登录阿里云私有仓库
# 复制你之前的 ALI_REGISTRY 地址,填入你的用户名
docker login --username=你的用户名 crpi-padfae7kjadfdb.cn-hangzhou.personal.cr.aliyuncs.com执行后输入你在阿里云设置的固定密码。看到 Login Succeeded 即可。
2. 手动启动你的应用(仅需一次)
我们需要先让应用跑起来,给它起个名字叫 my-server。
docker run -d \
--name my-server \
-p 8080:8080 \
--restart always \
crpi-padfae7kjadfdb.cn-hangzhou.personal.cr.aliyuncs.com/huanyu-app-space/my-server:latest3. 验证应用是否在跑
执行 docker ps,你应该能看到 my-server 容器在 Up 状态。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e69279475788 crpi-padfae7kjadfdb.cn-hangzhou.personal.cr.aliyuncs.com/huanyu-app-space/my-server:latest "java -jar /app.jar" 31 seconds ago Up 29 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp my-server4. 接口验证
最直接的方式:浏览器或 Postman (外部访问)
这是最常用的方式。你需要知道服务器的 公网 IP 和你在 docker run 时映射的 端口(刚才我们设的是 8080)。
- 访问地址格式:
http://你的服务器公网IP:8080/你的接口路径 - 示例:如果你的服务器 IP 是
1.2.3.4,后端有一个@GetMapping("/hello")的接口,那么在浏览器输入:http://1.2.3.4:8080/hello
注意:如果访问不通,大概率是“防火墙/安全组”没开。 你需要登录阿里云/腾讯云后台,在 “安全组” 设置里,添加一条 入方向规则:
- 协议:TCP
- 端口范围:8080
- 授权对象:0.0.0.0/0 (允许所有人访问)
八、启动 Watchtower(核心神器:自动监控更新)
这是实现“全自动”的灵魂。这个小工具会每隔 30 秒检查一次阿里云,发现你有新推送的代码,它会自动帮你:停止旧容器 -> 拉取新镜像 -> 启动新容器。
docker run -d \
--name watchtower \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /root/.docker/config.json:/config.json \
containrrr/watchtower \
--cleanup \
--interval 30 \
my-server> 注意:-v /root/.docker/config.json:/config.json 是为了让 Watchtower 共享你刚才 docker login 的凭证,否则它没权限检查私有仓库。
九、验证成果
1. 检查容器是否在跑
执行 docker ps,你应该能看到 my-server 和 watchtower 两个容器都在 Up 状态。
2. 测试自动部署
- 去你的代码里改一个地方(比如改个接口返回的文字)。
- 执行
git push。 - 观察 GitHub Actions 变绿。
- 等 30-60 秒,在服务器输入
docker ps,你会发现my-server的CREATED时间变成了“几秒前”。
十、完成
你现在拥有一套和大型互联网公司一样的 CI/CD 自动化流水线 了。
- 以后改代码:只需
git push。 - 以后上线:只需等待 1 分钟。
- 无需:手动上传 jar 包、手动重启 java、手动登录服务器。
该流水线可以节省打包时间、登录服务器时间、上传删除jar包时间、启动时间,非常舒服。
十一、理解CI/CD 流程
简单来说,CI/CD 是现代软件开发的一套“自动化流水线”。它把你从“手动打包、手动上传、手动重启”的重复劳动中解放出来。
你刚才配置的 GitHub Actions + 阿里云 + Watchtower,其实就是一个标准的 CI/CD 流程。
1. CI:持续集成 (Continuous Integration)
核心:频繁地将代码合并到主干,并通过自动化测试和构建来验证。
- 你之前的操作:你在本地写完
HelloController,执行git push。 - 自动化发生的事:GitHub Actions 接到指令,立刻开始拉取代码、运行 Maven 编译、检查代码有没有错。
- 目的:确保你新写的代码没把原来的功能搞坏,且能成功打成一个 Docker 镜像。
2. CD:持续交付 / 部署 (Continuous Delivery / Deployment)
核心:将集成的代码自动化地发布到生产环境。
- 你之前的操作:镜像传到阿里云,Watchtower 发现更新。
- 自动化发生的事:Watchtower 自动拉取新镜像,替换掉服务器上旧的
my-server。 - 目的:让你的新功能在几分钟内就出现在公网
8080端口上,而不需要你手动登录服务器敲命令。