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

发布日期:2026-07-02 12:46:05   来源 : 杭州电子商务研究院    浏览量 :24
杭州电子商务研究院 发布日期:2026-07-02 12:46:05  
24

介绍

在应用程序开发中,一个关键的、成败攸关的阶段是将应用程序推向生产或使应用程序做好生产准备。需要进行某些配置以确保不会出现任何破坏,例如安全漏洞或泄露密钥等敏感配置。Django Web 开发也不例外。应用程序在开发中的运行方式与在生产中的运行方式截然不同。

为了投入生产,Django 应用程序需要具备:

  1. 用于接收 HTTP 请求的稳定可靠的 Web 服务器网关接口(WSGI)
  2. 当 Django 应用接收到大量 HTTP 流量时,代理服务器还可以充当负载均衡器

本指南将介绍如何设置 Django 应用,其中Gunicorn用作 WSGI,NGINX用作代理服务器。为便于设置,本指南将使用 Docker 打包所有这些内容。因此,本指南假定您至少具有中级Docker 和 Docker Compose 经验,并且至少具有初级Django 技能。

创建示例 Django 应用程序

该应用程序将是一个简单的 Django 应用程序,它使用HTTPResponse显示“hello world”消息。该应用程序的入门代码可在此 github链接中找到。

下载并用于本指南的其余部分。

使用 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 Compose 文件

Docker Compose 将实现以下目标:

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

  2. 定义运行顺序。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 化应用程序

整个项目已设置完毕,剩下的就是运行它。运行以下 Docker Compose 命令来启动容器。

      docker-compose up --build
    

要测试整个项目是否正常运行,请从数据库、应用程序和 nginx 容器访问应用程序的主页和管理页面。主页 URL 0.0.0.0:1300应显示一条简单的“hello world”消息。

管理页面 URL 为0.0.0.0:1300/admin。使用测试凭证:

用户名:admin

密码:mypass123

结论

仅使用 Docker 中的声明性脚本即可使 Django 应用投入生产,这对团队负责人和项目经理来说是一大优势。它使他们能够预先进行配置,让开发人员专注于应用开发。这种做法不仅在部署实践中营造出一种统一感,而且还通过让开发人员专注于应用开发和业务逻辑而不是设置和部署来节省宝贵的时间。

对于开发人员角色(例如 DevOps 工程师和对 Web 上的 Python 感兴趣的全栈开发人员)来说,了解如何将 Django 应用程序打包成可在生产环境中部署的应用程序至关重要。

为了进一步提高这些技能,请接受将打包的应用程序部署到实时服务器的挑战。选择合适的提供商。选项包括 Linode、GCP、Digital Ocean 和 AWS 以及其他云服务提供商。

以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据