之前使用Flask开发了两三个公司或个人使用的平台;在搭建过程当中如果换了环境的话比较麻烦;这次尝试放到docker里面去跑;下面是搭建的一个过程以及对于学习的一个记录,此次web框架还是使用的之前用Flask写的一个基础后台。
.
├── README.md
├── docker-compose.yaml # 使用docker-compose来编排部署
├── flask_app # 用于跑Flask应用的容器
│ ├── Dockerfile
│ └── wait_for_db_complete.sh
├── flask_app_code # 后端项目应用代码目
│ ├── LICENSE
│ ├── README.md
│ ├── app
│ ├── config.py
│ ├── manage.py
│ ├── requirements.txt
│ ├── screenshots
│ └── tests
├── nginx # Nginx用于前端接收用户请求的容器
│ └── nginx.conf
├── python27_baseenv # 基础Python环境镜像
│ ├── Dockerfile
│ └── README.md
├── supervisor # 用于管理uwsgi服务进程
│ └── supervisord.conf
└── uwsgi # 通过uWsgi来为Nginx-Flask牵线搭桥
└── flask_uwsgi.ini
- Nginx Web服务器层作为前端接收用户请求;
- uWSGI层作为Web服务器层与Web框架层Flask的一条纽带,将Web服务器层与Web框架连接起来
- 后端Web框架与数据层MySQL或Redis交互
Nginx
:Hey,WSGI,我刚收到了一个请求,我需要你作些准备,然后由Flask来处理这个请求。WSGI
:OK,Nginx。我会设置好环境变量,然后将这个请求传递给Flask处理。Flask
:Thanks WSGI!给我一些时间,我将会把请求的响应返回给你。WSGI
:Alright,那我等你。Flask
:Okay,我完成了,这里是请求的响应结果,请求把结果传递给Nginx。WSGI
:Good job! Nginx,这里是响应结果,已经按照要求给你传递回来了。Nginx
:Cool,我收到了,我把响应结果返回给客户端。大家合作愉快~
- Nginx 单独一个容器
- uWSGI+Flask 单独一个容器,其中uWSGI进程由Supervisor来管理
- MySQL 单独一个容器,数据目录挂载到宿主机
- Redis 单独一个容器
各个容器之间的关联通过docker-compose编排来实现
主要还是通过编写Dockerfile来定制特定的运行环境镜像
cd /etc/yum.repos.d/
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-compose
systemctl start docker
cd Nginx-uWsgi-Flask-Supervisord-Redis-MySQL-Docker
docker build -f python27_baseenv/Dockerfile . -t python27_baseenv
cd Nginx-uWsgi-Flask-Supervisord-Redis-MySQL-Docker
docker build -f flask_app/Dockerfile . -t flask_app
cd Nginx-uWsgi-Flask-Supervisord-Redis-MySQL-Docker
docker-compose up
部署过程中,感觉在宿主机中部署还是没多大的区别,差别可能是在效率上面。宿主机中不能影响系统自带的一些东西,比如python的版本,这时候可能就需要用到virtualenv, 如果服务器迁移了那整个环境就需要重新搭建,还是不太方便。
此次部署呢主要目的还是以这个为一个实践目标去学习docker的compose文件编写,再把各个工具结合在一起跑在docker中实现之前在宿主机中的东西;其实把整个流程梳理清楚后编写yaml文件也很快的。后续尝试放到k8s集群中跑🍺🍺🍺
在我的VPS上面跑起来了...