在现代化的 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 配置文件有三个部分 services、volumes 和 networks。每个服务都表示在 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 来启动并运行容器。
$ docker-compose up
现在,您可以使用浏览器访问 http://<your-ip>:8000 以验证 Django 服务器是否正在运行。如果您遇到问题,可以检查 Docker 控制台的输出或使用 docker-compose logs 命令查看日志。
扩展 Django 应用程序
Django 应用程序可能会经历许多阶段,并且需要根据其实际要求进行扩展。
在一个 Docker Compose 中坚决保持基础组件是一个好习惯。当我们需要扩展部署时,我们应该指定一个新的服务,这样可以在不影响基础组件的情况下进一步扩展功能。新的服务可以使用基础组件提供的数据卷来访问数据库和静态文件。
原始 docker-compose.yml 文件分离数据和应用。要添加新组件,请按照以下步骤操作:
添加组件服务
例如:为环境管理添加
django-environ库。在 Dockerfile 中添加以下代码:
RUN pip install django-environ
在
docker-compose.yml文件中添加以下服务:
env: depends_on: - db volumes: - .:/code command: ["python", "manage.py", "runscript", "load_initial_data"] build: . ```
访问数据
例如: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: . ```
下面的服务将连接到 `db` 服务,因此两个服务可能在同一网络中。
添加静态文件 VPN 服务
例如:Django 应用程序需要连接到 VPN 以访问其主要资产。
在 Dockerfile 中添加以下代码:
RUN pip install "django-environ[schema]"
在
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
-- -------------------- ---- ------- -- ---- ------------ ----- --- ---- -- ------ --- ----- ------ -------- --------------- -- -- -- ------ --- ------ ------ -------- ------------------------------------------------------- -------------- -- -- ---- ----------------- -------------------- ----------- ----- ------ ------- -- ------ ----------------------------------- -------------------------------- ------ ------------------------- ------ ------- ---------------------------------------- - ------- ----------------------------------------------------------------------- -------- --- ------ --- -------- ------------------------------------------------------------------------------------------------------