用Python的Web框架——Flask写了应用,然后就可以放到服务器上。
用Docker的话,贼方便。自己用的Flask项目的基础环境(安装需要的常用的库),可以打包成一个环境镜像。
然后新建Flask项目的话,就在这个镜像的基础上建容器就行了。
需要MySQL的话,再建个MySQL的容器用就行。
此文是一个最基础版,还没带数据库MySQL。用的服务器是CentOS8.2版本。
如果需要配置MySQL的,看这篇:服务器Docker搭建Flask应用(二),
一、创建Flask项目环境镜像(服务器)
1.项目结构(样例)
1 | book_isbn |
2.生成 requirements.txt(本地)
进入book_isbn项目目录的app目录下,运行如下命令,就可以生成项目环境的 requirements.txt 文件。
1 | pip freeze > requirements.txt |
requirements.txt 举例:
1 | click==8.0.1 |
可以看到除了带Flask中常用的库,也带了mysql和selenium、pandas这些,这种随你自己就行,生成的requirements.txt文件中如果有哪些用不着,也可以删除的。这个只要用到的库都装上了,其它的关系不大。
3.用Dockerfile 文件创建镜像
Dockerfile文件内容如下:
1 | # Use an official Python runtime as an image |
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 | docker run -dit --restart=always \ |
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 许可协议。转载请注明出处!