paint-brush
如何 Docker 化和部署 Django 应用程序经过@abrahamdahunsi
11,674 讀數
11,674 讀數

如何 Docker 化和部署 Django 应用程序

经过 Abraham Dahunsi 15m2023/10/14
Read on Terminal Reader

太長; 讀書

在本教程中,您学习了如何使用 Docker、Django 和 Heroku 对 Django 应用程序进行 Docker 化和部署。您了解了 Docker 如何帮助您为应用程序创建隔离且可重现的环境,以及 Heroku 如何简化部署过程。 您还学习了如何使用 Docker Compose 管理多个容器和服务,以及如何为不同环境配置 Django 设置。
featured image - 如何 Docker 化和部署 Django 应用程序
Abraham Dahunsi  HackerNoon profile picture
0-item
1-item

Docker 是一个用于构建、运行和分发应用程序的平台。它允许您将应用程序及其所有依赖项打包到一个容器中,然后可以在任何安装了 Docker 的计算机上运行。


这使得 Docker 成为部署 Web 应用程序的理想选择,因为它可以轻松地将应用程序从一个环境移动到另一个环境,而无需担心任何兼容性问题。


另一方面,Django 是一个 Python Web 框架,可以轻松创建强大且可扩展的 Web 应用程序。 Django 提供了许多开箱即用的功能,例如用户身份验证系统、数据库抽象层和模板引擎。


这使得 Django 的入门变得容易,并且快速、轻松地构建复杂的 Web 应用程序。


Docker 化和部署 Django 应用程序是一个相对简单的过程。涉及的主要步骤是:


1. 为您的 Django 应用程序创建 Dockerfile。

2. 从 Dockerfile 构建 Docker 映像。

3. 将Docker镜像部署到生产环境。


在本文中,我将详细引导您完成 docker 化和部署 Django 应用程序所涉及的步骤。我还将提供一些在生产环境中部署 Django 应用程序的技巧和最佳实践。

先决条件

要学习本教程,您需要满足以下先决条件:


  • Python 3.9 或更高版本
  • 码头工人
  • Docker 组合
  • git


如果您想将 Django 应用程序部署到生产环境,您还需要云托管提供商,例如 AWS、Azure 或 Google Cloud Platform。但在本教程中,我将使用 Heroku。


一旦安装了所有先决条件,您就可以开始 Docker 化和部署 Django 应用程序了!

创建 Django 项目

要启动一个新的 Django 项目,您需要使用django-admin命令。此命令允许您为 Django 应用程序创建项目目录和一些基本文件。例如,如果您想创建一个名为my_project的项目,您可以在终端中运行以下命令:


django-admin startproject my_project


这将创建一个名为“my_project”的目录,其结构如下:



我的项目/


├── 管理.py


└── 项目/


├──在里面.py


├── 设置.py


└── urls.py


manage.py文件是一个脚本,允许您为项目执行各种任务,例如运行开发服务器、创建数据库迁移和测试代码。 project/目录包含项目的设置和配置文件。


settings.py文件定义项目的主要设置,例如数据库连接、安装的应用程序和中间件。 urls.py文件将项目的 URL 映射到应用程序的视图。


创建新的 Django 项目后,您可以通过运行开发服务器在本地测试它。开发服务器是一个简单的 Web 服务器,在您的计算机上运行并为您的项目文件提供服务。要启动开发服务器,请在终端中运行以下命令:


python manage.py runserver


默认情况下,这将在端口 8000 上启动服务器。然后您可以打开浏览器并转到http://localhost:8000/查看默认的 Django 主页。

Django项目的基本结构和文件

Django 项目由多个文件和目录组成,它们定义 Web 应用程序的功能和外观。 Django 项目的主要组件是:


manage.py :一个脚本,提供用于管理项目的各种命令,例如创建应用程序、迁移数据库和测试代码。


project/ :包含项目的设置和配置文件的目录。该目录下的主要文件有:

 `settings.py`: A file that defines the main settings for your project, such as the database connection, the installed apps, and the middleware. You can customize this file to suit your needs and preferences. `urls.py`: A file that maps the URLs of your project to the views of your apps. You can define different URL patterns for different parts of your web application.


apps/ :包含组成项目的所有 Django 应用程序的目录。每个 Django 应用程序都是一个单独的 Python 包,为您的 Web 应用程序提供特定的功能或特性。您可以创建自己的应用程序或使用第三方来源的现有应用程序。

本地测试项目

要在本地测试项目,可以使用开发服务器或Django提供的测试框架。开发服务器是一个简单的 Web 服务器,在您的计算机上运行并为您的项目文件提供服务。测试框架是一个允许您为代码编写和运行单元测试的工具。


要使用开发服务器,您可以在终端中运行以下命令:


python manage.py runserver


默认情况下,这将在端口 8000 上启动服务器。然后,您可以打开浏览器,并转到“http://localhost:8000/”来查看默认的 Django 主页。


要使用测试框架,您可以在终端中运行以下命令:


python manage.py test


这将运行您项目的所有单元测试。如果所有测试都通过,您将看到如下消息:



 Ran 1 test in 0.001s Ok


如果任何测试失败,您将看到一条错误消息,其中包含有关失败的详细信息。您可以使用此信息来调试和修复您的代码。


在本地测试项目并对结果感到满意后,您可以将其部署到生产环境。

Docker 化 Django 项目

什么是 Dockerfile?

Dockerfile 是一个文本文件,其中包含有关如何构建 Docker 映像的说明。 Docker 映像是一个独立的可执行包,其中包含运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。


要创建 Dockerfile,您需要指定基础映像、安装所需软件包所需运行的命令以及启动应用程序所需运行的命令。

Django 项目的示例 Dockerfile

以下是 Django 项目的 Dockerfile 示例:


 FROM python:3.9 #Install Django and other required packages RUN pip install django # Copy the Django project files into the image COPY ./app # Set the working directory WORKDIR /app # Start the Django development server CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]



此 Dockerfile 将构建一个包含 Python 3.9、Django 和 Django 项目文件的 Docker 映像。该映像将配置为在端口 8000 上启动 Django 开发服务器。

什么是 docker-compose.yml 文件?

docker-compose.yml 文件是一个 YAML 文件,它定义组成 Docker 化应用程序的服务。服务可以是单个 Docker 容器或一组 Docker 容器。


要为 Django 项目创建 docker-compose.yml 文件,您需要定义 Web 服务和数据库服务。 Web 服务将运行 Django 应用程序,数据库服务将运行 Django 应用程序使用的数据库。

Django 项目的示例 docker-compose.yml 文件

以下是 Django 项目的 docker-compose.yml 文件示例:


 version: "3.9" services: web: build: ports: -"8000:8000" volumes -./:/app db: image: postgres:14.0-alpine volumes: -./postgres:/var/lib/postgresql/data



此 docker-compose.yml 文件定义了两个服务: webdbweb服务将从我们在上一节中创建的 Dockerfile 构建 Docker 映像。 web服务还将在主机上公开端口8000,以便我们可以访问Django开发服务器。


db服务将使用官方 PostgreSQL Docker 镜像。 db服务还将主机上的postgres目录挂载到容器内的/var/lib/postgresql/data目录。这将确保数据库文件在容器重新启动之间保留。

构建并运行 Docker 容器

要构建并运行 Docker 容器,我们可以使用以下命令:


docker-compose up -d


此命令将为“web”和“db”服务构建 Docker 镜像(如果它们尚不存在)。然后,该命令将启动“web”和“db”服务的 Docker 容器。

本地测试 Docker 化的 Django 项目

Docker 容器运行后,我们可以使用 Web 浏览器在本地测试 Dockerized Django 项目。打开网络浏览器,然后导航到“http://localhost:8000”。您现在应该能够看到 Django 开发页面。


您还可以通过http://localhost:8000/admin/登录 Django 管理页面。用户名和密码默认为adminadmin

部署 Django 项目

现在,是时候使用 Git、GitHub 和 Heroku 将 Django 项目部署到云平台了。您还将使用 Web 浏览器测试已部署的 Web 应用程序。

什么是 Git,为什么我们需要它?

Git 是一个软件工具,可以帮助您管理项目的源代码。它允许您跟踪对代码所做的更改,与其他开发人员协作,并在出现问题时恢复到以前的版本。


Git 还允许您将代码推送到远程存储库,例如 GitHub,您可以在其中存储代码并与其他人共享代码。

如何创建 GitHub 存储库并将我们的代码推送到 GitHub?

如果您已经创建了 GitHub 存储库,请忽略以下内容。


要为您的 Django 项目创建 GitHub 存储库,您需要执行以下步骤:


- 在GitHub上创建免费帐户


- 转到您的个人资料页面,然后单击“存储库”旁边的“新建”按钮。


- 为您的存储库命名,例如django-docker-app ,并可选择添加描述。


- 单击创建存储库按钮。


现在您已经在 GitHub 上创建了一个空存储库。要将代码推送到此存储库,您需要在终端中使用“git”命令。我假设您已经在本地计算机上安装了 Git,并在 Django 项目文件夹中初始化了 Git 存储库。如果没有,请按照官方文档进行操作。


要将代码推送到 GitHub,您需要执行以下步骤:


- 转到终端中的 Django 项目文件夹,然后输入git status以查看存储库的当前状态。你应该看到这样的东西:


 On branch main Your branch is up to date with 'origin/main'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: Dockerfile modified: docker-compose.yml modified: requirements.txt no changes added to commit (use "git add" and/or "git commit -a")


这意味着您有一些已修改的文件未暂存以供提交。要暂存它们以进行提交,您需要使用git add命令。


- 输入git add 。暂存所有修改的文件以供提交。或者,您可以指定我们要暂存的文件名,例如git add Dockerfile docker-compose.yml requirements.txt


- 再次输入git status以查看存储库的更新状态。你应该看到这样的东西:


 On branch main Your branch is up to date with 'origin/main'. Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: Dockerfile modified: docker-compose.yml modified: requirements.txt


这意味着您有一些需要提交的更改。要提交它们,您需要使用git commit命令。


- 键入git commit -m "Add Docker configuration files"以提交分阶段更改,并包含一条描述我们所做操作的消息。或者,您可以省略-m标志并在编辑器中输入较长的消息,该编辑器将在键入git commit后打开。


- 再次输入git status以查看存储库的最终状态。你应该看到这样的东西:


 On branch main Your branch is ahead of 'origin/main' by 1 commit. (use "git push" to publish your local commits) nothing to commit, working tree clean


这意味着您有一个提交尚未推送到远程存储库。要推送它,您需要使用git push命令。


- 输入git push origin main将本地提交推送到 GitHub 上的远程存储库。


或者,您可以指定要推送的远程名称和分支名称,例如git push origin main


系统可能会要求您输入 GitHub 用户名和密码,或使用个人访问令牌来验证您的身份。


- 转到您的 GitHub 存储库页面,然后刷新它。您应该在页面上看到您的代码和提交消息。


您已成功将代码推送到 GitHub。现在,您可以继续下一步,即将 Django 项目部署到 Heroku。

什么是 Heroku,为什么需要它?

Heroku 是一个云平台,可让您部署、管理和扩展 Web 应用程序。它支持各种编程语言、框架和数据库,例如Python、Django和PostgreSQL。


它还提供各种功能和附加组件来增强我们的 Web 开发体验,例如日志记录、监控、缓存、安全性等。


您需要 Heroku,因为它使您的部署过程变得更轻松、更快。您可以使用 Heroku 部署 Django 项目,而无需担心底层基础设施,例如服务器、网络或操作系统。


您还可以使用 Heroku 根据流量和需求扩展您的 Web 应用程序。 Heroku 可以为您处理 Web 部署的所有复杂性和挑战。

如何创建 Heroku 帐户并安装 Heroku CLI 工具?

要创建 Heroku 帐户,您需要按照以下步骤操作:


- 转到Heroku并单击“注册”按钮。

- 填写必填信息,例如姓名、电子邮件、密码等。

- 选择主要开发语言,例如 Python。

- 单击“创建免费帐户”按钮。

- 检查我们的电子邮件并单击链接以验证我们的帐户。


现在,您已经创建了一个免费的 Heroku 帐户。要安装 Heroku CLI 工具,您需要按照以下步骤操作:


- 转到 [ Heroku CLI ,并为我们的操作系统选择适当的安装程序,例如 Windows、Mac OS X 或 Linux。


- 下载并运行安装程序,然后按照屏幕上的说明进行操作。


- 打开终端,然后输入heroku --version以验证安装是否成功。你应该看到这样的东西:


heroku/7.59.0 win32-x64 node-v12.21.0


现在,您已在本地计算机上安装了 Heroku CLI 工具。您可以使用此工具从终端与 Heroku 交互。

如何创建 Heroku 应用程序并配置所需的设置?

要为 Django 项目创建 Heroku 应用程序,我们需要执行以下步骤:


- 转到终端中的 Django 项目文件夹,然后输入heroku login以使用 Heroku CLI 工具登录到您的 Heroku 帐户。系统可能会要求您输入电子邮件和密码,或使用网络浏览器来验证您的身份。


- 输入heroku create django-docker-app以创建一个名为django-docker-app新 Heroku 应用程序。或者,您可以省略名称,让 Heroku 为您生成一个随机名称。你应该看到这样的东西:


 Creating ⬢ django-docker-app... done https://django-docker-app.herokuapp.com/ | https://git.heroku.com/django-docker-app.git


这意味着您已经创建了一个带有 Web URL 和 Git URL 的新 Heroku 应用程序。 Web URL 是您可以访问已部署的 Web 应用程序的位置,Git URL 是您可以将代码推送到 Heroku 的位置。


- 输入heroku config:set SECRET_KEY=<your_secret_key>为 Django 项目的SECRET_KEY设置设置环境变量。您需要将<your_secret_key>替换为可以使用Django Secret Key Generator等工具生成的随机字符串。


或者,您可以使用settings.py文件中现有的密钥,但出于安全原因,不建议这样做。


- 输入heroku addons:create heroku-postgresql:hobby-dev将免费的 PostgreSQL 数据库插件添加到您的 Heroku 应用程序中。这将为您的 Django 项目创建一个新数据库,并为您的 Django 项目的DATABASE_URL设置设置一个环境变量。你应该看到这样的东西:

 Creating heroku-postgresql:hobby-dev on ⬢ django-docker-app... free Database has been created and is available ! This database is empty. If upgrading, you can transfer ! data from another database with pg:copy Created postgresql-curved-12345 as DATABASE_URL Use heroku addons:docs heroku-postgresql to view documentation


这意味着您已经添加了一个名为PostgreSQL-curved-12345和 URL DATABASE_URL 的PostgreSQL 数据库插件。


- 输入heroku config以查看您为 Heroku 应用程序设置的环境变量列表。你应该看到这样的东西:


 === django-docker-app Config Vars DATABASE_URL: postgres://<username>: <password>@<host>:<port>/<database> SECRET_KEY: <your_secret_key>


这意味着您有两个环境变量DATABASE_URLSECRET_KEY ,您可以在 Django 项目设置中使用它们。


现在您已经创建了 Heroku 应用程序并配置了 Django 项目所需的设置,您可以继续下一步,即将 Django 项目部署到 Heroku。


如何使用“ heroku ”命令将 Django 项目部署到 Heroku?


要使用heroku命令将我们的Django项目部署到Heroku,您需要执行以下步骤:


- 转到终端中的 Django 项目文件夹,然后输入heroku container:login以使用 Heroku CLI 工具登录到 Heroku 容器注册表。这将允许您将我们的 Docker 镜像推送到 Heroku。


- 输入heroku container:push web -a django-docker-app来构建 Docker 镜像并将其推送到 Heroku。您需要指定 Heroku 应用程序的名称,在本例中为django-docker-app 。你应该看到这样的东西:


 === Building web (Dockerfile) Sending build context to Docker daemon 1.024kB Step 1/9 : FROM python:3.9-slim ---> 7f5b6ccd03e9 Step 2/9 : ENV PYTHONUNBUFFERED 1 ---> Using cache ---> 64b5d0e40a22 Step 3/9 : RUN mkdir /code ---> Using cache ---> 4d8c638f2b6c Step 4/9 : WORKDIR /code ---> Using cache ---> e69c02a028cd Step 5/9 : COPY requirements.txt /code/ ---> Using cache ---> 8f0f3e0f2d8c Step 6/9 : RUN pip install -r requirements.txt ---> Using cache ---> 0f7b497d81ed Step 7/9 : COPY . /code/ ---> Using cache ---> c0a8e9a32b16 Step 8/9 : EXPOSE 8000 ---> Using cache ---> a1d36a4a2da4 Step 9/9 : CMD ["gunicorn", "django_docker.wsgi", "--bind", "0.0.0.0:8000"] ---> Using cache ---> f7f3c0418a1d Successfully built f7f3c0418a1d Successfully tagged registry.heroku.com/django-docker-app/web:latest === Pushing web (Dockerfile) The push refers to repository [registry.heroku.com/django-docker-app/web] f7f3c0418a1d: Pushed latest: digest: sha256:6cbbf22cf6aa60e0343e6d8e7c4c2eeb2e cb8fd5e82a42dfe5f4aeeb15af89ec size: 528 Your image has been successfully pushed. You can now release it with the 'container:release' command.


这意味着您已经构建了 Docker 镜像并将其推送到 Heroku。


- 输入heroku container:release web -a django-docker-app将 Docker 镜像发布到 Heroku 应用程序。你应该看到这样的东西:


 Releasing images web to django-docker-app... done


这意味着您已将 Docker 映像发布到 Heroku 应用程序。


- 输入heroku run python manage.py migrate -a django-docker-app在 Heroku 应用程序上运行数据库迁移。这将为 PostgreSQL 数据库上的 Django 项目创建必要的表和索引。你应该看到这样的东西:


 Running python manage.py migrate on ⬢ django-docker-app... up, run.1234 (Free) Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions, polls Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying auth.0010_alter_group_name_max_length... OK Applying auth.0011_update_proxy_permissions... OK Applying auth.0012_alter_user_first_name_max_length... OK Applying polls.0001_initial... OK Applying sessions.0001_initial... OK


这意味着您已在 Heroku 应用程序上运行数据库迁移。


- 输入heroku open -a django-docker-app在 Web 浏览器中打开我们部署的 Web 应用程序。您应该看到我们的 Django 项目在 Heroku 上运行。


您已使用heroku命令成功将 Django 项目部署到 Heroku。您现在可以享受您的 Web 应用程序并与其他人共享。

结论

在本教程中,您学习了如何使用 Docker、Django 和 Heroku 对 Django 应用程序进行 Docker 化和部署。您了解了 Docker 如何帮助您为应用程序创建隔离且可重现的环境,以及 Heroku 如何简化部署过程。


您还学习了如何使用 Docker Compose 管理多个容器和服务,以及如何为不同环境配置 Django 设置。


Docker 化和部署 Django 应用程序可以带来很多好处,例如:


- 更快的开发和测试周期

- 更轻松地协作和共享代码

- 跨平台一致且可靠的性能

- 资源的可扩展性和灵活性

- 安全性和依赖隔离


继续阅读:CI/CD 对于快速可靠的软件交付至关重要。要优化 CI/CD 管道以实现最大效率,请选择正确的工具、简化工作流程、使用自动化测试和 QA、并行化构建、使用监控和反馈循环、执行安全检查并持续改进管道。阅读更多

另请阅读:我们在 DockerCon 2023 上学到的一切阅读更多

其他资源

- Docker 文档:Docker 的官方文档,您可以在其中找到指南、教程、参考资料等。


- Django 文档:Django 的官方文档,您可以在其中找到主题、操作指南、参考资料等。