作者:落阳
日期:2020-12-23
在一次我的项目开发中,决定应用docker+nginx+flask+mysql的技术栈来开发,用此系列文章记录开发的过程。
系列文章,以后为第一篇,记录一次python分布式web开发过程。
一、docker的装置
作为学生,想找到适合数量的计算机部署分布式系统是一个令人头疼的问题。所以打算在虚拟机上利用docker来部署伪分布式的零碎,不便环境搭建、开发和二次部署。
docker定义如下(摘自百度百科):
Docker 是一个开源的利用容器引擎,让开发者能够打包他们的利用以及依赖包到一个可移植的镜像中,而后公布到任何风行的 Linux或Windows 机器上,也能够实现虚拟化。容器是齐全应用沙箱机制,相互之间不会有任何接口。
docker的装置可参见官网:docker官网装置教程
装置实现后,运行上面的命令验证是否装置胜利:
docker version
# 或者
docker info
docker装置实现之后,每一次应用docker命令都须要sudo权限,能够思考把以后用户退出docker用户组或者进入sudo su
模式,这里采纳第二种办法。
二、拉取所需的镜像
依据采纳的技术栈,目前确定须要拉取的镜像有nginx、python、mysql。
含flask框架的镜像能够在python镜像的根底上制作。
拉取镜像的命令如下:
docker pull mysql
# 拉取比较稳定的3.8版本的python即可
docker pull python:3.8
docker pull nginx
之后输出命令
docker images
即可查看拉取下来的镜像。
三、启动容器
因为这个分布式的我的项目须要启动多个容器,所以这里应用了docker-compose来配置和启动多个容器,docker-compose解释如下(摘自菜鸟教程):
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您能够应用 YML 文件来配置应用程序须要的所有服务。而后,应用一个命令,就能够从 YML 文件配置中创立并启动所有服务。
windows和mac上在装置docker的同时会一起装置了docker-compose,linux须要额定装置。如果你电脑上有pip的话能够利用pip很容易的装置:
pip install docker-compose
之后docker-compose命令会默认处于环境变量之下,能够输出
docker-compose --help
查看是否装置胜利。
之后就是配置docker-compose.yml文件,对于docker-compose的应用和配置文件的配置教程能够参考https://vuepress.mirror.docker-practice.com/compose/
目前配置如下:
version: "3.2"
services:
flask1:
image: python:3.8
container_name: flask1
restart: always
volumes:
- /root/myflask/estateProject:/estateProject
- /root/myflask/uwsgi1:/uwsgi
working_dir: /uwsgi
command: /bin/bash -c "pip install -r /estateProject/requirements.txt -i https://pypi.douban.com/simple && uwsgi --ini uwsgi.ini"
flask2:
image: python:3.8
container_name: flask2
restart: always
volumes:
- /root/myflask/estateProject:/estateProject
- /root/myflask/uwsgi2:/uwsgi
working_dir: /uwsgi
command: /bin/bash -c "pip install -r /estateProject/requirements.txt -i https://pypi.douban.com/simple && uwsgi --ini uwsgi.ini"
nginx:
image: nginx
container_name: nginx
restart: always
ports:
- "127.0.0.1:8080:80"
- "127.0.0.1:8081:443"
volumes:
- /root/mynginx/html:/usr/share/nginx/html
- /root/mynginx/conf:/etc/nginx
depends_on:
- flask1
- flask2
mysql:
image: mysql
container_name: mysql
restart: always
command: --default-authentication-plugin=mysql_native_password
networks:
my-net:
ipv4_address: 172.21.0.2
volumes:
- /root/mymysql:/docker-entrypoint-initdb.d
environment:
- MYSQL_DATABASE=estate_db
- MYSQL_ROOT_PASSWORD=123456
networks:
my-net:
driver: bridge
name: my-net
ipam:
driver: default
config:
- subnet: 172.21.0.0/16
gateway: 172.21.0.1
目前创立了四个容器一个网络。
两个flask容器都是用python:3.8根底上装置requirements.txt文档中的库。并且挂载了目录到宿主机上,防止在容器中的数据层的批改(在docker中不提倡间接批改容器中的数据层)。flask里面套了一层中间层uwsgi目标是让flask和反向代理nginx连贯上,并且减少flask的稳定性。uwsgi.ini配置如下:
[uwsgi]
socket = 0.0.0.0:8080
chdir = /estateProject/
wsgi-file = run.py
callable = app
processes = 2
threads = 2
因为uwsgi不间接做服务器,而是作为一个相似中介般的存在,所以这里凋谢socket端口与nginx作连贯以减少安全性和速度。
在mysql容器中的/docker-entrypoint-initdb.d目录下的sql、sh文件会被主动执行,详情参考官网文档https://hub.docker.com/_/mysql。这里将建库建表文件放到mymysql文件夹下并将/docker-entrypoint-initdb.d挂载到此文件夹,在mysql容器初始化时便主动建表,且不便二次批改。
其次,为了防止mysql容器每次启动会主动重新分配ip地址,docker-compose配置中创立了一个网络并为mysql固定了它的ip地址以便flask能够顺利稳固的连贯上。
四、初步成果
通过下面的一系列配置,在虚拟机上输出url来查看成果http://127.0.0.1:8080/
成果如图
以上是初步搭建进去的成果。
发表回复