使用 Docker、NGINX 和 Gunicorn 打包 Django 应用程序

介绍

在应用程序开发中,关键的成败阶段是将应用程序推向生产或使应用程序做好生产准备。需要进行某些配置以确保没有损坏,例如安全漏洞或暴露敏感配置(例如密钥)。Django Web 开发也不例外。应用程序在开发中的运行方式与其在生产中的运行方式大不相同。

要在生产中提供服务,Django 应用程序需要具有:

  • 用于接收 HTTP 请求的稳定可靠的 Web 服务器网关接口(WSGI)
  • 一个代理服务器,在 Django 应用程序接收到大量 HTTP 流量时也可以充当负载均衡器

本指南将探讨建立一个Django应用程序Gunicorn作为WSGI和NGINX作为代理服务器。为了便于设置,本指南将使用 Docker 打包所有这些。因此,它假设您至少具有 Docker 和 Docker Compose 的中级经验,并且至少具有Django 的初级技能。

使用 Docker 打包 Django 应用

对于多容器应用程序,此活动分两个阶段完成:1) 为主应用程序开发 Docker 文件,以及 2) 使用 Docker Compose 将所有内容与其余容器拼接起来。

应用程序 Docker 文件

Docker 文件很简单。它在自己的图像中设置 Django 应用程序。

FROM python:3.8.3-alpine

ENV MICRO_SERVICE=/home/app/microservice
RUN addgroup -S $APP_USER && adduser -S $APP_USER -G $APP_USER
# set work directory


RUN mkdir -p $MICRO_SERVICE
RUN mkdir -p $MICRO_SERVICE/static

# where the code lives
WORKDIR $MICRO_SERVICE

# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# install psycopg2 dependencies
RUN apk update \
    && apk add --virtual build-deps gcc python3-dev musl-dev \
    && apk add postgresql-dev gcc python3-dev musl-dev \
    && apk del build-deps \
    && apk --no-cache add musl-dev linux-headers g++
# install dependencies
RUN pip install --upgrade pip
# copy project
COPY . $MICRO_SERVICE
RUN pip install -r requirements.txt
COPY ./entrypoint.sh $MICRO_SERVICE

CMD ["/bin/bash", "/home/app/microservice/entrypoint.sh"]

项目 Docker 撰写文件

Docker Compose 将实现以下目标:

  • 启动三个镜像:Nginx、Postgres 和 Django 应用镜像

  • 定义运行顺序。Postgres 容器将首先运行,然后是 Django 容器,最后是 Nginx 容器。

要完全构建 Nginx 容器,您需要特殊的 Docker 和 conf 文件。在您的sampleApp文件夹中,创建一个名为nginx在该nginx目录中,创建一个 dockerfile 并复制以下代码块:

FROM nginx:1.19.0-alpine

RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d

在同一个文件夹中,创建一个名为的文件nginx.conf并复制下面的代码块。这是负责设置nginx的代码。

upstream sampleapp {
    server web:8000;
}

server {

    listen 80;

    location / {
        proxy_pass http://sampleapp;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }
    location /static/ {
        alias /home/app/microservice/static/;
    }

}

完成后,创建主docker-compose.yml文件。这将是负责运行整个项目的文件。在主项目文件夹中sampleApp,创建一个名为的文件docker-compose.yml并复制下面的代码块。

version: '3.7'

services:
  nginx:
    build: ./nginx
    ports:
      - 1300:80
    volumes:
      - static_volume:/home/app/microservice/static
    depends_on:
      - web
    restart: "on-failure"
  web:
    build: . #build the image for the web service from the dockerfile in parent directory
    command: sh -c "python manage.py makemigrations &&
                    python manage.py migrate &&
                    python manage.py initiate_admin &&
                    python manage.py collectstatic &&
                    gunicorn sampleApp.wsgi:application --bind 0.0.0.0:${APP_PORT}"
    volumes:
      - .:/microservice:rw # map data and files from parent directory in host to microservice directory in docker containe
      - static_volume:/home/app/microservice/static
    env_file:
      - .env
    image: sampleapp

    expose:
      - ${APP_PORT}
    restart: "on-failure"
    depends_on:
      - db
  db:
    image: postgres:11-alpine
    volumes:
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_DB=${DB_NAME}
      - PGPORT=${DB_PORT}
      - POSTGRES_USER=${POSTGRES_USER}
    restart: "on-failure"


volumes:
  postgres_data:
  static_volume:
docker-compose up --build

 

posted @ 2021-12-03 19:46  Tracydzf  阅读(516)  评论(0编辑  收藏  举报