部署Flask项目至远程服务器中的Docker容器内
前言
需求如标题,需要将Flask项目部署至远程服务器中的Docker容器内,并实现远程访问。本文将从零开始进行操作。
利用虚拟机(Ubuntu 20.04)模拟服务器:
- 服务器(虚拟机):Ubuntu 20.04
- 服务器ip:192.168.75.138
- Docker容器:Ubuntu 23.04
操作
Docker容器创建并初始化
-
首先利用Xshell远程连接服务器
-
拉取Ubuntu 23.04的镜像
1
sudo docker pull ubuntu:23.04
-
建立容器
1
sudo docker run -it -d -p 9510:22 -p 12340:12340 --name flask_demo --shm-size 4g ubuntu:23.04 /bin/bash
容器id为:
d900b1fc6b78b0a125ee37cabd5ee31b829075eeaa38a8df7e6e61fbf9cda601
说明:
-
第一个端口映射
9510:22
是为了建立ssh连接,方便容器内外数据传输。 -
第二个端口映射
12340:12340
是为了从外部访问Flask项目所设立的。注:该端口映射,容器内部与外部必须一致!!!
-
-
启动容器
1
sudo docker container start d90
-
进入容器
1
sudo docker exec -it d90 bash
-
根据文章远程连接服务器中的Docker容器 | 花猪のBlog (cnhuazhu.top)建立外部与容器的ssh连接,如果不需要请忽略此步骤。
Flask项目环境搭建
-
从Anacoda官网www.anaconda.com下载
Anaconda3
(.sh安装包),并将其移至Docker容器内的/root
目录下 -
安装
Anaconda3
1
sh Anaconda3-2022.10-Linux-x86_64.sh
默认安装即可。
-
可以通过添加系统文件路径默认启动
(base)
虚拟环境,也可以通过如下命令快速启动:1
source $HOME/anaconda3/bin/activate
-
创建名为
flask_demo
的虚拟环境:1
conda create -n flask_demo python=3.7
-
激活该虚拟环境:
1
conda activate flask_demo
-
使用
pip
安装如下依赖:1
2
3
4
5
6
7
8
9Flask==1.1.4
Flask-Cors==1.10.0
Flask-Migrate==2.0.0
Flask-Script==2.0.6
Flask-SQLAlchemy==1.0
Jinja2==2.10.1
MarkupSafe==2.0.1
SQLAlchemy==1.4.18
Werkzeug==1.0.1注意:
-
经测试这些依赖版本不冲突,且可以满足基本的数据库操作。
-
安装时可以更换镜像源,或者直接在其后添加
-i
参数,如:pip install Flask==1.1.4 -i https://pypi.tuna.tsinghua.edu.cn/simple
-
按照以上方式安装依赖会报以下错误:
ModuleNotFoundError: No module named 'flask.ext'
主要原因是新版的flask抛弃了
flask.ext
这种引入扩展的方法,需要更改为:flask_扩展名
需要根据报错路径将
flask_sqlalchemy
依赖中__init__.py
文件的第30行做如下修改:
-
启动Flask项目并访问
-
首先将一个Demo项目传送至容器中的
/home
路径下,并进入该项目: -
app.py
文件如下:1
2
3
4
5
6
7
8
9
10app = create_app()
CORS(app, supports_credentials=True) #配置全局路由
manager = Manager(app=app)
migrate = Migrate(app=app, db=db)
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
manager.run()本项目是使用
manager.run()
的方式启动。 -
编写一个简单的视图文件:
1
2
3
4
5
6
7
8
9
10
11test_bp = Blueprint('test', __name__)
# 测试
# 正常走的GET请求
def test():
if request.method == 'POST':
print("收到并返回post请求")
return "post请求"
if request.method == 'GET':
print("收到并返回get请求")
return "get请求" -
启动项目:
1
flask run -h 0.0.0.0 -p 12340
说明:
- 访问ip必须设置为:
0.0.0.0
- 端口需设置为之前Docker容器的映射端口
- 访问ip必须设置为:
-
在外部浏览器访问:
http://192.168.75.138:12340/test
(服务器ip:容器映射端口
),便可以访问该项目。
后记
Flask依赖更新的很难受,各种版本不兼容,找了好多帖子,试了很多遍才最终确定。记录可行依赖也是此篇的目的之一。