惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

TaoSecurity Blog
TaoSecurity Blog
博客园 - 司徒正美
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 【当耐特】
M
MIT News - Artificial intelligence
罗磊的独立博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Stack Overflow Blog
Stack Overflow Blog
The GitHub Blog
The GitHub Blog
Google DeepMind News
Google DeepMind News
Security Archives - TechRepublic
Security Archives - TechRepublic
宝玉的分享
宝玉的分享
N
News and Events Feed by Topic
The Hacker News
The Hacker News
Google DeepMind News
Google DeepMind News
C
CERT Recently Published Vulnerability Notes
F
Full Disclosure
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
S
Security @ Cisco Blogs
H
Hacker News: Front Page
L
LangChain Blog
Microsoft Security Blog
Microsoft Security Blog
Y
Y Combinator Blog
B
Blog RSS Feed
H
Heimdal Security Blog
Google Online Security Blog
Google Online Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 三生石上(FineUI控件)
V2EX - 技术
V2EX - 技术
V
Vulnerabilities – Threatpost
Help Net Security
Help Net Security
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Tailwind CSS Blog
W
WeLiveSecurity
T
Tenable Blog
D
DataBreaches.Net
Martin Fowler
Martin Fowler
Cyberwarzone
Cyberwarzone
Cisco Talos Blog
Cisco Talos Blog
S
Secure Thoughts
O
OpenAI News
L
LINUX DO - 热门话题
Vercel News
Vercel News
阮一峰的网络日志
阮一峰的网络日志
Jina AI
Jina AI
J
Java Code Geeks
Know Your Adversary
Know Your Adversary
IT之家
IT之家
Latest news
Latest news
Cloudbric
Cloudbric

博客园 - xiashengwang

Rocky Linux 9 安装docker Rocky Linux 9 与Centos区别,以及软件安装dnf命令 《Linux 基础点滴》:(17)SSH 密钥生成与管理 – 免密登录的利器 Linux服务器安全登录:从入门到实践 putty 基础 《Linux 基础点滴》:(16)firewalld 防火墙管理命令 《Linux 基础点滴》:(15)用户管理 – 创建、删除、权限与 sudo 《Linux 基础点滴》:(14)定时任务 – 用 crontab 自动化 《Linux 基础点滴》:(13)文本编辑入门 – 使用 Vim 《Linux 基础点滴》:(12)tldr – 简化版命令手册 《Linux 基础点滴》:(11)系统信息与资源监控 – 掌握服务器状态 《Linux 基础点滴》:(10)压缩与打包 – tar 的艺术 《Linux 基础点滴》:(9)查找与过滤 – find, grep, 管道 《Linux 基础点滴》:(8)网络基础 – 查看 IP、连通性与端口 《Linux 基础点滴》:(7)进程管理 – 查看与控制运行中的程序 《Linux 基础点滴》:(6)文件权限与所有者 – 保护你的文件 《Linux 基础点滴》:(5)文件与目录操作 – 增删改查必会命令 《Linux 基础点滴》:(4)磁盘空间查看 – df 和 du 的妙用 《Linux 基础点滴》:(3)Linux 文件系统概览 – 一切皆文件 《Linux 基础点滴》:(2)SSH 连接与基础命令 – 从登录到第一次操作 《Linux 基础点滴》:(1)初识 Linux 大家族 – 发行版分类与选择 docker学习(7)-docker compose 文件 docker学习(11)- 容器的日志(log) docker学习(9)-Docker Swarm + Nginx 跨机器负载均衡 docker学习(8)-从 Windows 开发到 Linux 部署 docker学习(6)-数据持久化与网络通信 学会 Git Tag,让版本管理不再混乱 docker学习(5)-Dockerfile docker学习(4)-Docker常用命令 docker学习(3)-一个简单的例子 docker学习(2)-安装 docker学习(1)-基本概念 Github 使用 Self-hosted Runner 实现服务器自动化部署 github创建分支 + Pull Request 合并 Git Rebase vs Git Merge:深入理解与实战选择 Git 系统学习教程:从零到团队协作 AI学习笔记(2)-OpenClaw安装 windbg分析dmp文件 docker desktop 和 Vmware冲突的解决办法
docker学习(10)-利用Github Action 自动化部署
xiashengwang · 2026-04-16 · via 博客园 - xiashengwang

2026-04-16 13:51  xiashengwang  阅读(23)  评论()    收藏  举报

前提条件

  • GitHub账号,docker hub账号,一台服务器
  • 你生成了 SSH 密钥对(私钥 id_rsa,公钥 id_rsa.pub),并将公钥添加到了服务器的 ~/.ssh/authorized_keys

第一步:测试 SSH 连接(端口 6666)

在本地 PowerShell 中执行:

ssh -i C:\Users\wangzheng\.ssh\id_rsa -p 6666 root@104.225.100.100

如果成功登录,说明密钥配置正确。输入 exit 退出。

第二步:创建 GitHub 私有仓库

登录 GitHub
点击右上角 + → New repository
Repository name:flask-ci-demo
选择 Private(私有)
不要勾选 “Initialize this repository with a README”
点击 Create repository
创建后,复制仓库地址(如 https://github.com/你的用户名/flask-ci-demo.git)。

第三步:在本地创建 Flask 项目

创建项目目录

mkdir D:\flask-ci-demo
cd D:\flask-ci-demo

创建 app.py

import os
from flask import Flask

app = Flask(__name__)
greeting = os.environ.get('GREETING', 'Hello')

@app.route('/')
def hello():
    return f'{greeting} from Docker and CI!'

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

创建 requirements.txt

flask==2.3.3

创建 Dockerfile

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]

验证文件已创建:

dir

应该看到 app.py、requirements.txt、Dockerfile。

第四步:推送代码到 GitHub

git init
git add .
git commit -m "Initial commit"
git branch -M main
git remote add origin https://github.com/你的用户名/flask-ci-demo.git
git push -u origin main

(将 你的用户名 替换为你的 GitHub 用户名)

刷新 GitHub 仓库页面,应该能看到代码。

第五步:获取 Docker Hub 访问令牌

登录 Docker Hub
点击右上角头像 → Account Settings → Security
点击 New Access Token
输入描述(如 github-actions),权限选择 Read & Write
点击 Generate,复制生成的令牌(形如 dckr_pat_...)

第六步:在 GitHub 仓库中配置 Secrets

打开你的 GitHub 仓库页面 → Settings → Secrets and variables → Actions

点击 New repository secret,依次添加以下 5 个 Secrets:

名称 说明
DOCKERHUB_USERNAME 你的 Docker Hub 用户名
DOCKERHUB_TOKEN 上一步复制的 Access Token
SERVER_HOST 104.225.100.100(只写 IP,不要端口)
SERVER_USER root(或你的登录用户名)

如何获取 SERVER_SSH_KEY 的值?

在本地 PowerShell 中执行:

Get-Content C:\Users\wangzheng\.ssh\id_rsa | Set-Clipboard

然后粘贴到 Secret 的 value 框中。确保内容包括:

-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----

image

第七步:创建 GitHub Actions 工作流文件

在项目目录 D:\flask-ci-demo 下创建文件夹 .github\workflows:

mkdir .github\workflows

然后创建文件 .github\workflows\deploy.yml,内容如下(注意端口已改为 6666):

name: Deploy Flask App to Server

on:
  push:
    branches: [ "main" ]
  workflow_dispatch:

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

      - name: Log in to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Build and push Docker image
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: ${{ secrets.DOCKERHUB_USERNAME }}/flask-ci-demo:latest

  deploy:
    name: Deploy to Server
    runs-on: ubuntu-latest
    needs: build-and-push
    steps:
      - name: Deploy via SSH
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SERVER_SSH_KEY }}
          port: 6666
          script: |
            docker pull ${{ secrets.DOCKERHUB_USERNAME }}/flask-ci-demo:latest
            docker stop flask-app || true
            docker rm flask-app || true
            docker run -d --name flask-app -p 5000:5000 ${{ secrets.DOCKERHUB_USERNAME }}/flask-ci-demo:latest

保存文件。

第八步:提交并推送工作流文件

git add .github/workflows/deploy.yml
git commit -m "Add CI/CD pipeline with SSH port 6666"
git push origin main

推送后,进入 GitHub 仓库的 Actions 标签页,你会看到一个名为 Deploy Flask App to Server 的工作流正在运行。

第九步:验证部署结果

等待 Actions 执行完成(两个任务都变成绿色勾号)。
image

打开浏览器,访问 http://104.225.100.100(注意:服务器上需要开放 80 端口,并且容器映射了 80 端口)。

如果看到 Hello from Docker and CI!,说明部署成功。
image

第十步:测试自动化更新

修改本地 app.py 中的返回字符串,例如:

    return f'{greeting} from Docker and CI! (auto deployed)'

然后提交推送:

git add app.py
git commit -m "Update message"
git push origin main

再次观察 Actions,会自动触发新的构建和部署。完成后刷新浏览器,内容应已更新。