使用 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