後端開發之光!Django應用的容器化部署實踐~

在此以前,我一直用uwsgi+virtualenv+nginx方式進行應用部署,操做起來比較麻煩,並且依賴於服務器上的Python版本,服務的管理方面單純uwsgi + pid算不上特別麻煩但總沒有docker compose方便,無奈本來的服務器是32位系統的用不上docker,如今又增長了一個新服務器,因此趕忙把docker安排上~ 不得不說真的太簡單太方便了,全程傻瓜式操做,也基本沒像以前uwsgi部署那樣遇到一些坑,真棒!python

安裝

最好是在開發機裝上docker和compose,方便本機測試,安裝方法直接參考官網,本文再也不贅述。nginx

參考:https://docs.docker.com/web

編寫Dockerfile

首先是要給Django應用寫一個Dockerfile來構建服務鏡像。sql

個人Dockerfile內容以下,每一行都有註釋,供各位參考:docker

FROM python:3.7

# 設置 python 環境變量
ENV PYTHONUNBUFFERED 1

# 建立 code 文件夾並將其設置爲工做目錄
RUN mkdir /code
WORKDIR /code

# 更新 pip
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U
# 設置清華源
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

# 將 requirements.txt 複製到容器的 code 目錄
ADD requirements.txt /code/

# 安裝庫
RUN pip install -r requirements.txt

# 將當前目錄複製到容器的 code 目錄
ADD . /code/

寫完以後能夠直接運行docker run構建鏡像,以後進入container的命令行執行python manage.py runserver 0.0.0.0 8000測試可否正常啓動服務器(固然沒有暴露端口前是沒辦法訪問到的)shell

使用compose編排服務

Docker Compose是一個用來定義和運行復雜應用的Docker工具。一個使用Docker容器的應用,一般由多個容器組成。使用Docker Compose再也不須要使用shell腳原本啓動容器。 
Compose 經過一個配置文件來管理多個Docker容器,在配置文件中,全部的容器經過services來定義,而後使用docker-compose腳原本啓動,中止和重啓應用,和應用中的服務以及全部依賴服務的容器,很是適合組合使用多個容器進行開發的場景。數據庫

官方文檔:https://docs.docker.com/compose/overview/bash

注意compose版本須要和docker版本正確對應才能正常運行,docker更新很快,安裝最好從官網最新版本進行~服務器

下面附上個人docker-compose.yml文件,後面會對配置項目進行介紹工具

version: "3"
services:

  mongo:
    image: mongo
    expose:
      - 27017
    restart: on-failure # 退出代碼指示出現故障錯誤時重啓

  postgres:
    image: postgres
    expose:
      - 5432
    restart: on-failure
    environment:
      - POSTGRES_PASSWORD=password

  web:
    restart: always # 除正常工做外,容器會在任什麼時候候重啓,好比遭遇 bug、進程崩潰、docker 重啓等狀況。
    build: .
    environment:
      - ENVIRONMENT=docker
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "9000:8000"
    depends_on:
      - postgres
      - mongo

能夠看到我這個項目裏面使用到了PostgreSQL和MongoDB,使用compose把他們整合在一塊兒,而且暴露端口給web(也就是Django應用)使用。

編寫完docker-compose.yml文件以後,執行docker-compose up就能夠自動構建各個鏡像而且運行服務了,很是方便。

若是須要後臺運行則使用:docker-compose up -d

從新構建鏡像使用:docker-compose up --build

刪除使用:docker-compose down

啓動和中止:docker-compose startdocker-compose stop

compose配置

官網上有很是詳細的配置文檔,本文中我只介紹幾個我經常使用的配置項。

build

build 能夠指定包含構建上下文的路徑,好比前面docker-compose.yml裏的:

web:
  build: .

volumes配置

注意web節點下有個volumes配置。

從前面Dockerfile能夠看到,Django應用的代碼是在構建時靜態複製到容器中的,即經過Dockerfile文件中的ADD . /code/命令實現物理主機中的源碼複製到容器中,這樣在後續物理主機src目錄中代碼的更改不會反應到容器中。 
能夠經過volumes 關鍵字實現物理主機目錄掛載到容器中的功能(這時能夠刪除Dockerfile中的ADD . /code/命令了,不須要建立鏡像時將代碼打包進鏡像,而是經過volums動態掛載,容器和物理host共享數據卷,這樣仍是實現程序的熱更新)

這兩個差很少其實,不過前者官網文檔說已經不建議使用了,因此用depends_on吧,做用就是把多個服務中的容器連接起來,好比本文例子中,個人Django應用須要用到postgresql數據庫和MongoDB,因此我把他們連接起來,而且暴露端口(但要注意的是,在docker中,每個鏡像都是單獨的一個主機,因此這三個服務至關因而三個不一樣的虛擬機,不能經過 localhost:port 訪問),這樣在Django服務裏須要使用 postgres:5432 這樣的形式使用。

其中postgres是咱們寫在depends_on裏面的服務名稱,固然能夠設置別名,好比 postgres:db,那麼就是經過 db:5432去訪問了~

經過這個名稱去訪問服務器的原理至關於本地DNS吧,或者說是host文件~

數據庫遷移

當Django應用在服務器上部署以後,還面臨一個數據庫遷移的問題,其實很好解決,要不就直接進docker環境執行命令,或者使用docker-compose run來執行,以下:

docker-compose run web python3 manage.py makemigrations
docker-compose run web python3 manage.py migrate

其餘須要執行的命令同理~

command

這個command是要在一個服務裏面的鏡像構建完啓動以後執行的命令,通常來講只能執行一條,不過也能執行多條(不推薦)

看了一眼Stack Overflow,大致兩種方法:

第一種:

web:
  command: python a.py && python b.py

第二種,利用管道:

web:
  command:
    - /bin/sh
    - -c
    - |
      python a.py
      python b.py

大概就說這麼多啦,由於其實真的太簡單了,更多操做參考官網文檔吧~

參考資料

相關文章
相關標籤/搜索