5分鐘將 Django 項(xiàng)目進(jìn)行容器化管理
本文轉(zhuǎn)載自微信公眾號(hào)「Python中文社區(qū)」,作者M(jìn)ATTHEW 。轉(zhuǎn)載本文請(qǐng)聯(lián)系Python中文社區(qū)公眾號(hào)。
本教程將向您展示如何在不到 5 分鐘的時(shí)間內(nèi)對(duì) Django 項(xiàng)目進(jìn)行 Dockerize 容器化管理。如果您已經(jīng)使用 Django 一段時(shí)間了,那么您之前很可能聽(tīng)說(shuō)過(guò) Docker。這里有一個(gè) Docker 的快速總結(jié),以及為什么應(yīng)該考慮在你的項(xiàng)目中使用它。
Dockerizing 容器化 Django 項(xiàng)目可能是一項(xiàng)艱巨的任務(wù)。一個(gè)復(fù)雜的 Django 項(xiàng)目可以有許多活動(dòng)部分:Django 服務(wù)器、數(shù)據(jù)庫(kù),可能還有 Redis 和 Celery 進(jìn)程。
Docker 簡(jiǎn)介
Docker 是一種非常流行的容器化管理工具。容器很強(qiáng)大,因?yàn)槊看螁?dòng)容器時(shí),您的環(huán)境都以完全相同的方式設(shè)置。
這樣做的好處是:
- 您的代碼可以在任何支持 Docker 的操作系統(tǒng)上運(yùn)行。
- 您無(wú)需在主機(jī)上配置系統(tǒng)依賴項(xiàng),從而節(jié)省時(shí)間。
- 您的本地環(huán)境和生產(chǎn)環(huán)境可以完全相同,這樣能夠消除僅在生產(chǎn)中發(fā)生的錯(cuò)誤。
了解 Docker
本教程并未深入介紹 Docker 的工作原理。相反,本教程將重點(diǎn)介紹如何專門(mén)為 Django 設(shè)置 Docker。
如果您想了解有關(guān) Docker 的更多信息,我的建議是閱讀官方指南。這是一個(gè)相對(duì)較短的教程,但涵蓋了您需要知道的所有內(nèi)容!
https://docs.docker.com/language/python/
將 Django 項(xiàng)目 Docker 化
無(wú)論是現(xiàn)有項(xiàng)目還是您正在啟動(dòng)一個(gè)新項(xiàng)目,我們都將使用相同的資源將 Docker 實(shí)施到項(xiàng)目中。
我們將要使用的資源是 Cookiecutter Django。 Cookiecutter是一個(gè)用于從 cookiecutter(項(xiàng)目模板)引導(dǎo)項(xiàng)目的工具。它在創(chuàng)建新項(xiàng)目時(shí)節(jié)省了大量時(shí)間,因?yàn)樗鼮槟渲昧舜罅繕影宕a。
https://github.com/pydanny/cookiecutter-django
Cookiecutter Django 最好的部分之一是它包含 Docker 配置。我們將使用此配置來(lái)了解 Docker 是如何在 Django 項(xiàng)目中實(shí)現(xiàn)的。
入門(mén)
首先,安裝Docker。
我們將創(chuàng)建兩個(gè) Django 項(xiàng)目。第一個(gè)將是一個(gè)使用 django-admin 命令創(chuàng)建的簡(jiǎn)單項(xiàng)目。第二個(gè)項(xiàng)目將使用 Cookiecutter Django 創(chuàng)建。
創(chuàng)建第一個(gè)項(xiàng)目
- virtualenv simpleenv
- source simpleenv/bin/activate
- pip install django
- django-admin startproject simpleproject
創(chuàng)建第二個(gè)項(xiàng)目
在另一個(gè)文件夾中,首先使用 pip install cookiecutter 安裝 Cookiecutter。這將全局安裝 Cookiecutter,以便隨時(shí)訪問(wèn)。
我們現(xiàn)在可以使用任何 Cookiecutter 模板來(lái)引導(dǎo)項(xiàng)目。在新終端中運(yùn)行以下命令以使用 Cookiecutter Django創(chuàng)建項(xiàng)目。
- virtualenv advancedVenv
- source advancedVenv/bin/activate
- cookiecutter gh:pydanny/cookiecutter-django
命令 cookiecutter gh:pydanny/cookiecutter-django 以 Cookiecutter命令行用 GitHub 模板 pydanny/cookiecutter-django 創(chuàng)建項(xiàng)目。
此命令將提示您回答有關(guān)要生成的項(xiàng)目的幾個(gè)問(wèn)題。通過(guò)按 Enter,您可以將每個(gè)答案保留為默認(rèn)值。
當(dāng)提示使用 use_docker 選項(xiàng)時(shí),請(qǐng)確保按“y”,以便使用 Docker 配置項(xiàng)目。
完成所有提示后,將生成一個(gè) Django 項(xiàng)目。我們將專門(mén)查看為配置 Docker 創(chuàng)建的文件。這些是:
- compose文件夾
- .dockerignore 文件
- local.yml 文件
- production.yml文件
TLDR
這就是 Dockerize 容器化管理 Django 項(xiàng)目所需的全部?jī)?nèi)容。只需將這些文件夾和文件復(fù)制到您的其他 Django 項(xiàng)目中并調(diào)整它們,使其指向正確的文件。
如果您想查看更高級(jí)的 Docker 配置,請(qǐng)生成一個(gè)啟用了 use_celery 標(biāo)志的 Cookiecutter Django 項(xiàng)目。Docker 配置將包括 Celery 和 Redis 的設(shè)置。
了解 Docker 配置
compose 文件夾包含兩個(gè)文件夾,一個(gè)用于本地開(kāi)發(fā),一個(gè)用于生產(chǎn)。同樣,local.yml 文件用于本地開(kāi)發(fā),production.yml 文件用于生產(chǎn)。
compose/local 文件夾與 local.yml 文件密切相關(guān)。
compose/production文件夾與 production.yml文件密切相關(guān)。
Docker-Compose 是最需要重點(diǎn)掌握的工具。我們使用它來(lái)運(yùn)行多容器 Docker 應(yīng)用程序。它是安裝 Docker 附帶的命令行程序的一部分。
使用 Docker 運(yùn)行項(xiàng)目
確保您的計(jì)算機(jī)上運(yùn)行了 Docker 應(yīng)用程序,否則以下命令將無(wú)法正常執(zhí)行。
我們使用 Docker-Compose 來(lái)構(gòu)建我們項(xiàng)目的鏡像Image。 Images就像我們Container應(yīng)用程序的藍(lán)圖。
一旦構(gòu)建了鏡像Image,我們就創(chuàng)建了一個(gè)容器Container,它基本上是一個(gè)鏡像Image的運(yùn)行實(shí)例。如果我們對(duì)項(xiàng)目的依賴項(xiàng)(例如 Python 依賴項(xiàng))進(jìn)行了任何更改,那么我們需要重建 Image 以使其生效。
運(yùn)行以下命令構(gòu)建 Docker Image鏡像:
- docker-compose -f local.yml build
請(qǐng)注意,此命令采用帶有 -f 標(biāo)志的參數(shù)。這告訴 Docker 使用 local.yml 文件作為配置文件。
如果我們打開(kāi) local.yml 文件,會(huì)有以下內(nèi)容:
- 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
這個(gè)文件是一個(gè)配置文件,列出了 Docker 運(yùn)行我們的多容器應(yīng)用程序所需的一切。注意services部分。共有三種服務(wù); django、postgres 和docs。
在每項(xiàng)服務(wù)下都有一些配置選項(xiàng)。
同樣,如果您想深入了解每個(gè)命令的細(xì)節(jié),請(qǐng)返回 Docker 文檔。如果我們看一下 django 服務(wù),我們有以下內(nèi)容:
- django:
- build:
- context: .
- dockerfile: ./compose/local/django/Dockerfile
這會(huì)對(duì)服務(wù)進(jìn)行配置,以便它使用特定的 DockerFile。所使用的 DockerFile 來(lái)自 compose 文件夾內(nèi)的local Docker 配置。
希望這顯示了所有 Docker 配置是如何連接在一起的。 local.yml 文件包含指向 compose 文件夾內(nèi)特定 DockerFiles 的服務(wù)。除了 DockerFiles 之外,還使用了其他文件。
例如,在 compose/django/Dockerfile 文件的末尾,我們有以下內(nèi)容:
- ...
- COPY ./compose/production/django/entrypoint /entrypoint
- RUN sed -i 's/\r$//g' /entrypoint
- RUN chmod +x /entrypoint
- ...
- ENTRYPOINT ["/entrypoint"]
這告訴 Docker,當(dāng) Docker-Compose 使用此 DockerFile 時(shí),它將調(diào)用entrypoint腳本,該腳本可以在 compose/production/django/entrypoint 中找到。打開(kāi)該文件并查看內(nèi)容。您會(huì)看到它基本上在 Postgres 數(shù)據(jù)庫(kù)成功連接時(shí)記錄日志。
再看一下 django 服務(wù):
- django:
- build:
- command: /start
django 服務(wù)的一個(gè)重要部分是 command 屬性。這告訴 Docker 這個(gè)容器的啟動(dòng)命令是start腳本。我們可以在 compose/local/django 中找到這個(gè)文件。在這個(gè)文件中,有以下內(nèi)容:
- #!/bin/bash
- set -o errexit
- set -o pipefail
- set -o nounset
- python manage.py migrate
- python manage.py runserver_plus 0.0.0.0:8000
這應(yīng)該看起來(lái)很熟悉。我們有 Django 遷移和正在運(yùn)行的服務(wù)器。這里需要注意的是 runserver_plus 命令來(lái)自 Django Extensions。如果您沒(méi)有安裝該軟件包,您可以將 runserver_plus 替換為 runserver。
注意不要?jiǎng)h除 0.0.0.0:8000,因?yàn)槿萜餍枰獙⒍丝谟成涞街鳈C(jī)。
現(xiàn)在我們了解了 Docker 是如何配置的,最后一部分是運(yùn)行這個(gè)命令來(lái)啟動(dòng)多容器應(yīng)用程序:
- docker-compose -f local.yml up
這將運(yùn)行 local.yml 文件中的所有服務(wù)。運(yùn)行此命令后,您可以在瀏覽器中轉(zhuǎn)到您的本地主機(jī),您應(yīng)該會(huì)看到默認(rèn)的登錄頁(yè)面。
通過(guò)此設(shè)置,您可以運(yùn)行 Django 服務(wù)器、Postgres 數(shù)據(jù)庫(kù)和文檔。
最終更改
您將需要為您的項(xiàng)目配置 Docker 文件。需要注意的一些事項(xiàng):
環(huán)境變量
Docker Compose 文件將環(huán)境變量文件加載到容器中。這些環(huán)境變量文件存儲(chǔ)在 Cookiecutter Django 生成的 .envs 文件夾中。為了能夠讀取這些值,您需要安裝一個(gè)處理環(huán)境變量的包。
Cookiecutter Django 推薦的包是 Django-Environ。您可以使用以下命令安裝此軟件包:
- pip install django-environ
數(shù)據(jù)庫(kù)設(shè)置
數(shù)據(jù)庫(kù)憑據(jù)也作為環(huán)境變量包含在內(nèi),因此請(qǐng)確保具有正確的數(shù)據(jù)庫(kù)設(shè)置。
- DATABASES = {"default": env.db("DATABASE_URL")}
- DATABASES["default"]["ATOMIC_REQUESTS"] = True
允許的主機(jī)
確保您允許的主機(jī)包括 localhost。
- ALLOWED_HOSTS = ["localhost", "0.0.0.0", "127.0.0.1"]
最終 Docker 依賴于兩個(gè)組件:Docker-Compose 和 DockerFiles。我們有 local.yml 用于本地開(kāi)發(fā)。此文件指向 compose/local 文件夾,其中包含在本地運(yùn)行 Docker 所需的所有內(nèi)容。同樣,我們有 production.yml 用于生產(chǎn),它使用 compose/production 文件夾。
我強(qiáng)烈建議在您自己的項(xiàng)目中使用 Cookiecutter Django。它不僅是專業(yè)開(kāi)發(fā)的絕佳資源,而且可用于學(xué)習(xí)許多最佳實(shí)踐,包括如何在 Django 項(xiàng)目中配置 Docker。