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

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

[[416793]]

本文转载自微信公众号「Python中文社区」,作者MATTHEW 。转载本文请联系Python中文社区公众号。

本教程将向您展示如何在不到 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 创建。

创建第一个项目

  1. virtualenv simpleenv 
  2. source simpleenv/bin/activate 
  3. pip install django 
  4. django-admin startproject simpleproject 

创建第二个项目

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

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

  1. virtualenv advancedVenv 
  2. source advancedVenv/bin/activate 
  3. cookiecutter 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镜像:

  1. docker-compose -f local.yml build 

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

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

  1. version: '3' 
  2.  
  3. volumes: 
  4.   local_postgres_data: {} 
  5.   local_postgres_data_backups: {} 
  6.  
  7. services: 
  8.   django: 
  9.     build: 
  10.       context: . 
  11.       dockerfile: ./compose/local/django/Dockerfile 
  12.     image: my_awesome_project_local_django 
  13.     container_name: django 
  14.     depends_on: 
  15.       - postgres 
  16.     volumes: 
  17.       - .:/app:z 
  18.     env_file: 
  19.       - ./.envs/.local/.django 
  20.       - ./.envs/.local/.postgres 
  21.     ports: 
  22.       - "8000:8000" 
  23.     command: /start 
  24.  
  25.   postgres: 
  26.     build: 
  27.       context: . 
  28.       dockerfile: ./compose/production/postgres/Dockerfile 
  29.     image: my_awesome_project_production_postgres 
  30.     container_name: postgres 
  31.     volumes: 
  32.       - local_postgres_data:/var/lib/postgresql/data:Z 
  33.       - local_postgres_data_backups:/backups:z 
  34.     env_file: 
  35.       - ./.envs/.local/.postgres 
  36.  
  37.   docs: 
  38.     image: my_awesome_project_local_docs 
  39.     container_name: docs 
  40.     build: 
  41.       context: . 
  42.       dockerfile: ./compose/local/docs/Dockerfile 
  43.     env_file: 
  44.       - ./.envs/.local/.django 
  45.     volumes: 
  46.       - ./docs:/docs:z 
  47.       - ./config:/app/config:z 
  48.       - ./my_awesome_project:/app/my_awesome_project:z 
  49.     ports: 
  50.       - "7000:7000" 
  51.     command: /start-docs 

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

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

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

  1. django: 
  2.   build: 
  3.     context: . 
  4.     dockerfile: ./compose/local/django/Dockerfile 

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

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

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

  1. ... 
  2.  
  3. COPY ./compose/production/django/entrypoint /entrypoint 
  4. RUN sed -i 's/\r$//g' /entrypoint 
  5. RUN chmod +x /entrypoint 
  6.  
  7. ... 
  8.  
  9. ENTRYPOINT ["/entrypoint"

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

再看一下 django 服务:

  1. django: 
  2.   build: 
  3.     command: /start 

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

  1. #!/bin/bash 
  2.  
  3. set -o errexit 
  4. set -o pipefail 
  5. set -o nounset 
  6.  
  7.  
  8. python manage.py migrate 
  9. python manage.py runserver_plus 0.0.0.0:8000 

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

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

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

  1. docker-compose -f local.yml up 

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

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

最终更改

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

环境变量

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

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

  1. pip install django-environ 

数据库设置

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

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

允许的主机

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

  1. 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中文社区
相关推荐

2017-07-04 16:23:10

容器ocker技术

2012-06-28 10:26:51

Silverlight

2021-06-02 09:12:04

App自动化测试测试自动化

2020-09-14 11:30:26

HTTP3运维互联网

2021-01-29 11:43:53

SSHLinux命令

2021-04-30 16:23:58

WebRTC实时音频

2020-11-23 16:23:59

CSS设计技术

2010-11-03 11:01:05

求职面试

2020-12-17 10:00:16

Python协程线程

2011-07-11 09:58:52

2021-01-29 11:25:57

Python爬山算法函数优化

2009-11-26 11:19:52

NIS服务器

2021-03-12 09:45:00

Python关联规则算法

2023-09-07 23:52:50

Flink代码

2015-05-07 11:31:21

服务器虚拟化深信服

2015-12-03 14:10:26

systemd容器Linux

2023-07-26 07:11:50

LVM底层抽象

2020-05-15 07:30:08

黑客Thunderbolt漏洞

2020-02-17 13:45:27

抓取代码工具

2020-12-07 11:23:32

Scrapy爬虫Python
点赞
收藏

51CTO技术栈公众号