當前位置:
首頁 > 最新 > 使用 Docker 容器化 Django Web 應用

使用 Docker 容器化 Django Web 應用

在這篇文章中,我將展示如何使用 Docker 容器化現有項目。我從 GitHub 中挑選了一個隨機項目,該項目有一個公開的 issue[1],稱 Docker 化(後文使用 Dockerize)可以在這裡作為示例進行貢獻和使用。

為什麼要在現實世界中 Dockerize 現有的 Django Web 應用程序呢?有很多原因,但如果你沒有,那麼就當玩玩,哈哈。

我決定使用 Docker,因為我的一個應用程序很難部署。有太多的系統依賴,太多的資料庫,還有需要單獨部署的 Celery 和 rabbitMQ。因此,每當新開發人員加入團隊或不得不使用新計算機時,系統的部署都需要很長時間。

部署的麻煩導致時間的損失,而時間損失又導致懶惰,懶惰又導致不良習慣,並這樣繼續下去……例如,懶可能會使你決定使用 SQLite 而不是 Postgres(譯註:前者是文件資料庫,無需部署)。

如果你不知道 Docker 是什麼,你只需要將它理解成一個巨大的 virtualenv(一種 Python 虛擬環境),它實際上不僅只包含一些 Python 軟體包,且使用 Containers(容器)將操作系統中的所有依賴與應用程序,資料庫,Worker(譯註:應該說的是 Celery Worker) 等等打包結合。

Docker

好吧,「Talk is cheap,Show me some code」,老兄。

首先,使用 Ubuntu 和 Mac OS 安裝 Docker 我沒有遇到任何問題,但在 Windows 上我沒裝成功(尷尬)。

為了告訴 Docker 如何將您的應用程序作為容器運行,您必須創建一個 Dockerfile:

然後我們一行一行看:

Docker 鏡像

在這裡,使用來自 Docker Hub 的鏡像,它幫助我們建立一個已經安裝了 Python3.6 的Ubuntu 容器。

環境變數(ENV)

你可以使用 Env 關鍵字創建任意的環境變數。

例如,如果你使用它來存儲你的 Django 密鑰,你可以這樣寫:

在你的代碼里這樣使用:

執行命令(RUN)

Docker 運行命令很容易理解。就是在你的容器裡面運行一個命令。我在裡面引用是因為docker 創建了一些子容器,因此在重建容器時不必再次運行相同的命令。

在這種情況下,我們創建用來保存我們項目的 /webapps 目錄。

WORKDIR 也是不言而喻的。它只是讓 docker 知道後面 RUN 時的目錄。

之後,我們安裝操作系統依賴項(apt-get 是操作系統的包管理工具),然後安裝 Python 依賴項(pip 是 Python 的包管理工具)。

複製(COPY)和添加(ADD)

COPY 和 ADD 是相同的。都將您的計算機(主機)中的文件複製到容器中。

暴露埠(EXPOSE)

EXPOSE 指令用於將埠從 Docker 內映射到主機。

好了,現在怎麼樣?但是我們如何添加更多容器並使它們一起工作?比如在容器中還需要 PostgreSQL 呢?別擔心,我們繼續往下看。

Docker-Compose

Docker-compose 是一個用於運行多個 Docker 容器的工具。表徵是一個 yml 文件,你只需要在你的項目文件夾中創建一個 docker-compose.yml 文件。

在這裡,我使用 Docker Hub 中的 [Postgres 鏡像[2]。

現在,讓我們更改 settings.py 以配置 Postgres 作為資料庫。

我們差不多完成了。我來談談一下 docker-compose 文件。

卷(VOLUMES)

當您在共享卷上寫入文件時,該文件也正在寫入您的容器中。

在這,當前目錄(.)將作為 /webapps 目錄在容器上共享。

LINKS

您可以使用其名稱引用你的另一個容器。既然我們為我們的 Postgres 創建了一個 db 容器,我們可以將它連接到我們的 web 容器上。你可以在我們的 settings.py 文件中看到我用 "db" 作為 HOST。(這裡蠻神奇的)

DEPENDS_ON

為了你的應用程序正常工作,你的資料庫必須在 web 容器之前準備好,否則會引發異常。

Command

Command 是容器在啟動後立即運行的默認命令。

對於我們的示例,我創建了一個 run_web.sh 腳本,它將運行遷移(migrations),收集靜態文件並啟動開發伺服器。

如下:

可能會有人會爭辯說,每次容器啟動都自動運行遷移不是一個好習慣。我也同意,你可以直接在網路機器上運行它。

你可以這樣訪問你的容器:

如果你希望可以在不訪問容器本身的情況下運行它,只需更改上一個命令的最後一個參數 bash 即可,如:

其它命令也一樣:

運行 Docker

我們的 Dockerfile,docker-compose.yml 和 run_web.sh 已經就位了,我們可以一起運行它們:

項目在這裡:https://github.com/ffreitasalves/django-boards。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Docker 的精彩文章:

使用Docker和Elasticsearch搭建全文本搜索引擎應用
是時候思考一下微服務了

TAG:Docker |