第一篇:服务器 Docker搭建Flask应用(一) ,没带数据库MySQL。如果是用python自带的 sqlite的话,就比较简单,直接反正就一个数据库文件。
如果要用MySQL的话,就麻烦点。
比如我自己装了一台Ubuntu20.04LTS作小服务器,并没有安装MySQL,然后反正装了Docker,倒也是没啥大关系,用个MySQL的镜像,创建容器就能用了。
一、制作Flask项目镜像(本地) 1.项目结构(样例) 1 2 3 4 5 6 7 8 9 10 flask_demo ├── app │   ├── templates │       └── index.html │   ├── app.py │   ├── Dockerfile │   └── requirements.txt ├── db_data │   └── init.sql └── docker-compose.yml 
其中:Dockerfile、requirements.txt、docker-compose.yml文件都是后面创建的。
2.生成 requirements.txt 进入flask_demo\app目录下,运行如下命令,就可以生成项目环境的 requirements.txt 文件。
1 pip freeze > requirements.txt 
requirements.txt 举例 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 cffi==1.15.1 click==8.1.3 colorama==0.4.6 et-xmlfile==1.1.0 Flask==2.2.2 Flask-SQLAlchemy==3.0.2 Flask-WTF==1.0.1 gevent==22.10.2 greenlet==2.0.1 importlib-metadata==5.2.0 itsdangerous==2.1.2 Jinja2==3.1.2 MarkupSafe==2.1.1 mysqlclient==2.1.1 numpy==1.24.1 openpyxl==3.0.10 pandas==1.5.2 prettytable==3.6.0 pycparser==2.21 pyecharts==2.0.1 PyMySQL==1.0.2 python-dateutil==2.8.2 pytz==2022.7 simplejson==3.18.1 six==1.16.0 SQLAlchemy==1.4.45 wcwidth==0.2.5 Werkzeug==2.2.2 WTForms==3.0.1 zipp==3.11.0 zope.event==4.6 zope.interface==5.5.2 
我安装的库就是这些:pip install flask, flask_wtf, flask_sqlalchemy, pymysql, mysqlclient, pandas, openpyxl, gevent, pyecharts
3.用Dockerfile 文件创建镜像 注意一下,我这个Dockerfile文件只是建立一个初步的环境,后期是可以修改里面的python文件,最后在容器里运行python文件的。所以没把整个项目代码都copy进去。
Dockerfile文件内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 # Use an official Python runtime as an image FROM python:3.9 # Sets the working directory for following COPY and CMD instructions # Notice we haven’t created a directory by this name - this instruction # creates a directory with this name if it doesn’t exist WORKDIR /app # copy code # COPY . /app COPY requirements.txt /app # RUN python -m pip install --upgrade pip # RUN pip install --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org --no-cache-dir -r requirements.txt RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip  RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt  # The EXPOSE instruction indicates the ports on which a container EXPOSE 5002 # Run app.py when the container launches COPY app.py /app # CMD python app.py 
EXPOSE 5020:这里需要改成你自己设置的端口号。Flask一般默认用5000。别的可以啥也不用改。
然后,把app目录中的文件上传到服务器上,比如上传至 flask_demo目录。可以直接用Xftp上传。
然后SSH连接服务器,进入到app 目录,运行以下命令生成镜像:
1 docker build -t flask_demo:1.0 . 
-t 设置镜像名字和版本号
 
执行完,就可以用命令 docker images看到以下镜像了(当然也有python3.9的镜像)。
二、创建Flask项目容器(服务器) 根据刚创建的镜像:flask_demo:1.0 创建一个容器。
因为还涉及到MySQL,所以这里用docker-compose的方法,docker-compose的介绍看这里:Docker-Compose详解 
先在 flask_demo目录下创建个 docker_app 目录,作来做映射需要的。
1.docker-compose.yml文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 version:  "3" services:   app:      image:  flask_demo:1.0      container_name:  my_flask_demo      tty:  true      ports:        -  "5002:5002"        -  "5522:22"      volumes:      -  ./docker_app:/app      environment:        MYSQL_HOST:  db         MYSQL_USER:  root        MYSQL_ROOT_PASSWORD:  123MYSQL321        MYSQL_DATABASE:  flask_demo_mysql    db:      image:  mysql:8.0      container_name:  my_flask_demo_db      restart:  always      ports:        -  "3307:3306"      environment:        MYSQL_ROOT_PASSWORD:  123MYSQL321        MYSQL_DATABASE:  flask_demo_mysql      volumes:        -  ./db_data:/docker-entrypoint-initdb.d/:ro  volumes:   app:    db:  
因为在app中用 restart: always 创建容器后会一直Restarting,所以用了 tty: true
 
db_data/init.sql 文件:
1 2 3 drop  database flask_demo_mysql;create  database flask_demo_mysql;use flask_demo_mysql; 
2.部署Compose应用 docker-compose命令就在有 docker-compose.yml文件的目录下执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 docker-compose up -d docker-compose ps docker ps -a  docker-compose stop docker-compose restart docker-compose down 
3.把app目录下的所有文件复制到docker_app目录中 
cp -r app docker_app/ :表示将app目录及其目录下所有文件复制到docker_app目录下,就会有 docker_app/app目录
cp -r app/. docker_app/ :表示将app目录下所有文件复制到docker_app目录下,不包括app目录
 
以后要改容器中的代码,就直接改这个目录下的代码就行了。
三、后台一直运行app.py 这个用nohup命令,有文章写过介绍了:Linux nohup 后台运行 命令详解 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 docker exec  -it my_flask_demo /bin/bash nohup python3 -u app.py > /dev/null 2>&1 & ps -aux | grep "app.py"  kill  [PID]exit 
四、MySQL 看 docker-compose.yml文件内容:
1 2 3 4 5 6 MYSQL_USER:  root MYSQL_ROOT_PASSWORD:  123MYSQL321 MYSQL_DATABASE:  flask_demo_mysql "3307:3306" 
所以在Flask使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 mysql_host = '192.168.1.121'  mysql_user = 'root'  mysql_passwd = '123MYSQL321'  mysql_db = 'flask_demo_mysql'  mysql_port = 3307  DATABASE_URI = 'mysql://'  + mysql_user + ':'  + mysql_passwd + '@'  + mysql_host + ':'  + str (mysql_port) + '/'  + mysql_db app.config['SQLALCHEMY_DATABASE_URI' ] = DATABASE_URI app.config['SQLALCHEMY_TRACK_MODIFICATIONS' ] = False  db = SQLAlchemy(app)