记一次python分布式web开发(利用docker)

做者:落阳html

日期:2020-12-23vue

在一次项目开发中,决定使用docker+nginx+flask+mysql的技术栈来开发,用此系列文章记录开发的过程。python

系列文章,当前为第一篇,记录一次python分布式web开发过程。mysql

1、docker的安装


做为学生,想找到合适数量的计算机部署分布式系统是一个使人头疼的问题。因此打算在虚拟机上利用docker来部署伪分布式的系统,方便环境搭建、开发和二次部署。linux

docker定义以下(摘自百度百科):nginx

Docker 是一个开源的应用容器引擎,让开发者能够打包他们的应用以及依赖包到一个可移植的镜像中,而后发布到任何流行的 LinuxWindows 机器上,也能够实现虚拟化。容器是彻底使用沙箱机制,相互之间不会有任何接口。web

docker的安装可参见官网:docker官方安装教程sql

安装完成后,运行下面的命令验证是否安装成功:docker

docker version
# 或者
docker info

docker安装完成以后,每一次使用docker命令都须要sudo权限,能够考虑把当前用户加入docker用户组或者进入sudo su模式,这里采用第二种方法。flask

2、拉取所需的镜像


根据采用的技术栈,目前肯定须要拉取的镜像有nginx、python、mysql。

含flask框架的镜像能够在python镜像的基础上制做。

拉取镜像的命令以下:

docker pull mysql
# 拉取比较稳定的3.8版本的python便可
docker pull python:3.8
docker pull nginx

以后输入命令

docker images

便可查看拉取下来的镜像。

3、启动容器

因为这个分布式的项目须要启动多个容器,因此这里使用了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能够顺利稳定的链接上。

4、初步效果


经过上面的一系列配置,在虚拟机上输入url来查看效果http://127.0.0.1:8080/

效果如图

初步效果

以上是初步搭建出来的效果。

相关文章
相关标签/搜索