使用 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和Elasticsearch搭建全文本搜索引擎應用
※是時候思考一下微服務了
TAG:Docker |