python-flask项目开发部署:

  1. 完整开发实战总结:https://blog.csdn.net/qq_38444844/article/details/151928286?spm=1011.2415.3001.5331
  2. 项目源码:https://gitee.com/loveTianWen/Forum-platform/tree/master
  3. Flask 项目部署阿里云技术大纲:https://blog.csdn.net/qq_38444844/article/details/154584891?spm=1011.2415.3001.5331
  4. Ansible 实现自动化多机部署Flask 项目(完整过程总结):https://blog.csdn.net/qq_38444844/article/details/155381768?sharetype=blogdetail&sharerId=155381768&sharerefer=PC&sharesource=qq_38444844&spm=1011.2480.3001.8118
  5. Flask 项目在阿里云上的完整部署指南:https://blog.csdn.net/qq_38444844/article/details/154574970?spm=1011.2415.3001.5331

目的:ECS → Gitee → Docker → ACR:一次完整的应用部署实践记录

在这里插入图片描述

第一步:把flask项目推送到gitee

1、git推送命令流程

1 输入命令连接服务器
ssh root@47.96.22.96   
    

2 找到你的 Flask 项目路径(普通用户加sudo)
# find语法:find 路径 -选项 值 -选项 值 ,在 / 下找所有类型是目录且名字匹配 Forum-platform 的东西,然后把标准错误(stderr) 的输出丢弃
find / -type d -name "Forum-platform" 2>/dev/null


3 进入项目目录
cd /home/Forum-platform


4 安装git并自动确认
sudo dnf install git -y
or
sudo apt install git -y


5 配置 Git 用户信息
git config --global user.name 'yuan'
git config --global user.email 'your注册邮箱'


6 初始化 Git 本地仓库
git init


6.1 添加 .gitignore 防止提交 venv
cat > .gitignore << 'EOF'
# Virtual environments
venv/
env/
ENV/

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# Logs
*.log

# Local config
.env
config.py
EOF




7 添加所有文件到 Staging Area 暂存区
git add .


8 提交到本地仓库,并加上备注
git commit -m "Initial commit: Flask project from server"


9 关联Gitee 仓库,使用 HTTPS 方式推送(简单)
git remote add origin https://gitee.com/loveTianWen/ecs_flask.git


10 查看所有分支:本地和远程
git branch -a



11 推送代码到 Gitee 远程仓库的主分支
git push -u origin master

	
12 输入用户名
Username: loveTianWen
Password: 你的 Gitee 私人令牌(Personal Token),不是登录密码!Gitee 已禁止直接用密码推送!

语法拓展

a find 命令基本语法

基本语法:
find [起始路径] [选项] [表达式]

find 路径 -选项 值 -选项 值 ...


在 /home 下找所有类型是目录且名字匹配 *log 的东西; -type d 就是“只找目录”
find /home -type d -name "*log"
  • -type 用于指定文件类型。
字符 含义
f 普通文件(file)
d 目录(directory)
l 符号链接(link)
c 字符设备(character device)
b 块设备(block device)
p 命名管道(pipe)
s 套接字(socket)

b 2>/dev/null命令

1、把 标准错误(stderr) 的输出丢弃(重定向到 /dev/null,即“黑洞”)

2> 是重定向,/dev/null 是 Linux 中的“垃圾桶”,写进去的内容会被丢弃。
文件描述符 名称 默认指向
0 标准输入(stdin) 键盘
1 栙准输出(stdout) 屏幕
2 标准错误(stderr) 屏幕

2、Token令牌获取

登录 https://gitee.com → 右上角头像 → 设置 → 安全设置 → 个人访问令牌 创建一个新Token,名字如:deploy-token
权限勾选:repo(仓库读写)
复制生成的 Token

在这里插入图片描述

3、SSH公钥认证(可选)

  • 推荐用 SSH公钥认证 推送 代替 http 避免每次输密码(更安全):
1 在服务器上生成 SSH 密钥(本地)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"


2 添加公钥到Gitee(远程网站),如下所示
把公钥(~/.ssh/id_rsa.pub)复制到 Gitee → 设置 → SSH 公钥
改用 SSH 地址


3 使用SSH地址连接
git remote add origin git@gitee.com:loveTianWen/ecs_flask.git
  • 添加公钥到Gitee

在这里插入图片描述

第二步:把flask打包成 Docker 镜像,并推送到 ACR容器仓库

部署流程

  • 目标:将一个基于 Flask 的 Forum-platform 项目打包成 Docker 镜像,并通过 Gunicorn 作为生产级 WSGI服务器运行,最终推送至阿里云 ACR 实现跨环境部署。
步骤 目的
1. 生成 Dockerfile 定义容器构建规则:使用 Python 镜像、装依赖、复制代码、用 Gunicorn 启动
2. 确认 app 实例名 确保 Gunicorn 能正确导入 Flask 应用(app:app 格式)
3. 构建镜像 本地生成名为 forum-app:latest 的 Docker 镜像
4. 测试运行 启动容器并检查日志,验证是否成功监听 5000 端口
5. 推送至 ACR 将镜像上传到阿里云容器镜像仓库,供其他机器拉取部署
清理 删除测试容器,保持环境干净

1、配置 Dockerfile文件(使用 Gunicorn)

  • Dockerfile配置文件
cat << 'EOF' | sudo tee Dockerfile > /dev/null
# 使用国内加速的 Python 3.10 slim 镜像
FROM docker.m.daocloud.io/library/python:3.10-slim-bookworm


# 设置工作目录
WORKDIR /app


# 安装系统依赖(部分包如 cryptography 可能需要 gcc)
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
        gcc \
        default-libmysqlclient-dev \
        curl \
    && rm -rf /var/lib/apt/lists/*


# 复制依赖文件并用清华源安装 Python 包
COPY requirements.txt .
RUN pip install --no-cache-dir \
    -i https://pypi.tuna.tsinghua.edu.cn/simple \
    --trusted-host pypi.tuna.tsinghua.edu.cn \
    -r requirements.txt


# 复制整个应用代码
COPY . .


# 暴露端口(与 Gunicorn 绑定端口一致)
EXPOSE 5000


# 启动命令:使用 Gunicorn 运行 Flask 应用(格式:module:instance)
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "--workers", "2", "app:app"]
EOF

2、确认 flask项目中的app.py 中有 app 实例

在 app.py 文件中查找包含 "Flask(" 的行,并显示行号
grep -n 'Flask(' app.py


结果
9:app = Flask(__name__)

注意:
1 只要变量名是 app,Dockerfile中Gunicorn 的 “app:app” 就能正确加载
2 如果变量名是 application,Gunicorn启动命令就改成 :CMD [“gunicorn”, “–bind”,“0.0.0.0:5000”, “–workers”, “2”,“app:application”]

grep 基础语法

语法:grep [选项] "要找的内容" 文件名
grep -n 'Flask(' app.py


结果
9:app = Flask(__name__)
部分 说明
grep Linux/Unix 中用于文本搜索的命令(Global Regular Expression Print)
-n 显示匹配行的行号(例如:5:app = Flask(__name__)
'Flask(' 要搜索的字符串内容。用单引号包裹,表示原样匹配(不解析特殊字符)
app.py 要搜索的目标文件
  • 常用选项(flags)
选项 作用
-n 显示匹配行的行号
-i 忽略大小写(如 flask( 也能匹配)
-v 反向匹配(显示不包含该模式的行)
-r-R 递归搜索目录下所有文件
-l 只显示包含匹配的文件名,不显示内容
-F 按固定字符串匹配(禁用正则表达式,更安全)
-A N 显示匹配行及之后 N 行(After)
-B N 显示匹配行及之前 N 行(Before)
-C N 显示匹配行及前后各 N 行(Context)

3、构建 Docker 镜像

生成名为 forum-app:latest 的 Docker 镜像(注意末尾的 . :表示构建上下文(当前目录))
sudo docker build -t forum-app:latest .


结果:
Successfully built xxxxxxx
Successfully tagged forum-app:latest

拓展:

a 其中 . 表示构建上下文的根目录是当前工作目录

1、 如果当前在/home/Forum-platform目录,. = /home/Forum-platform
2 、Docker会把该目录下的所有文件(除 .dockerignore 排除的外)打包发送给 Docker 引擎,供 Dockerfile 中的COPY、ADD 等指令使用。

b 上下文构建过程(Build Context)

1、Docker CLI 会把 . 指定的目录(这里是当前目录),整个打包成一个 tar 包
2、然后发送给 Docker守护进程(Docker daemon) Docker daemon 在自己的隔离环境中读取 Dockerfile,并执行其中的指令(如COPY . .)

  • 关键:Dockerfile 中的 COPY 或 ADD 只能访问“构建上下文”内的文件,不能访问上下文之外的任何路径!

4、验证镜像是否能运行

启动容器并检查日志,验证是否成功监听 5000 端口(后台运行)
sudo docker run -d --name forum-test -p 5000:5000 forum-app:latest


查看日志(应看到 Gunicorn 启动信息)
sudo docker logs forum-test


正常输出:
Starting gunicorn 21.2.0
Listening at: http://0.0.0.0:5000
  • -p 5000:5000 端口映射
端口映射
-p 5000:5000


publish端口映射:格式为 -p <宿主机端口>:<容器端口>
 把宿主机的 5000 端口流量转发到容器内部的 5000 端口
 这样才能通过 http://服务器IP:5000 访问 Flask 应用
  • docker命令参数
命令 关键参数 含义 缩写来源
docker run -d 后台运行 detached
--name 指定容器名 name
-p 端口映射 publish
docker logs (无特殊参数) 查看容器日志 logs = 日志

5、推送到阿里云ACR容器镜像仓库

5.1 登录 ACR(替换为你的实际地址)

从 ACR 控制台获取登录命令(临时 Token)

sudo docker login --username=cr_temp_user --password=xxx crpi-xxxxxx.cn-shenzhen.personal.cr.aliyuncs.com

5.2 打标签并推送

1 替换为你的阿里云容器镜像服务(ACR)地址
ACR_ADDR="crpi-xxxxxx.cn-shenzhen.personal.cr.aliyuncs.com"


2 替换为你的命名空间
NAMESPACE="your-namespace"


3 给本地镜像打标签,格式:[ACR地址]/[命名空间]/[镜像名]:[标签]
sudo docker tag forum-app:latest ${ACR_ADDR}/${NAMESPACE}/forum-app:v1.0


4 推送镜像到阿里云 ACR
sudo docker push ${ACR_ADDR}/${NAMESPACE}/forum-app:v1.0

6、推送成功后,任何机器(ECS、本地、K8s)都可以拉取部署:

1 拉取阿里云 ACR上的应用镜像到本地
sudo docker pull crpi-xxxxxx.cn-shenzhen.personal.cr.aliyuncs.com/your-namespace/forum-app:v1.0


2 测试是否成功
sudo docker run -d -p 5000:5000 crpi-xxxxxx.../forum-app:v1.0

清理测试容器(可选)

先停止,在删除容器
sudo docker stop forum-test && sudo docker rm forum-test
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐