zl程序教程

您现在的位置是:首页 >  工具

当前栏目

部署Flask项目至远程服务器中的Docker容器内

2023-06-13 09:15:38 时间

前言

需求如标题,需要将Flask项目部署至远程服务器中的Docker容器内,并实现远程访问。本文将从零开始进行操作。

利用虚拟机(Ubuntu 20.04)模拟服务器:

  • 服务器(虚拟机):Ubuntu 20.04
  • 服务器ip:192.168.75.138
  • Docker容器:Ubuntu 23.04

操作

Docker容器创建并初始化

首先利用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

说明:

启动容器

sudo docker container start d90

进入容器

sudo docker exec -it d90 bash

根据文章远程连接服务器中的Docker容器 | 花猪のBlog (cnhuazhu.top)建立外部与容器的ssh连接,如果不需要请忽略此步骤。

Flask项目环境搭建

从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行做如下修改:

启动Flask项目并访问

首先将一个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

说明:

  • 访问ip必须设置为:0.0.0.0
  • 端口需设置为之前Docker容器的映射端口

在外部浏览器访问:http://192.168.75.138:12340/test服务器ip:容器映射端口),便可以访问该项目。

后记

Flask依赖更新的很难受,各种版本不兼容,找了好多帖子,试了很多遍才最终确定。记录可行依赖也是此篇的目的之一。