在此以前,我一直用uwsgi+virtualenv+nginx
方式進行應用部署,操做起來比較麻煩,並且依賴於服務器上的Python版本,服務的管理方面單純uwsgi + pid算不上特別麻煩但總沒有docker compose方便,無奈本來的服務器是32位系統的用不上docker,如今又增長了一個新服務器,因此趕忙把docker安排上~ 不得不說真的太簡單太方便了,全程傻瓜式操做,也基本沒像以前uwsgi部署那樣遇到一些坑,真棒!python
最好是在開發機裝上docker和compose,方便本機測試,安裝方法直接參考官網,本文再也不贅述。nginx
參考:https://docs.docker.com/web
首先是要給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
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 start
、docker-compose stop
官網上有很是詳細的配置文檔,本文中我只介紹幾個我經常使用的配置項。
build 能夠指定包含構建上下文的路徑,好比前面docker-compose.yml
裏的:
web: build: .
注意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是要在一個服務裏面的鏡像構建完啓動以後執行的命令,通常來講只能執行一條,不過也能執行多條(不推薦)
看了一眼Stack Overflow,大致兩種方法:
第一種:
web: command: python a.py && python b.py
第二種,利用管道:
web: command: - /bin/sh - -c - | python a.py python b.py
大概就說這麼多啦,由於其實真的太簡單了,更多操做參考官網文檔吧~