基于 Docker 快速部署可扩展的 Django 应用

阅读时长 7 min read

在现代化的 Web 开发中,Django 已成为一个不可忽视的高效框架。然而,部署 Django 应用程序可能会遇到一些挑战。这是因为 Django 的生态系统涉及到多种技术栈,包括 Python 程序、Web 服务器和数据库(如 PostgreSQL 或 MySQL)。为了解决这个问题,Docker 能够帮助开发者们快速地构建、测试和部署 Django 应用程序。

本文将介绍如何使用 Docker 将 Django 应用程序部署到生产环境。我们将使用 Docker 来构建一个基于 Django 的 Web 应用程序并使用文件添加此 Web 应用程序所需的数据组件(包括数据库和静态文件)。我们将利用 Docker 部署它并查看扩展性措施。

准备工作

在开始之前,您需要确保已经按照以下步骤进行设置:

  • 安装 Docker 和 Docker Compose
  • 为您的 Django 应用程序编写 Dockerfile
  • 编写 Docker Compose 配置文件

编写 Django Dockerfile

在开始使用 Docker 部署 Django 应用程序之前,我们需要编写适合此用例的 Dockerfile。文件应该包含以下部分:

-- -------------------- ---- -------
---- ----------
--- ---------------- -

--- ----- ----- 
------- ----- 

---- ---------------- ------
--- --- ------- -- ---------------- 

---- - ------

此 Dockerfile 有几个要点:

  • 我们基于 Python 的 3.8 版本运行 Docker 容器。ENV 设置 PYTHONUNBUFFERED 环境变量,该环境变量帮助我们配置从 Python 输出到 Docker 控制台的缓冲区大小。
  • 指定代码文件位于容器内的 /code 目录下。
  • 从 Docker 上下文复制 requirements.txt,并运行 pip install 命令来安装所有的 Python 依赖项。
  • 最后一步是将整个代码文件复制到容器内部中的 /code 目录。

Docker Compose 配置文件

Docker Compose 是管理 Docker 应用程序的重要工具,可以帮助您更方便地构建和部署多容器应用程序。您需要创建一个 Docker Compose YAML 文件来配置 Django 应用程序。在此过程中,需要保证以下内容:

-- -------------------- ---- -------
-------- ---

---------
  ---
    ------ --------
    ------------
      -------------- -------------------
      ------------------ -------------------
      ------------ ------------------
    --------
      - ---------------------------------------
      
  ----
    ------ -
    -------- ------ --------- --------- ------------
    --------
      - -------
    ------
      - -----------
    -----------
      - --

--------
  --------------

此 Compose 配置文件有三个部分 servicesvolumesnetworks。每个服务都表示在 Docker 中运行的容器。

db:指定 PostgreSQL 数据库容器。我们使用 PostgreSQL 协议为 Django 应用提供数据库支持。

web:指定 Django Web 应用程序容器。我们在该容器中设置了几个主要设置,其中包括 command、volumes 和 ports。启动此容器将运行 Django 应用程序并将其作为 HTTP 服务器运行,监听来自任意 IP 的传入连接。

volumes:指定我们需要创建的 Docker 数据卷,用于在 web 和 db 服务之间共享数据。

运行 docker-compose up 命令会创建和启动上述服务。

部署 Django 应用程序

您可以通过 Docker Compose 启动 Django 应用程序。请记住,要使用命令 docker-compose up 来启动并运行容器。

现在,您可以使用浏览器访问 http://<your-ip>:8000 以验证 Django 服务器是否正在运行。如果您遇到问题,可以检查 Docker 控制台的输出或使用 docker-compose logs 命令查看日志。

扩展 Django 应用程序

Django 应用程序可能会经历许多阶段,并且需要根据其实际要求进行扩展。

在一个 Docker Compose 中坚决保持基础组件是一个好习惯。当我们需要扩展部署时,我们应该指定一个新的服务,这样可以在不影响基础组件的情况下进一步扩展功能。新的服务可以使用基础组件提供的数据卷来访问数据库和静态文件。

原始 docker-compose.yml 文件分离数据和应用。要添加新组件,请按照以下步骤操作:

  1. 添加组件服务

    例如:为环境管理添加 django-environ 库。

    在 Dockerfile 中添加以下代码:

    docker-compose.yml 文件中添加以下服务:

env: depends_on: - db volumes: - .:/code command: ["python", "manage.py", "runscript", "load_initial_data"] build: . ```

  1. 访问数据

    例如:Django 应用需要访问已存在的数据库实例。

    在 Dockerfile 中不需要添加任何代码。

    docker-compose.yml 文件中添加以下配置:

db: image: postgres environment: POSTGRES_USER: <username> POSTGRES_PASSWORD: <password> POSTGRES_DB: <db> volumes: - postgres_data:/var/lib/postgresql/data/

web: depends_on: - db build: .

env: depends_on: - db build: . ```

  1. 添加静态文件 VPN 服务

    例如:Django 应用程序需要连接到 VPN 以访问其主要资产。

    在 Dockerfile 中添加以下代码:

    docker-compose.yml 文件中添加以下服务:

vpn: image: <vpn> environment: VPN_SERVER_ADDRESS: <server> VPN_USERNAME: <username> VPN_PASSWORD: <password> command: ["/sbin/init"] volumes: - /lib/modules:/lib/modules - </path/to/certificates>:/certificates - vpn_data:/data - /dev/net:/dev/net cap_add: - NET_ADMIN

-- -------------------- ---- -------

-- ----

------------ ----- ---

----
-- ------ --- ----- ------ --------
--------------- -- --

-- ------ --- ------ ------ --------
------------------------------------------------------- -------------- -- --
----

----------------- -------------------- -----------

----- ------ ------- -- ------ ----------------------------------- -------------------------------- ------ ------------------------- ------ ------- ----------------------------------------

- ------- ----------------------------------------------------------------------- -------- --- ------ --- --------
------------------------------------------------------------------------------------------------------
Feed
back