前言

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

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

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

操作

Docker容器创建并初始化

  1. 首先利用Xshell远程连接服务器

  2. 拉取Ubuntu 23.04的镜像

    1
    sudo docker pull ubuntu:23.04
  3. 建立容器

    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

    说明:

  4. 启动容器

    1
    sudo docker container start d90
  5. 进入容器

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

Flask项目环境搭建

  1. 从Anacoda官网www.anaconda.com下载Anaconda3(.sh安装包),并将其移至Docker容器内的/root目录下

  2. 安装Anaconda3

    1
    sh Anaconda3-2022.10-Linux-x86_64.sh

    默认安装即可。

  3. 可以通过添加系统文件路径默认启动(base)虚拟环境,也可以通过如下命令快速启动:

    1
    source $HOME/anaconda3/bin/activate
  4. 创建名为flask_demo的虚拟环境:

    1
    conda create -n flask_demo python=3.7
  5. 激活该虚拟环境:

    1
    conda activate flask_demo
  6. 使用pip安装如下依赖:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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项目并访问

  1. 首先将一个Demo项目传送至容器中的/home路径下,并进入该项目:

  2. app.py文件如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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()的方式启动。

  3. 编写一个简单的视图文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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请求"
  4. 启动项目:

    1
    flask run -h 0.0.0.0 -p 12340

    说明:

    • 访问ip必须设置为:0.0.0.0
    • 端口需设置为之前Docker容器的映射端口
  5. 在外部浏览器访问:http://192.168.75.138:12340/test服务器ip:容器映射端口),便可以访问该项目。


后记

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