从ECS云服务器到 Gitee + Docker + ACR:Flask 项目全链路部署记录
·
python-flask项目开发部署:
- 完整开发实战总结:https://blog.csdn.net/qq_38444844/article/details/151928286?spm=1011.2415.3001.5331
- 项目源码:https://gitee.com/loveTianWen/Forum-platform/tree/master
- Flask 项目部署阿里云技术大纲:https://blog.csdn.net/qq_38444844/article/details/154584891?spm=1011.2415.3001.5331
- 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
- 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
更多推荐




所有评论(0)