Skip to content

一、云服务器

1. 安装Docker

bash
# 1. 一键安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

2. 启动 Docker 并设置开机自启

bash
systemctl start docker
systemctl enable docker

3. 验证是否安装成功(看到版本号即成功)

bash
docker --version

二、创建容器镜像服务

阿里云容器镜像服务(ACR)是目前国内最稳、最快的“镜像中转站”。

容器镜像服务(Container Registry)提供多地域镜像托管能力,稳定的国内外镜像构建服务,便捷的镜像授权功能,方便用户进行镜像全生命周期管理。

按照下面的步骤,创建一个私有且免费的仓库。

1. 进入控制台

  1. 登录 阿里云官网
  2. 在顶部搜索栏输入 “容器镜像服务”,点击进入。
  3. 页面上会让你选择,点击 “个人实例”(个人开发完全免费,够用了)。

2. 设置仓库密码(最关键)

进入个人实例页面后,直接提示设置仓库密码,该密码独立于账号密码。

账户名提示为阿里云的账号名。

3. 创建命名空间(相当于文件夹)

  1. 点击左侧菜单的 【命名空间】
  2. 点击 【创建命名空间】
  3. 名称建议起一个你喜欢的(比如 my-app-space)。
  4. 默认选“私有”,这样除了你谁也看不见。

4. 创建镜像仓库(具体的保险箱)

  1. 点击左侧菜单的 【镜像仓库】
  2. 点击 【创建镜像仓库】
  3. 命名空间:选刚才创建那个。
  4. 仓库名称:起个名字(比如 spring-boot-server)。
  5. 摘要:随便写。
  6. 仓库类型:选择 “私有”
  7. 点击“下一步”,代码源选择 【本地仓库】,最后点击 【创建镜像仓库】

5. 拿到你的地址

创建完成后,点击进入这个仓库,你会看到一串 “公网地址”,类似于: registry.cn-hangzhou.aliyuncs.com/my-app-space/spring-boot-server

三、GitHub代码仓库设置

该部分设置主要是为了将用户名、密码等私密信息保存在GitHub中,而不是在yml的脚本代码中写死,以提高安全性。

注意在**“仓库级别”的设置**,而不是 GitHub 个人全局设置 (Personal Settings)

  1. 点击你仓库顶部的那个 Settings
  2. 在左侧找到 Secrets and variables(通常在 Security 分组下面)。
  3. 点击 Actions
  4. 点击右侧绿色的 New repository secret

进入正确的 Actions 秘密区域,把 ALI_REGISTRYALI_USERNAMEALI_PASSWORD 存进去。**

  1. ALI_REGISTRY: registry.cn-hangzhou.aliyuncs.com (如果你的区域在上海,那就是 cn-shanghai)。
  2. ALI_USERNAME: 你的阿里云账号名。
  3. ALI_PASSWORD: 你刚才设的那个固定密码。

注意,实际仓库名类似crpi-padfae7kjadfdb.cn-hangzhou.personal.cr.aliyuncs.com

四、GitHub Actions 脚本

1. 创建文件夹层级

在你的 Spring Boot 项目根目录下,必须严格按照这个路径新建文件夹(注意前面的点):

  1. 新建文件夹:.github
  2. .github 里面新建文件夹:workflows
  3. workflows 里面新建文件:deploy.yml

2. 编写脚本内容

yaml
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(无后缀),内容如下:

dockerfile
FROM openjdk:17-jdk-alpine
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]

六、观察Actions执行结果

推送代码后,Actions会自动触发,观察执行结果。

执行成功后,可以去阿里云容器服务仓库看到上传的镜像,具体位置在 镜像仓库 -> 镜像版本

七、初次启动

由于你的仓库是私有的,服务器第一次拉取镜像需要“打个招呼”。请在你的云服务器执行:

1. 登录阿里云私有仓库

bash
# 复制你之前的 ALI_REGISTRY 地址,填入你的用户名
docker login --username=你的用户名 crpi-padfae7kjadfdb.cn-hangzhou.personal.cr.aliyuncs.com

执行后输入你在阿里云设置的固定密码。看到 Login Succeeded 即可。

2. 手动启动你的应用(仅需一次)

我们需要先让应用跑起来,给它起个名字叫 my-server

bash
docker run -d \
  --name my-server \
  -p 8080:8080 \
  --restart always \
  crpi-padfae7kjadfdb.cn-hangzhou.personal.cr.aliyuncs.com/huanyu-app-space/my-server:latest

3. 验证应用是否在跑

执行 docker ps,你应该能看到 my-server 容器在 Up 状态。

bash
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-server

4. 接口验证

最直接的方式:浏览器或 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 秒检查一次阿里云,发现你有新推送的代码,它会自动帮你:停止旧容器 -> 拉取新镜像 -> 启动新容器

bash
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-serverwatchtower 两个容器都在 Up 状态。

2. 测试自动部署

  • 去你的代码里改一个地方(比如改个接口返回的文字)。
  • 执行 git push
  • 观察 GitHub Actions 变绿。
  • 等 30-60 秒,在服务器输入 docker ps,你会发现 my-serverCREATED 时间变成了“几秒前”。

十、完成

你现在拥有一套和大型互联网公司一样的 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 端口上,而不需要你手动登录服务器敲命令。