歡迎光臨
每天分享高質量文章

使用 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:
FROM python:3.6
ENV PYTHONUNBUFFERED 1
RUN mkdir /webapps
WORKDIR /webapps
# Installing OS Dependencies
RUN apt-get update && apt-get upgrade -y && apt-get install -y \
libsqlite3-dev
RUN pip install -U pip setuptools
COPY requirements.txt /webapps/
COPY requirements-opt.txt /webapps/
RUN pip install -r /webapps/requirements.txt
RUN pip install -r /webapps/requirements-opt.txt
ADD . /webapps/
# Django service
EXPOSE 8000
然後我們一行一行看:
Docker 映象

FROM python:3.6
在這裡,使用來自 Docker Hub 的映象,它幫助我們建立一個已經安裝了 Python3.6 的Ubuntu 容器。
環境變數(ENV)
你可以使用 Env 關鍵字建立任意的環境變數。
ENV PYTHONUNBUFFERED 1
例如,如果你使用它來儲存你的 Django 金鑰,你可以這樣寫:
ENV DJANGO_SECRET_KEY abcde0s&&$uyc)hf_3rv@!a95nasd22e-dxt^9k^7!f+$jxkk+$k-
在你的程式碼裡這樣使用:
import os
SECRET_KEY = os.environ['DJANGO_SECRET_KEY']

執行命令(RUN)
Docker 執行命令很容易理解。就是在你的容器裡面執行一個命令。我在裡面取用是因為docker 建立了一些子容器,因此在重建容器時不必再次執行相同的命令。
RUN mkdir /webapps
WORKDIR /webapps
# Installing OS Dependencies
RUN apt-get update && apt-get upgrade -y && apt-get install -y \
libsqlite3-dev
RUN pip install -U pip setuptools
COPY requirements.txt /webapps/
COPY requirements-opt.txt /webapps/
RUN pip install -r /webapps/requirements.txt
RUN pip install -r /webapps/requirements-opt.txt
ADD . /webapps/
在這種情況下,我們建立用來儲存我們專案的 /webapps 目錄。
WORKDIR 也是不言而喻的。它只是讓 docker 知道後面 RUN 時的目錄。
之後,我們安裝作業系統依賴項(apt-get 是作業系統的包管理工具),然後安裝 Python 依賴項(pip 是 Python 的包管理工具)。
複製(COPY)和新增(ADD)
COPY 和 ADD 是相同的。都將您的計算機(主機)中的檔案複製到容器中。
暴露埠(EXPOSE)
EXPOSE 指令用於將埠從 Docker 內對映到主機。
# Django service
EXPOSE 8000
好了,現在怎麼樣?但是我們如何新增更多容器並使它們一起工作?比如在容器中還需要 PostgreSQL 呢?別擔心,我們繼續往下看。
Docker-Compose
Docker-compose 是一個用於執行多個 Docker 容器的工具。表徵是一個 yml 檔案,你只需要在你的專案檔案夾中建立一個 docker-compose.yml 檔案。
version: '3.3'
services:
 # Postgres
 db:
   image: postgres
   environment:
     - POSTGRES_USER=postgres
     - POSTGRES_PASSWORD=postgres
     - POSTGRES_DB=postgres
 web:
   build: .
   command: ["./run_web.sh"]
   volumes:
     - .:/webapps
   ports:
     - "8000:8000"
   links:
     - db
   depends_on:
     - db
在這裡,我使用 Docker Hub 中的 [Postgres 映象[2]。
現在,讓我們更改 settings.py 以配置 Postgres 作為資料庫。
DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.postgresql_psycopg2',
       'NAME': 'postgres',
       'USER': 'postgres',
       'PASSWORD': 'postgres',
       'HOST': 'db',
       'PORT': '5432',
   }
}
我們差不多完成了。我來談談一下 docker-compose 檔案。
捲(VOLUMES)
當您在共享捲上寫入檔案時,該檔案也正在寫入您的容器中。
volumes:
 - .:/webapps
在這,當前目錄(.)將作為 /webapps 目錄在容器上共享。
LINKS

links:
 - db
您可以使用其名稱取用你的另一個容器。既然我們為我們的 Postgres 建立了一個 db 容器,我們可以將它連線到我們的 web 容器上。你可以在我們的 settings.py 檔案中看到我用 ‘db’ 作為 HOST。(這裡蠻神奇的)
DEPENDS_ON
為了你的應用程式正常工作,你的資料庫必須在 web 容器之前準備好,否則會引發異常。
depends_on:
 - db

Command
Command 是容器在啟動後立即執行的預設命令。
對於我們的示例,我建立了一個 run_web.sh 指令碼,它將執行遷移(migrations),收集靜態檔案並啟動開發伺服器。
如下:

#!/usr/bin/env bash

cd django-boards/
python manage.py migrate
python manage.py collectstatic --noinput
python manage.py runserver 0.0.0.0:8000

可能會有人會爭辯說,每次容器啟動都自動執行遷移不是一個好習慣。我也同意,你可以直接在網路機器上執行它。
你可以這樣訪問你的容器:
docker-compose run web bash
如果你希望可以在不訪問容器本身的情況下執行它,只需更改上一個命令的最後一個引數 bash 即可,如:
docker-compose run web python manage.py migrate
其它命令也一樣:
docker-compose run web python manage.py test
docker-compose run web python manage.py shell

執行 Docker
我們的 Dockerfile,docker-compose.yml 和 run_web.sh 已經就位了,我們可以一起執行它們:
docker-compose up
專案在這裡:https://github.com/ffreitasalves/django-boards。
相關連結:
  1. https://github.com/shakedown-street/punkweb-boards/issues/66

  2. https://hub.docker.com/_/postgres/

原文連結:https://fernandofreitasalves.com/dockerizing-django-for-development/
譯文連結:https://zhuanlan.zhihu.com/p/33855891

Kubernetes 實戰培訓

本次培訓內容包括:Docker容器的原理與基本操作;容器網路與儲存解析;Kubernetes的架構與設計理念詳解;Kubernetes的資源物件使用說明;Kubernetes 中的開放介面CRI、CNI、CSI解析;Kubernetes監控、網路、日誌管理;容器應用的開發流程詳解等,點選識別下方二維碼加微信好友瞭解具體培訓內容

3月23日開始上課,點選閱讀原文連結即可報名。
贊(0)

分享創造快樂