需求如标题,需要将Flask项目部署至远程服务器中的Docker容器内,并实现远程访问。本文将从零开始进行操作。
利用虚拟机(Ubuntu 20.04)模拟服务器:
首先利用Xshell远程连接服务器
拉取Ubuntu 23.04的镜像
sudo docker pull ubuntu:23.04
建立容器
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连接,方便容器内外数据传输。
详情见文章:远程连接服务器中的Docker容器 | 花猪のBlog (cnhuazhu.top)
12340:12340
是为了从外部访问Flask项目所设立的。
注:该端口映射,容器内部与外部必须一致!!!
启动容器
sudo docker container start d90
进入容器
sudo docker exec -it d90 bash
根据文章远程连接服务器中的Docker容器 | 花猪のBlog (cnhuazhu.top)建立外部与容器的ssh连接,如果不需要请忽略此步骤。
从Anacoda官网www.anaconda.com下载Anaconda3
(.sh安装包),并将其移至Docker容器内的/root
目录下
安装Anaconda3
sh Anaconda3-2022.10-Linux-x86_64.sh
默认安装即可。
可以通过添加系统文件路径默认启动(base)
虚拟环境,也可以通过如下命令快速启动:
source $HOME/anaconda3/bin/activate
创建名为flask_demo
的虚拟环境:
conda create -n flask_demo python=3.7
激活该虚拟环境:
conda activate flask_demo
使用pip
安装如下依赖:
Flask==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行做如下修改:
首先将一个Demo项目传送至容器中的/home
路径下,并进入该项目:
app.py
文件如下:
app = 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()
的方式启动。
编写一个简单的视图文件:
test_bp = Blueprint('test', __name__)
# 测试
@test_bp.route('/test', methods=['GET','POST']) # 正常走的GET请求
def test():
if request.method == 'POST':
print("收到并返回post请求")
return "post请求"
if request.method == 'GET':
print("收到并返回get请求")
return "get请求"
启动项目:
flask run -h 0.0.0.0 -p 12340
说明:
0.0.0.0
在外部浏览器访问:http://192.168.75.138:12340/test
(服务器ip:容器映射端口
),便可以访问该项目。
Flask依赖更新的很难受,各种版本不兼容,找了好多帖子,试了很多遍才最终确定。记录可行依赖也是此篇的目的之一。