Flask项目容器化部署

Docker部署Flask项目:

参考链接: https://zhuanlan.zhihu.com/p/78432719


基础介绍:

  • Flask :python最流行的两个框架之一(django、flask),轻量级是最大的特点
  • Gunicorn:Flask应用是一个符合WSGI规范的Python应用,不能独立运行(类似app.run的方式仅适合开发模式),需要依赖其他的组件提供服务器功能。
  • gevent:gunicorn 默认使用同步阻塞的网络模型(-k sync),处理大并发访问的表现相对较弱,套用gevent来增加并发量
  • Redis:Redis支持数据持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载使用。Redi是一个高性能的key-value数据库,它支持丰富的数据结构(类型),包括 String、list、set、zset、hash。这些数据类型都支持push/pop 、add/remove及取交集并集和差集及更丰富的操作。
  • Docker:容器,利用容器技术可以将应用及依赖包,运行应用程序所需的所有必要组件封装为单个镜像,然后以容器形式部署到任何流行的 Linux 平台上运行,可以实现虚拟化,实现轻型隔离,模块化部署,根据不同的需求封装不同的应用、环境、以及依赖选项。

项目概述:

docker多容器的应用

  • 使用两个容器:数据库(redis),框架(flask)
  • 使用Gunicorn + Gevent作为访问入口
  • 使用python编写一个web访问页面,将数据存放于redis

部署redis容器

  • 新建项目目录:
root@Ubuntu-docker:~# mkdir flask
root@Ubuntu-docker:~# cd flask/
root@Ubuntu-docker:~/flask# ls
root@Ubuntu-docker:~/flask#
  • 拉取镜像:
root@Ubuntu-docker:~/flask# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
6ec7b7d162b2: Pull complete 
1f81a70aa4c8: Pull complete 
968aa38ff012: Pull complete 
884c313d5b0b: Pull complete 
6e858785fea5: Pull complete 
78bcc34f027b: Pull complete 
Digest: sha256:0f724af268d0d3f5fb1d6b33fc22127ba5cbca2d58523b286ed3122db0dc5381
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest

镜像主要信息

root@Ubuntu-docker:~/flask# docker inspect redis
...
"Volumes": {
    "/data": {}
},
...
"Cmd": [
    "redis-server"
],
....
"ExposedPorts": {
    "6379/tcp": {}
}
...
  • 创建目录,用来映射应容器的redis的/data目录
  • 启动redis容器,通过 -v 将 /data 目录挂载出来,映射到物理机上的目录,-p 将服务端口映射出来。
root@Ubuntu-docker:~/flask# mkdir redis-data 
root@Ubuntu-docker:~/flask# docker run -d --name redis -p 6379:6379 -v /root/flask/redis-data:/data redis
2f6e28142c38ab69975abe89ad76b81a7216797b7bd817d2fe68af17a617c06b
root@Ubuntu-docker:~/flask# docker ps
CONTAINER ID   IMAGE                          COMMAND                  CREATED          STATUS                  PORTS                                                          NAMES
2f6e28142c38   redis                          "docker-entrypoint.s…"   19 minutes ago   Up 19 minutes           0.0.0.0:6379->6379/tcp                                         redis

Flask部署:

  • 创建项目的启动文件
  • 项目根目录下创建 app.py 程序
root@Ubuntu-docker:~/flask# vim app.py
from flask import Flask
from redis import Redis

app = Flask(__name__)
redis = Redis(host='192.168.10.232', port=6379)

@app.route('/')
def hello():
    count = redis.incr("hits")
    return 'hello flask&redis {}'.format(count)

if __name__ == "__main__":
    app.run(debug=True)
  • 创建容器中 python 环境的安装文件,解决依赖:
root@Ubuntu-docker:~/flask# vim requirements.txt
gunicorn
gevent
flask
flask-wtf
flask-migrate
flask-login
Flask-SQLAlchemy
  • 配置Gunicorn + Gevent
  • 为 Python 3 安装 pip:
    pip 是一个用来安装 Python 软件包的工具。通过 pip,可以从 Python 软件包索引(Pypi)和其他软件包索引中搜索,下载并且安装软件包。
root@Ubuntu-docker:~/flask# apt update
root@Ubuntu-docker:~/flask# apt install python3-pip
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
将会同时安装下列软件:
  binutils binutils-common binutils-x86-64-linux-gnu build-essential dpkg-dev fakeroot g++ g++-9 gcc gcc-9 libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl libasan5 libatomic1 libbinutils
  libc-dev-bin libc6 libc6-dbg libc6-dev libcrypt-dev libctf-nobfd0 libctf0 libexpat1-dev libfakeroot libgcc-9-dev libitm1 liblsan0 libpython3-dev libpython3.8-dev libquadmath0 libstdc++-9-dev libtsan0 libubsan1
  linux-libc-dev make manpages-dev python-pip-whl python3-dev python3-distutils python3-setuptools python3-wheel python3.8-dev zlib1g zlib1g-dev
建议安装:
  binutils-doc debian-keyring g++-multilib g++-9-multilib gcc-9-doc gcc-multilib autoconf automake libtool flex bison gcc-doc gcc-9-multilib gcc-9-locales glibc-doc libstdc++-9-doc make-doc python-setuptools-doc
下列【新】软件包将被安装:
  binutils binutils-common binutils-x86-64-linux-gnu build-essential dpkg-dev fakeroot g++ g++-9 gcc gcc-9 libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl libasan5 libatomic1 libbinutils
  libc-dev-bin libc6-dev libcrypt-dev libctf-nobfd0 libctf0 libexpat1-dev libfakeroot libgcc-9-dev libitm1 liblsan0 libpython3-dev libpython3.8-dev libquadmath0 libstdc++-9-dev libtsan0 libubsan1 linux-libc-dev
  make manpages-dev python-pip-whl python3-dev python3-distutils python3-pip python3-setuptools python3-wheel python3.8-dev zlib1g-dev
下列软件包将被升级:
  libc6 libc6-dbg zlib1g
升级了 3 个软件包,新安装了 43 个软件包,要卸载 0 个软件包,有 200 个软件包未被升级。
...
  • 安装gunicorn gevent
root@Ubuntu-docker:~/flask# pip3 install gunicorn gevent
Collecting gunicorn
  Downloading gunicorn-20.0.4-py2.py3-none-any.whl (77 kB)
     |████████████████████████████████| 77 kB 262 kB/s 
Collecting gevent
  Downloading gevent-20.12.1-cp38-cp38-manylinux2010_x86_64.whl (6.3 MB)
     |████████████████████████████████| 6.3 MB 269 kB/s 
Requirement already satisfied: setuptools>=3.0 in /usr/lib/python3/dist-packages (from gunicorn) (45.2.0)
Collecting zope.interface
  Downloading zope.interface-5.2.0-cp38-cp38-manylinux2010_x86_64.whl (244 kB)
     |████████████████████████████████| 244 kB 364 kB/s 
Collecting zope.event
  Downloading zope.event-4.5.0-py2.py3-none-any.whl (6.8 kB)
Collecting greenlet<2.0,>=0.4.17; platform_python_implementation == "CPython"
  Downloading greenlet-0.4.17-cp38-cp38-manylinux1_x86_64.whl (48 kB)
     |████████████████████████████████| 48 kB 226 kB/s 
Installing collected packages: gunicorn, zope.interface, zope.event, greenlet, gevent
Successfully installed gevent-20.12.1 greenlet-0.4.17 gunicorn-20.0.4 zope.event-4.5.0 zope.interface-5.2.0
  • 在项目根目录下新建文件 gunicorn.conf.py
root@Ubuntu-docker:~/flask# vim gunicorn.conf.py
workers = 5    # 定义同时开启的处理请求的进程数量,根据网站流量适当调整
worker_class = "gevent"   # 采用gevent库,支持异步处理请求,提高吞吐量
bind = "0.0.0.0:8000"  # ip和端口

使用gunicorn命令来测试是否可以正确运行(此步骤不需要运行仅提供一种验证方式)。如果运行,容器启动时会报错,显示连接被占用。通过删除项目目录下__pycache__文件解决。

root@Ubuntu-docker:~/flask# gunicorn app:app -c gunicorn.conf.py
[2021-01-03 08:56:42 +0000] [1] [INFO] Starting gunicorn 20.0.4
[2021-01-03 08:56:42 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000
[2021-01-03 08:56:42 +0000] [1] [INFO] Using worker: gevent
[2021-01-03 08:56:42 +0000] [8] [INFO] Booting worker with pid: 8
[2021-01-03 08:56:42 +0000] [9] [INFO] Booting worker with pid: 9
[2021-01-03 08:56:42 +0000] [10] [INFO] Booting worker with pid: 10
[2021-01-03 08:56:42 +0000] [11] [INFO] Booting worker with pid: 11
[2021-01-03 08:56:42 +0000] [12] [INFO] Booting worker with pid: 12
...
  • 编写Dockerfile封装Flask构建镜像
root@Ubuntu-docker:~/flask# vim dockerfile
FROM python
WORKDIR /app/
COPY requirements.txt /app/
COPY app.py /app/
COPY gunicorn.conf.py /
RUN pip install -r requirements.txt
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple flask redis
CMD ["gunicorn","app:app","-c","/gunicorn.conf.py"]
  • 构建镜像
root@Ubuntu-docker:~/flask# docker build -t flask .
Sending build context to Docker daemon  6.656kB
Step 1/8 : FROM python
 ---> d1eef6fb8dbe
Step 2/8 : WORKDIR /app/
 ---> Running in 8e285708de9c
Removing intermediate container 8e285708de9c
 ---> 9cb6adc26f9a
Step 3/8 : COPY requirements.txt /app/
 ---> fcb58fdf8397
Step 4/8 : COPY app.py /app/
 ---> 854c6687ce05
Step 5/8 : COPY gunicorn.conf.py /
 ---> 1b0caacbf553
Step 6/8 : RUN pip install -r requirements.txt
 ---> Running in dfd00f32a719
 ...
Removing intermediate container dfd00f32a719
 ---> 4f4f69ce68d8
Step 7/8 : RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple flask redis
 ---> Running in dd5bd914a905
...
Collecting redis
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/a7/7c/24fb0511df653cf1a5d938d8f5d19802a88cef255706fdda242ff97e91b7/redis-3.5.3-py2.py3-none-any.whl (72 kB)
Installing collected packages: redis
Successfully installed redis-3.5.3
Removing intermediate container dd5bd914a905
 ---> 16496e69f724
Step 8/8 : CMD ["gunicorn","app:app","-c","/gunicorn.conf.py"]
 ---> Running in 0c00ba959bba
Removing intermediate container 0c00ba959bba
 ---> 245fa9bb31d9
Successfully built 245fa9bb31d9
Successfully tagged flask:latest

root@Ubuntu-docker:~/flask# docker run -d --name test-flask -p8000:8000 flask:latest
a42643b17a607dcd28db51b365f8be09e5f76aa684b56527ea8be978c3f5e7d7
root@Ubuntu-docker:~/flask# docker images
REPOSITORY               TAG       IMAGE ID       CREATED          SIZE
flask                    latest    4f605d231e16   16 minutes ago   942MB
  • 部署镜像
root@Ubuntu-docker:~/flask# docker run -d --name test-flask -p8000:8000 flask:latest
050236fdf0dba2003da0373cf5279acbafdc787e9209a7855a2f5a14e88fb60d
root@Ubuntu-docker:~/flask# docker ps
CONTAINER ID   IMAGE                          COMMAND                  CREATED          STATUS                PORTS                                                          NAMES
050236fdf0db   flask:latest                   "gunicorn app:app -c…"   28 minutes ago   Up 27 minutes         0.0.0.0:8000->8000/tcp                                         test-flask
ebda9bf101f3   redis                          "docker-entrypoint.s…"   6 hours ago      Up 6 hours            0.0.0.0:6379->6379/tcp                                         redis
root@Ubuntu-docker:~/flask# docker logs 050236fdf0db
[2021-01-03 08:56:42 +0000] [1] [INFO] Starting gunicorn 20.0.4
[2021-01-03 08:56:42 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
[2021-01-03 08:56:42 +0000] [1] [INFO] Using worker: gevent
[2021-01-03 08:56:42 +0000] [8] [INFO] Booting worker with pid: 8
[2021-01-03 08:56:42 +0000] [9] [INFO] Booting worker with pid: 9
[2021-01-03 08:56:42 +0000] [10] [INFO] Booting worker with pid: 10
[2021-01-03 08:56:42 +0000] [11] [INFO] Booting worker with pid: 11
[2021-01-03 08:56:42 +0000] [12] [INFO] Booting worker with pid: 12

容器中ping:Redis

root@ebda9bf101f3:/data# ping 192.168.10.232     
PING 192.168.10.232 (192.168.10.232) 56(84) bytes of data.
64 bytes from 192.168.10.232: icmp_seq=1 ttl=64 time=0.053 ms
64 bytes from 192.168.10.232: icmp_seq=2 ttl=64 time=0.087 ms
64 bytes from 192.168.10.232: icmp_seq=3 ttl=64 time=0.054 ms
64 bytes from 192.168.10.232: icmp_seq=4 ttl=64 time=0.047 ms
  • 页面测试
    在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值