Devops小项目:一个“可运行的”待办事项API

📝 项目概览:一个"可运行的"待办事项API

  • 应用名称todo-api

  • 核心功能 :一个简单的RESTful API,用于管理待办事项,并提供一个/health健康检查端点。

  • 技术栈:Python + Flask(轻量级,便于快速开发)。

  • 目标:从零开始,构建一个可以通过Docker运行、并能自动构建和部署到云端的完整项目。

整体的运转过程如图:

📁 第一步:项目结构与应用代码

首先,为你的项目创建一个清晰的目录结构:

text

复制代码
todo-api/
├── app.py              # 应用主入口
├── requirements.txt    # Python依赖
├── Dockerfile          # 容器构建文件
├── .github/
│   └── workflows/
│       └── ci-cd.yml   # GitHub Actions 流水线定义
└── README.md           # 项目说明文档

1. 编写应用代码 (app.py)

这是一个使用Flask框架的简单API,包含了我们需要的两个核心功能:

python

复制代码
from flask import Flask, jsonify, request

app = Flask(__name__)

# 一个简单的内存数据库,用于存储待办事项
todos = [
    {"id": 1, "task": "学习DevOps"},
    {"id": 2, "task": "完成实习项目"}
]

@app.route('/')
def hello():
    return "Hello, DevOps!"

# 1. 业务功能:获取所有待办事项
@app.route('/todos', methods=['GET'])
def get_todos():
    return jsonify(todos)

# 2. 健康检查端点,对容器编排和监控至关重要
@app.route('/health')
def health_check():
    return jsonify({"status": "healthy"}), 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

2. 定义依赖 (requirements.txt)

txt

复制代码
Flask==2.3.2

🐳 第二步:容器化------编写 Dockerfile

Dockerfile 是让你的应用在任何地方都能一致运行的关键。

dockerfile

复制代码
# 使用轻量级的Python官方镜像作为基础
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 复制依赖文件并安装
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 声明容器运行时监听的端口
EXPOSE 5000

# 定义容器启动时运行的命令
CMD ["python", "app.py"]

验证 :在项目根目录下,运行 docker build -t todo-api .docker run -p 5000:5000 todo-api,然后在浏览器访问 http://localhost:5000/health,确认能看到 {"status":"healthy"} 的返回。

📝 项目概览:一个"可运行的"待办事项API

⚙️ 第三步:CI/CD------配置 GitHub Actions 流水线

接下来,我们将配置 GitHub Actions,让它在我们每次推送代码时,自动完成应用的构建、并推送镜像到仓库。

  1. 在GitHub上创建仓库,并将本地代码推送上去。

  2. 配置仓库密钥 (Secrets)

    • 进入仓库的 Settings -> Secrets and variables -> Actions

Settings:

Secrets and variables

Actions:

    • 点击 New repository secret,添加以下密钥:

      • DOCKER_USERNAME:你的Docker Hub用户名。

      • DOCKER_PASSWORD:你的Docker Hub密码或访问令牌(Access Token)。

  1. 创建工作流文件

    在项目的 .github/workflows/ 目录下创建 ci-cd.yml 文件:

yaml

复制代码
name: Build and Push Docker Image

on:
  push:
    branches: [ "main" ]  # 当代码推送到main分支时触发

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ${{ secrets.DOCKER_USERNAME }}/todo-api:latest

验证 :推送此工作流文件到GitHub后,在仓库的 Actions 选项卡中,你应该能看到一个新的工作流正在运行。如果它显示为绿色(成功),恭喜你,你的CI流水线已经搭建好了!

复制代码
git status                         # 查看文件状态
git add .                          # 添加所有文件
git commit -m "初始化项目"          # 提交
git remote -v                      # 检查远程仓库是否关联
git remote add origin https://github.com/zxcspider/cicd-demo.git  # 如未关联则执行
git branch -M main                 # 确保分支名正确
git push -u origin main            # 推送到 GitHub

☁️ 第四步:部署到云------以 阿里云为例

最后,我们将应用部署到云上,让它成为一个真正可访问的服务。

  1. 启动一个EC2实例

    • 在AWS控制台选择EC2服务,点击"启动实例"。

    • 选择Amazon Linux 2 AMI,实例类型选择 t2.micro

    • 关键步骤 :在"安全组"设置中,添加一条规则,允许来自 0.0.0.0/0 (即任何IP) 的 5000 端口TCP访问。这样你才能从外部访问到你的应用。

  2. 连接到你的EC2实例:使用SSH客户端(如终端或PuTTY)连接到你的实例。

  3. 在EC2上安装Docker并运行容器

    连接到实例后,执行以下命令安装Docker并运行你的应用容器:

    bash

    复制代码
    📝 第一步:注册阿里云账号并完成实名认证
    首先,你需要一个阿里云账号。
    
    注册账号:访问阿里云官网,点击右上角的"免费注册",按提示完成注册。
    
    实名认证:注册后,需要完成实名认证才能使用云服务。可以在控制台的"账号中心"找到认证入口。
    
    注意:新用户通常可以免费试用ECS实例3个月。在创建实例时,可以留意一下是否有试用资格。
    
    🚀 第二步:创建ECS实例(云服务器)
    登录控制台:进入阿里云管理控制台。
    
    进入ECS控制台:在左上角菜单中,选择"云服务器 ECS"。
    
    创建实例:在"实例"列表页面,点击"创建实例"。
    
    配置实例(按以下示例选择):
    
    配置项	推荐值	说明
    付费类型	按量付费	练习使用更灵活,不用了可以随时释放,避免持续扣费
    地域	离你最近的地域	选择如"华东1(杭州)",网络延迟更低
    实例规格	ecs.t5-lc1m1.small 或 ecs.t6-c1m1.large	这些是入门级规格,通常足够运行一个Docker容器,且在免费试用范围内
    镜像	Alibaba Cloud Linux 3	阿里云官方优化版Linux,对Docker支持良好
    存储	默认配置	一般40 GiB的系统盘足够
    公网IP	勾选"分配公网IPv4地址"	这样你的实例才能被外网访问
    安全组	新建安全组	我们将在下一步详细配置
    登录凭证	自定义密码	设置一个root密码,用于SSH登录
    注意:在"安全组"配置中,可以先勾选"HTTP (TCP:80)"和"HTTPS (TCP:443)"等常用规则。
    
    确认下单:检查配置和费用,确认无误后,阅读并同意服务协议,点击"确认下单"。
    
    🔧 第三步:配置安全组(开放端口)
    实例创建后,需要配置安全组规则,允许外部访问你的应用。
    
    找到安全组:在ECS控制台左侧菜单,点击"网络与安全" > "安全组"。
    
    管理规则:找到你实例绑定的安全组,点击"管理规则"。
    
    添加入方向规则:点击"入方向" > "快速添加"或"手动添加"。你需要添加两条规则:
    
    端口	目的	授权对象	说明
    22	SSH远程连接	你的公网IP(如 123.123.123.123/32)	安全建议:只允许你自己的IP连接,避免被攻击
    5000	访问你的应用	0.0.0.0/0	允许所有IP访问你的Flask应用
    如何查看自己的公网IP? 在浏览器中搜索"IP"即可。
    
    添加规则时,协议类型选择"自定义TCP",端口范围分别填 22/22 和 5000/5000。
    
    🔗 第四步:连接到你的ECS实例
    现在,你可以通过SSH连接到云服务器了。
    
    方式一:使用阿里云Workbench(推荐):在ECS实例列表页面,点击对应实例右侧的"远程连接",选择"Workbench远程连接",输入你设置的root密码即可登录。这是最方便的方式。
    
    方式二:使用本地终端(Terminal / PowerShell):
    
    打开你的终端(Mac/Linux)或PowerShell(Windows)。
    在ECS控制台找到你的公网IP地址。
    执行以下命令(将IP地址替换为你的真实IP):
    bash
    ssh root@<你的公网IP地址>
    首次连接会提示验证指纹,输入 yes 即可。
    输入你创建实例时设置的root密码。
    🐳 第五步:在ECS上安装Docker并运行你的应用
    连接上服务器后,就可以安装Docker并运行你的应用了。
    
    安装Docker:
    因为用的是Alibaba Cloud Linux 3系统,可以按照以下步骤安装:
    
    bash
    # 1. 安装 dnf(新一代包管理器)
    yum install dnf -y[reference:36]
    
    # 2. 安装 Docker 依赖
    dnf install device-mapper-persistent-data lvm2 -y[reference:37]
    
    # 3. 添加阿里云镜像的 Docker 软件源
    dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo[reference:38]
    
    # 4. 安装 Docker
    dnf -y install docker-ce --nobest[reference:39]
    启动Docker服务并设置开机自启:
    
    bash
    # 启动 Docker 服务
    systemctl start docker
    # 设置 Docker 开机自启动
    systemctl enable docker
    从Docker Hub拉取你的镜像:
    现在,可以从你之前推送到的Docker Hub拉取镜像了。
    
    bash
    docker pull <你的Docker Hub用户名>/todo-api:latest
    运行你的容器:
    最后,在后台运行你的应用容器。
    
    bash
    docker run -d -p 5000:5000 <你的Docker Hub用户名>/todo-api:latest
    ✅ 第六步:验证部署
    一切就绪后,在本地浏览器中访问:
    http://<你的ECS公网IP地址>:5000/health
    
    如果能看到 {"status":"healthy"} 的返回,就说明你的应用已经在阿里云上成功运行了!
    
    💎 总结与后续
    至此,你已经在阿里云上完整地部署了你的应用。与AWS的流程相比,核心概念是相通的,只是产品名称(ECS vs EC2)和具体操作界面不同。
    
    完成这一步后,你的DevOps实习项目就真正"上线"了。之后,你还可以在这个基础上继续探索更高级的主题,比如:
    
    使用阿里云容器服务ACK 来管理Kubernetes集群。
    
    使用Terraform 或阿里云的ROS(资源编排)实现基础设施即代码。
    
    配置日志服务和云监控,实现更完善的运维体系。
    
    如果在操作中遇到任何问题,随时可以把错误信息贴给我,我帮你一起看看。

最终验证 :在浏览器中访问 http://<你的EC2实例公网IP>:5000/health。如果看到 {"status":"healthy"},恭喜你!你的第一个"实习级"DevOps项目已经成功上线了!