社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

5分钟将 Django 项目进行容器化管理

Python中文社区 • 3 年前 • 503 次点击  

本教程将向您展示如何在不到 5 分钟的时间内对 Django 项目进行 Dockerize 容器化管理。如果您已经使用 Django 一段时间了,那么您之前很可能听说过 Docker。这里有一个 Docker 的快速总结,以及为什么应该考虑在你的项目中使用它。

Dockerizing 容器化 Django 项目可能是一项艰巨的任务。一个复杂的 Django 项目可以有许多活动部分:Django 服务器、数据库,可能还有 Redis 和 Celery 进程。

Docker 简介

Docker 是一种非常流行的容器化管理工具。容器很强大,因为每次启动容器时,您的环境都以完全相同的方式设置。

这样做的好处是:

您的代码可以在任何支持 Docker 的操作系统上运行。您无需在主机上配置系统依赖项,从而节省时间。您的本地环境和生产环境可以完全相同,这样能够消除仅在生产中发生的错误。

了解 Docker

本教程并未深入介绍 Docker 的工作原理。相反,本教程将重点介绍如何专门为 Django 设置 Docker。

如果您想了解有关 Docker 的更多信息,我的建议是阅读官方指南。这是一个相对较短的教程,但涵盖了您需要知道的所有内容!

https://docs.docker.com/language/python/

将 Django 项目 Docker 化

无论是现有项目还是您正在启动一个新项目,我们都将使用相同的资源将 Docker 实施到项目中。

我们将要使用的资源是 Cookiecutter Django。 Cookiecutter是一个用于从 cookiecutter(项目模板)引导项目的工具。它在创建新项目时节省了大量时间,因为它为您配置了大量样板代码。

https://github.com/pydanny/cookiecutter-django

Cookiecutter Django 最好的部分之一是它包含 Docker 配置。我们将使用此配置来了解 Docker 是如何在 Django 项目中实现的。

入门

首先,安装Docker。

我们将创建两个 Django 项目。第一个将是一个使用 django-admin 命令创建的简单项目。第二个项目将使用 Cookiecutter Django 创建。

创建第一个项目

virtualenv simpleenvsource simpleenv/bin/activatepip install djangodjango-admin startproject simpleproject

创建第二个项目

在另一个文件夹中,首先使用 pip install cookiecutter 安装 Cookiecutter。这将全局安装 Cookiecutter,以便随时访问。

我们现在可以使用任何 Cookiecutter 模板来引导项目。在新终端中运行以下命令以使用 Cookiecutter Django创建项目。

virtualenv advancedVenvsource advancedVenv/bin/activatecookiecutter gh:pydanny/cookiecutter-django

命令 cookiecutter gh:pydanny/cookiecutter-django 以 Cookiecutter命令行用 GitHub 模板 pydanny/cookiecutter-django 创建项目。

此命令将提示您回答有关要生成的项目的几个问题。通过按 Enter,您可以将每个答案保留为默认值。

当提示使用 use_docker 选项时,请确保按“y”,以便使用 Docker 配置项目。


完成所有提示后,将生成一个 Django 项目。我们将专门查看为配置 Docker 创建的文件。这些是:

compose文件夹.dockerignore 文件local.yml 文件production.yml文件

TLDR

这就是 Dockerize 容器化管理 Django 项目所需的全部内容。只需将这些文件夹和文件复制到您的其他 Django 项目中并调整它们,使其指向正确的文件。

如果您想查看更高级的 Docker 配置,请生成一个启用了 use_celery 标志的 Cookiecutter Django 项目。Docker 配置将包括 Celery 和 Redis 的设置。

了解 Docker 配置

compose 文件夹包含两个文件夹,一个用于本地开发,一个用于生产。同样,local.yml 文件用于本地开发,production.yml 文件用于生产。

compose/local 文件夹与 local.yml 文件密切相关。

compose/production文件夹与 production.yml文件密切相关。

Docker-Compose 是最需要重点掌握的工具。我们使用它来运行多容器 Docker 应用程序。它是安装 Docker 附带的命令行程序的一部分。

使用 Docker 运行项目

确保您的计算机上运行了 Docker 应用程序,否则以下命令将无法正常执行。

我们使用 Docker-Compose 来构建我们项目的镜像Image。 Images就像我们Container应用程序的蓝图。

一旦构建了镜像Image,我们就创建了一个容器Container,它基本上是一个镜像Image的运行实例。如果我们对项目的依赖项(例如 Python 依赖项)进行了任何更改,那么我们需要重建 Image 以使其生效。

运行以下命令构建 Docker Image镜像:

docker-compose -f local.yml build

请注意,此命令采用带有 -f 标志的参数。这告诉 Docker 使用 local.yml 文件作为配置文件。

如果我们打开 local.yml 文件,会有以下内容:

version: '3'
volumes: local_postgres_data: {} local_postgres_data_backups: {}
services: django: build: context: . dockerfile: ./compose/local/django/Dockerfile image: my_awesome_project_local_django container_name: django depends_on: - postgres volumes: - .:/app:z env_file: - ./.envs/.local/.django - ./.envs/.local/.postgres ports: - "8000:8000" command: /start
postgres: build: context: . dockerfile: ./compose/production/postgres/Dockerfile image: my_awesome_project_production_postgres container_name: postgres volumes: - local_postgres_data:/var/lib/postgresql/data:Z - local_postgres_data_backups:/backups:z env_file: - ./.envs/.local/.postgres
docs: image: my_awesome_project_local_docs container_name: docs build: context: . dockerfile: ./compose/local/docs/Dockerfile env_file: - ./.envs/.local/.django volumes: - ./docs:/docs:z - ./config:/app/config:z - ./my_awesome_project:/app/my_awesome_project:z ports: - "7000:7000" command: /start-docs

这个文件是一个配置文件,列出了 Docker 运行我们的多容器应用程序所需的一切。注意services部分。共有三种服务; djangopostgres 和docs

在每项服务下都有一些配置选项。

同样,如果您想深入了解每个命令的细节,请返回 Docker 文档。如果我们看一下 django 服务,我们有以下内容:

django:  build:    context: .    dockerfile: ./compose/local/django/Dockerfile

这会对服务进行配置,以便它使用特定的 DockerFile。所使用的 DockerFile 来自 compose 文件夹内的local Docker 配置。

希望这显示了所有 Docker 配置是如何连接在一起的。 local.yml 文件包含指向 compose 文件夹内特定 DockerFiles 的服务。除了 DockerFiles 之外,还使用了其他文件。

例如,在 compose/django/Dockerfile 文件的末尾,我们有以下内容:

...
COPY ./compose/production/django/entrypoint /entrypointRUN sed -i 's/\r$//g' /entrypointRUN chmod +x /entrypoint
...
ENTRYPOINT ["/entrypoint"]

这告诉 Docker,当 Docker-Compose 使用此 DockerFile 时,它将调用entrypoint脚本,该脚本可以在 compose/production/django/entrypoint 中找到。打开该文件并查看内容。您会看到它基本上在 Postgres 数据库成功连接时记录日志。

再看一下 django 服务:

django:  build:    command: /start

django 服务的一个重要部分是 command 属性。这告诉 Docker 这个容器的启动命令是start脚本。我们可以在 compose/local/django 中找到这个文件。在这个文件中,有以下内容:

#!/bin/bash
set -o errexitset -o pipefailset -o nounset

python manage.py migratepython manage.py runserver_plus 0.0.0.0:8000

这应该看起来很熟悉。我们有 Django 迁移和正在运行的服务器。这里需要注意的是 runserver_plus 命令来自 Django Extensions。如果您没有安装该软件包,您可以将 runserver_plus 替换为 runserver

注意不要删除 0.0.0.0:8000,因为容器需要将端口映射到主机。

现在我们了解了 Docker 是如何配置的,最后一部分是运行这个命令来启动多容器应用程序:

docker-compose -f local.yml up

这将运行 local.yml 文件中的所有服务。运行此命令后,您可以在浏览器中转到您的本地主机,您应该会看到默认的登录页面。

通过此设置,您可以运行 Django 服务器、Postgres 数据库和文档。

最终更改

您将需要为您的项目配置 Docker 文件。需要注意的一些事项:

环境变量

Docker Compose 文件将环境变量文件加载到容器中。这些环境变量文件存储在 Cookiecutter Django 生成的 .envs 文件夹中。为了能够读取这些值,您需要安装一个处理环境变量的包。

Cookiecutter Django 推荐的包是 Django-Environ。您可以使用以下命令安装此软件包:

pip install django-environ

数据库设置

数据库凭据也作为环境变量包含在内,因此请确保具有正确的数据库设置。

DATABASES = {"default": env.db("DATABASE_URL")}DATABASES["default"]["ATOMIC_REQUESTS"] = True

允许的主机

确保您允许的主机包括 localhost。

ALLOWED_HOSTS = ["localhost", "0.0.0.0", "127.0.0.1"]

最终 Docker 依赖于两个组件:Docker-Compose 和 DockerFiles。我们有 local.yml 用于本地开发。此文件指向 compose/local 文件夹,其中包含在本地运行 Docker 所需的所有内容。同样,我们有 production.yml 用于生产,它使用 compose/production 文件夹。

我强烈建议在您自己的项目中使用 Cookiecutter Django。它不仅是专业开发的绝佳资源,而且可用于学习许多最佳实践,包括如何在 Django 项目中配置 Docker。



点击下方阅读原文加入社区会员

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/118333
 
503 次点击