乐趣区

关于nginx:第一篇记一次python分布式web开发利用docker

作者:落阳

日期: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/

成果如图

以上是初步搭建进去的成果。

退出移动版