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

用Python的Web框架——Flask写了应用,然后就可以放到服务器上。

用Docker的话,贼方便。自己用的Flask项目的基础环境(安装需要的常用的库),可以打包成一个环境镜像。

然后新建Flask项目的话,就在这个镜像的基础上建容器就行了。
需要MySQL的话,再建个MySQL的容器用就行。

此文是一个最基础版,还没带数据库MySQL。用的服务器是CentOS8.2版本。
如果需要配置MySQL的,看这篇:服务器Docker搭建Flask应用(二)

一、创建Flask项目环境镜像(服务器)

1.项目结构(样例)

1
2
3
4
5
6
7
book_isbn
├── app
│ ├── templates
│ └── index.html
│ ├── app.py
│ ├── Dockerfile
│ └── requirements.txt

2.生成 requirements.txt(本地)

进入book_isbn项目目录的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
click==8.0.1
colorama==0.4.4
et-xmlfile==1.1.0
Flask==2.0.1
Flask-MySQLdb==0.2.0
Flask-SQLAlchemy==2.5.1
Flask-WTF==0.15.1
greenlet==1.1.0
itsdangerous==2.0.1
Jinja2==3.0.1
MarkupSafe==2.0.1
mysqlclient==2.0.3
numpy==1.22.2
openpyxl==3.0.9
pandas==1.4.1
PyMySQL==1.0.2
python-dateutil==2.8.2
pytz==2021.3
six==1.16.0
SQLAlchemy==1.4.21
Werkzeug==2.0.1
WTForms==2.3.3
xlrd==2.0.1
pandas==1.4.1
requests==2.27.1
selenium==4.1.3
urllib3==1.26.9

可以看到除了带Flask中常用的库,也带了mysql和selenium、pandas这些,这种随你自己就行,生成的requirements.txt文件中如果有哪些用不着,也可以删除的。这个只要用到的库都装上了,其它的关系不大。

3.用Dockerfile 文件创建镜像

Dockerfile文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 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
# 我这里app.py中run的port=5020,所以开的是这个端口,你的看你自己的设置
EXPOSE 5020

# Run app.py when the container launches
COPY app.py /app
# CMD ["python", "app.py"]

EXPOSE 5020:这里需要改成你自己设置的端口号。
别的可以啥也不用改。

当然,现在需要把这整个项目的文件上传到服务器上。我这直接用Xftp上传到了 /root/flask/book_isbn/app目录。

然后SSH连接服务器,进入到 /root/flask/book_isbn/app 目录,运行以下命令生成镜像:

1
docker build -t book_isbn:v1.0 .

-t 设置镜像名字和版本号

执行完,就可以用命令 docker images看到以下镜像了(当然也有python3.9的镜像)。如图:

注意:有一点说明一下,如果你的Flask项目是做一个完整的项目,后续不修改代码,直接打包的一个Web项目。那requirements.txt 文件就不用都扔进去;这个Dockerfile文件也不能这样写简略,要把项目代码都copy进去,直接的CMD也要用起来,要运行app.py的。(我这只是搭基础环境的,都是后续在里面改项目代码的)

二、创建Flask项目容器(服务器)

直接根据刚创建的镜像:book_isbn:v1.0 创建一个容器。

1.创建容器(book_isbn)

后退(cd ..),回到book_isbn目录下。运行以下命令:

1
2
3
4
5
docker run -dit --restart=always \
-p 5020:5020 \
-p 5022:22 \
-v `pwd`/docker_app/:/app/ \
--name book_isbn book_isbn:v1.0 /bin/bash

pwd/docker_app/:其中pwd是用的命令形式,表示当前目录。
第4行表示将服务器中的 当前目录下的docker_app 目录挂载到容器中的 /app目录(这是创建镜像时设的WORKDIR 工作目录

执行完后,用docker ps -a命令查看,就可以容器列表了。如下图所示:

同时,在book_isbn目录下也生成了一个 docker_app目录。

2.把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目录

以后要改容器中的代码,就直接改这个目录下的代码就行了。
可以用VS Code远程连接,也可以用Cloud Studio,然后修改项目中的文件就行。

而原来的book_isbn/app目录也不需要了,可以删除,不删除久了自己可能也会忘记、搞混。可以需要重新创建容器的时候再上传就行了。

三、后台一直运行app.py

这个用nohup命令,有文章写过介绍了:Linux nohup 后台运行 命令详解

1.进入容器

1
docker exec -it book_isbn /bin/bash

2.后台运行Flask项目

1
nohup python -u app.py > /dev/null 2>&1 &

运行后,会显示进程的PID。

命令详解

1.最后一个“&”:表示后台运行程序
2.“nohup” :表示程序不被挂起
3.“python”:即python.exe,执行python代码
4.“-u”:表示不启用缓存,实时输出打印信息到日志文件(如果不加-u,则会导致日志文件不会实时刷新代码中的print函数的信息)
5.“app.py”:表示python的源代码文件
6.“>”:表示将打印信息重定向到日志文件
7.“/dev/null”:我这里就不要日志文件了
8.“2>&1”:表示将标准错误输出转变化标准输出,可以将错误信息也输出到日志文件中(0-> stdin, 1->stdout, 2->stderr)

当后台运行app.py后,就可以通过服务器的ip地址访问了。比如我的服务器ip地址为:43.142.94.65,那在浏览器里就可以用以下地址访问了:http://43.142.94.65:5020/
如图所示:

3.结束后台运行进程(容器内)

进程在后台运行,想要关闭就要查看进程的PID。想要修改代码,就需要先结束进程。

可以通过搜索查找这个命令的PID。

1).用命令查找进程的PID

可以通过以下命令查找:

1
ps -aux | grep "app.py"

结果如图:

用户名后面一项就是PID,可以看到PID=36。

还可以用 top -p 36命令确认下471进程是不是这个app.py的进程。

2).结束进程

运行命令:

1
kill [PID]

比如上面的进程就是kill 36,就可以结束这个app.py的进程了。

  • 本文标题:服务器 Docker搭建Flask应用(一)
  • 本文作者:HDUZN
  • 创建时间:2022-05-28 21:34:39
  • 本文链接:http://hduzn.cn/2022/05/28/服务器Docker搭建Flask应用(一)/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论