Docker基础知识 (24) - 使用 Docker 部署 Nginx + Gunicorn + MariaDB 项目 | 配置 Django 和 Flask 框架

 

Gunicorn 是一个 Unix 上被广泛使用的高性能的 Python WSGI UNIX HTTP Server。它和大多数的 Web 框架兼容,并具有实现简单,轻量级,高性能等特点。

Gunicorn 默认使用 gevent 同步阻塞的网络模型 (-k sync),对于大并发的访问可能表现不够好,但是可以使用 gevent 来增加并发量。

Gunicorn GitHub: https://github.com/benoitc/gunicorn

-------------------------------------

 

Flask 是一个轻量级的可定制框架,使用 Python 语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合 MVC 模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或 Web 服务的实现。

Flask GitHub: https://github.com/pallets/flask


-------------------------------------

Django 是一个开放源代码的 Web 应用框架,用 Python 语言编写的。采用了 MTV 的框架模式,即模型 M,模版 T 和视图 V。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是 CMS(内容管理系统)软件。

Django:http://www.djangoproject.com/
GitHub:https://github.com/django

 

1. 部署环境

    IP 地址(本地测试环境):192.168.0.10
    操作系统:Linux CentOS 7.9     
    Docker 版本: 20.10.7
    Docker Compose 版本: 2.6.1

    Nginx 目录:/home/docker/gunicorn/nginx
    Python 目录:/home/docker/gunicorn/python
    MariaDB 目录:/home/docker/gunicorn/mysql
    Build 目录:/home/docker/gunicorn/build
    HTML 目录:/home/docker/gunicorn/html

 

2. 创建 Dockerfile

    Docker pull 下载的 Python 镜像,缺少需要的扩展,所以编写 Dockerfile 在本地生成需要的 Python 镜像。

        $ cd /home/docker/gunicorn/build
        $ vim Dockerfile

            FROM python:3.8

            RUN pip install -i https://mirrors.aliyun.com/pypi/simple gunicorn gevent
            RUN pip install -i https://mirrors.aliyun.com/pypi/simple django==3.0.1
            RUN pip install -i https://mirrors.aliyun.com/pypi/simple flask==2.0.0


            注:也可以使用镜像网站 https://pypi.tuna.tsinghua.edu.cn/simple。

        $ docker build -t python:3.8-gunicorn .

        $ docker images

            REPOSITORY   TAG              IMAGE ID       CREATED         SIZE
            python       3.8-gunicorn     4686d50df7e6   37 seconds ago   993MB
            python       3.8              da8341a525e8   11 hours ago     913MB


3. 创建配置文件

    1) 创建 nginx.conf

        在 /home/docker/gunicorn/nginx/conf.d 目录下,创建 nginx.conf 文件,内容如下:   

            server {
                listen 80 default_server;
                server_name localhost;
                #root /usr/share/nginx/html;

                location /static {
                    alias /usr/share/nginx/html;
                }

                location /flask {
                    proxy_pass http://python-3.8-gunicorn-flask:9002;
                }

                location /django {
                    proxy_pass http://python-3.8-gunicorn-django:9003;
                }

            }


        参数说明:

            (1) server.location.proxy_pass: http://python-3.8-gunicorn:9002 表示 “容器名称:端口”,也可以写成 “http://ip:端口”,获取 ip 的方法,运行如下命令:
            
                $ docker inspect --format='{{.NetworkSettings.IPAddress}}' python-3.8-gunicorn

                    172.17.0.2

            (2) server.root: /usr/share/nginx/html 是 nginx 容器内的路径。静态文件 (HTML/CSS/JS/Images 等文件)对应的映射目录是 /usr/share/nginx/html;

                location /static: nginx 自己处理 /static 对应的静态文件

    2) 创建 my_mariadb.cnf 文件

        在 /home/docker/gunicorn/mysql/conf 目录下,创建 my_mariadb.cnf 文件,内容如下:

            [mysqld]
            server-id=1
            port=3306
            
            #basedir=/usr/local/mysql
            #tmpdir=/tmp
            datadir=/var/lib/mysql

            # 查询日志,默认在 /var/lib/mysql 目录下
            #general_log=1
            #general_log_file=mysql_general.log

            # 二进制日志,默认在 /var/lib/mysql 目录下
            #log_bin=mysql_log_bin-1

            # 慢查询日志,默认在 /var/log/mysql 目录下
            #slow_query_log=1
            #long_query_time=1
            #slow_query_log_file=mysql_slow_query.log

            # 错误日志,指定到 /var/log/mysql 目录
            log_error=/var/log/mysql/mysql_err.log


        注:MariaDB (MySQL) 的默认配置文件是 /etc/mysql/my.cnf 文件。如果想要自定义配置,在 /etc/mysql/conf.d 目录中创建 *.cnf 文件。新建的文件可以任意起名,只要保证后缀名是 cnf 即可。新建的文件中的配置项可以覆盖 /etc/mysql/my.cnf 中的配置项。
       
    3) 创建 gunicorn_flask.conf.py 文件

        在 /home/docker/gunicorn/python/conf 目录下,创建 gunicorn_flask.conf.py 文件,内容如下:

            bind="0.0.0.0:9002"
            workers=5
            worker_class="gevent"


    4) 创建 gunicorn_django.conf.py 文件

        在 /home/docker/gunicorn/python/conf 目录下,创建 gunicorn_django.conf.py 文件,内容如下:

            bind="0.0.0.0:9003"
            workers=5
            worker_class="gevent"


4. 配置 Flask 项目

    1) 创建 Flask 项目

        在 /home/docker/html/flaskapp 目录下,创建 app.py 文件,内容如下:

            from flask import Flask
 
            app = Flask(__name__)
 
            @app.route('/flask')
            def home():
                return 'Gunicorn/Flask - Hello World!'


    2) 创建 docker-compose.yml

        $ cd /home/docker/gunicorn/build
        $ vim docker-compose.yml

            version: "3"
            services:
                nginx:
                    image: nginx
                    container_name: nginx-python-3.8
                    ports:
                        - "80:80"
                    restart: always
                    volumes:
                        - /home/docker/gunicorn/nginx/conf.d:/etc/nginx/conf.d
                        - /home/docker/gunicorn/nginx/logs:/var/log/nginx
                        - /home/docker/gunicorn/html:/usr/share/nginx/html
                mariadb:
                    image: mariadb:10.4
                    container_name: mariadb-10.4
                    ports:
                        - "3306:3306"
                    restart: always
                    environment:
                        - MARIADB_ROOT_PASSWORD=123456
                    volumes:
                        - /home/docker/gunicorn/mysql/conf:/etc/mysql/conf.d
                        - /home/docker/gunicorn/mysql/data:/var/lib/mysql
                        - /home/docker/gunicorn/mysql/log:/var/log/mysql         
                python-flask:
                    image: python:3.8-gunicorn
                    container_name: python-3.8-gunicorn-flask
                    depends_on:
                        - nginx
                        - mariadb
                    ports:
                        - "9002:9002"
                    restart: always
                    command:
                        - /bin/bash
                        - -c
                        - |
                          cd /var/www/html/flaskapp
                          gunicorn -c /usr/local/etc/python/conf/gunicorn_flask.conf.py app:app
                    volumes:
                        - /home/docker/gunicorn/python/conf:/usr/local/etc/python/conf
                        - /home/docker/gunicorn/html:/var/www/html
                        - /home/docker/gunicorn/html/flaskapp:/var/www/html/flaskapp


    3) 运行

        $ cd /home/docker/gunicorn/build   # 进入 docker-compose.yml 所在目录

        $ docker-compose up     # 执行 docker-compose.yml
        $ docker-compose up -d   # 在后台运行

            [+] Running 3/3
            ⠿ Container nginx-python-3.8           Started   0.6s
            ⠿ Container mariadb-10.4               Started   0.6s
            ⠿ Container python-3.8-gunicorn-flask  Started   1.0s


            注:本地 docker 没有所需要的镜像时,会自动下载所需的镜像。遇到无法自动下载的情况,可以使用 docker pull 命令下载所需的镜像,在运行 docker-compose up 命令。         

        $ docker ps             # 查看容器运行情况

            CONTAINER ID   IMAGE               ...   PORTS                     NAMES
            806c43e019e5   python:3.8-gunicorn   0.0.0.0:9002->9002/tcp,...  python-3.8-gunicorn-flask
            780a5cab627f   mariadb:10.4          0.0.0.0:3306->3306/tcp,...  mariadb-10.4
            529de0658449   nginx                 0.0.0.0:80->80/tcp,...      nginx-python-3.8


        mariadb-10.4 容器内的程序要在 /home/docker/mysql/log (该目录被挂载到容器内 /var/log/mysql 目录) 目录下创建 log 文件,需要确保容器内 root/root 以外的用户也有 /home/docker/mysql/log 目录的写权限,修改该目录的权限,命令如下:

            $ cd /home/docker/mysql
            $ chmod a+w log

        修改后需要重启 mariadb-10.4 容器,命令如下:

            $ docker restart mariadb-10.4

        浏览器访问 http://192.168.0.10/flask,显示如下:

            Gunicorn/Flask - Hello World!


5. 配置 Django 项目

    1) 创建 Django 项目

       (1) 进入 python-3.8-gunicorn 容器创建 Django 项目

            $ docker exec -it python-3.8-gunicorn /bin/bash

                root@1076fd112e8a:/# cd /var/www/html
                root@1076fd112e8a:/var/www/html# django-admin startproject djangoapp
                root@1076fd112e8a:/var/www/html# cd djangoapp
                root@1076fd112e8a:/var/www/html/djangoapp# ls
                manage.py  djangoapp
                root@1076fd112e8a:/var/www/html/djangoapp# exit         # 退出容器


        (2) 修改 djangoapp 项目

            # 容器内路径 /var/www/html 对应的宿主路径是 /home/docker/gunicorn/html
            $ cd /home/docker/gunicorn/html
            $ chmod -R 777 djangoapp      # 修改目录读写属性,也可以修改该目录的 owner


            # 创建 djangoapp/views.py
            $ cd djangoapp
            $ vim djangoapp/views.py

                from django.shortcuts import render, HttpResponse

                # Create your views here.
                def demo(request):
                        return render(request, "demo.html")


            # 修改 djangoapp/urls.py     

                from django.contrib import admin
                from django.urls import path
                import views

                urlpatterns = [
                    path('admin/', admin.site.urls),
                    path('django/', views.demo),
                ]

 

            # 创建 templates/demo.html
            $ mkdir templates
            $ vim templates/demo.html

                <h3>Gunicorn/Django - Demo Page!</h3>


            # 修改 djangoapp/settings.py ...


                ALLOWED_HOSTS = ['python-3.8-gunicorn-django',]

                ...

                TEMPLATES = [
                    {
                        'BACKEND': 'django.template.backends.django.DjangoTemplates',
                        'DIRS': [os.path.join(BASE_DIR, 'templates')],
                
                ...

 

    2) 修改 docker-compose.yml

        $ cd /home/docker/gunicorn/build
        $ vim docker-compose.yml

            version: "3"
            services:
                nginx:
                    image: nginx
                    container_name: nginx-python-3.8
                    ports:
                        - "80:80"
                    restart: always
                    volumes:
                        - /home/docker/gunicorn/nginx/conf.d:/etc/nginx/conf.d
                        - /home/docker/gunicorn/nginx/logs:/var/log/nginx
                        - /home/docker/gunicorn/html:/usr/share/nginx/html
                mariadb:
                    image: mariadb:10.4
                    container_name: mariadb-10.4
                    ports:
                        - "3306:3306"
                    restart: always
                    environment:
                        - MARIADB_ROOT_PASSWORD=123456
                    volumes:
                        - /home/docker/gunicorn/mysql/conf:/etc/mysql/conf.d
                        - /home/docker/gunicorn/mysql/data:/var/lib/mysql
                        - /home/docker/gunicorn/mysql/log:/var/log/mysql         
                python-flask:
                    image: python:3.8-gunicorn
                    container_name: python-3.8-gunicorn-flask
                    depends_on:
                        - nginx
                        - mariadb
                    ports:
                        - "9002:9002"
                    restart: always
                    command:
                        - /bin/bash
                        - -c
                        - |
                          cd /var/www/html/flaskapp
                          gunicorn -c /usr/local/etc/python/conf/gunicorn_flask.conf.py app:app
                    volumes:
                        - /home/docker/gunicorn/python/conf:/usr/local/etc/python/conf
                        - /home/docker/gunicorn/html:/var/www/html
                        - /home/docker/gunicorn/html/flaskapp:/var/www/html/flaskapp
                python-django:
                    image: python:3.8-gunicorn
                    container_name: python-3.8-gunicorn-django
                    depends_on:
                        - nginx
                        - mariadb
                    ports:
                        - "9003:9003"
                    restart: always
                    command:
                        - /bin/bash
                        - -c
                        - |
                          cd /var/www/html/djangoapp
                          gunicorn -c /usr/local/etc/python/conf/gunicorn_django.conf.py djangoapp.wsgi:application
                    volumes:
                        - /home/docker/gunicorn/python/conf:/usr/local/etc/python/conf
                        - /home/docker/gunicorn/html/djangoapp:/var/www/html/djangoapp


    3) 运行

        $ cd /home/docker/gunicorn/build

        $ docker-compose up     # 执行 docker-compose.yml
        $ docker-compose up -d   # 在后台运行

        浏览器访问 http://192.168.0.10/django,显示如下:

            Gunicorn/Django - Demo Page!


posted @ 2023-01-31 15:18  垄山小站  阅读(554)  评论(0)    收藏  举报