服务器Docker搭建Flask应用(二)
HDUZN

第一篇:服务器 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上传。
(app目录下只需要:Dockerfile、requirements.txt、app.py文件就行)

然后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
# -d参数令应用在后台启动
# 默认情况下该命令会读取名为 docker-compose.yml,也可以使用-f指定其他文件名。
# docker-compose -f docker-compose.yml up -d

# 其它常用docker-compose命令
# 列出Compose应用中的各个容器
docker-compose ps
docker ps -a # 显示包括停止的容器
# 停止Compose应用相关的所有容器,但不会删除它们
docker-compose stop
# 重启已停止的Compose应用
docker-compose restart
# 停止并删除运行中的Compose应用,会删除容器和网络,但是不会删除卷和镜像。
docker-compose down

3.把app目录下的所有文件复制到docker_app目录中

1
cp -r 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
# 1.进入容器
docker exec -it my_flask_demo /bin/bash

# 2.后台运行Flask项目,运行后,会显示进程的PID
# 运行后就可以通过:http://192.168.1.121:5002 访问了。
nohup python3 -u app.py > /dev/null 2>&1 &

# 3.结束进程
# 1).查找进程,找到app.py进程的PID
ps -aux | grep "app.py"
# 2).结束进程
kill [PID]

# 5.退出容器
exit

四、MySQL

看 docker-compose.yml文件内容:

1
2
3
4
5
6
MYSQL_USER: root
MYSQL_ROOT_PASSWORD: 123MYSQL321
MYSQL_DATABASE: flask_demo_mysql

# 端口已经从3306映射到3307了
"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://root:123MYSQL321@192.168.1.121:3307/flask_demo_mysql'
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)
  • 本文标题:服务器Docker搭建Flask应用(二)
  • 本文作者:HDUZN
  • 创建时间:2023-01-14 17:45:58
  • 本文链接:http://hduzn.cn/2023/01/14/服务器Docker搭建Flask应用(二)/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论