使用 Docker、NGINX 和 Gunicorn 打包 Django 应用程序
介绍
创建示例 Django 应用程序
该应用程序将是一个简单的 Django 应用程序,它使用HTTPResponse显示“hello world”消息。该应用程序的入门代码可在此 github链接中找到。
下载并用于本指南的其余部分。
使用 Docker 打包 Django 应用
对于多容器应用程序,此活动分两个阶段完成:
- 为主要应用程序开发 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 将实现以下目标:
启动三个镜像: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 化应用程序
整个项目已设置完毕,剩下的就是运行它。运行以下 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 以及其他云服务提供商。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~