本文描述了Web項目的兩種部署方案,石器時代的ssh & pull & restart方式不作太多說明node
Fabric 是一個用於ssh的Python庫&命令行工具python
Fabric is a Python (2.5-2.7) library and command-line tool for streamlining the use of SSH for application deployment or systems administration tasks.git
Interfacegithub
flaskweb
djangoshell
...npm
Scriptdjango
fabricflask
conf (服務器配置列表)api
lib(基礎庫&二次開發)
conf_server.sample.py
#!/usr/bin/env python # coding=utf-8 SERVER_DICT = { "www": [ "root@0.0.0.0", "password", "/home/mt/v1" ], "v1": [ "root@0.0.0.0", "password", "/home/mt/v1" ], "v2": [ "root@0.0.0.0", "password", "/home/mt/v2" ], "v3": [ "root@0.0.0.0", "password", "/home/mt/v3" ] }
deploy.py
#!/usr/bin/env python # coding=utf-8 import sys sys.path.append("..") from conf.conf_server import * from fabric.api import env, run, local def run_remote(self): print env.host_string _path = self.project[2] _string = 'su mt -c "cd %s && git pull origin master"' % _path run(_string)
經過不一樣服務器的配置信息,使用http
|socket
等方式發送特定的參數如cloud
|help
來運行上述的命令達到熱更新以及修復的功能.對應的接口實現能夠經過指定:
基於權限的主動更新(不一樣身份的管理員人肉發送命令)
基於項目的自動更新(webhook)
注意:項目代碼須要特定的branch(不過這其實也是規範化的代碼管理必需)
示例:
# 命令行操做 python deploy.py www # Http接口 curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'site=www' "http://api.thonatos.com/deploy/"
Docker是一個將程序以及其依賴打包進一個標準單元的服務或者工具集
Docker allows you to package an application with all of its dependencies into a standardized unit for software development.
Docker服務的基礎是虛擬機,整個Docker服務包含了虛擬機以及操做虛擬機的一些列命令集合
這裏須要理解Docker的幾個基本概念,便於更好的理解這種部署開發&部署方式與常規方案的區別
image(鏡像)
container(容器)
server(服務器)
鏡像至關於一個Linux發行版,對比於Linux下的Ubuntu、CentOs等,咱們能夠按照本身的需求去定義這個發行版的內容以及組件,基礎鏡像是最小化的Linux運行單元,那麼,咱們須要作的就是根據程序的須要,安裝各類依賴組件,並將APP+DEP進行打包,變成咱們的「定製發行版」,以此來部署在真實Server上。於此同時,鏡像在初始化的過程當中,能夠定義一些列操做,好比——安裝依賴、拉取代碼以及運行程序
容器是一個實例化之後的虛擬機,容器依賴於鏡像,在鏡像的基礎上作實例化,是初始化之後的虛擬機
服務器,就是傳統的服務器如實體服務器或者雲主機等
Docker對應了一些列的服務端程序,是標準的C/S架構,每個服務器運行一個或多個容器,一個或多個容器的集合叫作集羣,對服務器進行一些列的包裝後變成一個控制檯,再也不去關心服務器的初始化過程,只管理容器自己是目前Docker的優點所在。具體表現爲,按照原有方式,咱們須要先開通N臺服務器,再依次在每一臺機器上安裝虛擬機;如今須要的是,將全部的服務器進行封裝,變成一個通道,在盒子外,咱們告訴盒子咱們須要多少個容器,它返回給咱們對應的服務便可。國內的DaoCloud、阿里雲容器服務已經相對完善。(阿里測試中,DaoCloud已經相對成熟)
FROM node:argon # Create app directory RUN mkdir -p /usr/src/app WORKDIR /usr/src/app # Clone code & Install app dependencies RUN git clone git@github.com:MT-Libraries/MT-Notes.git ./ RUN npm install EXPOSE 8080 CMD [ "npm", "start" ]
示例在初始化的過程當中會從git拉取代碼並安裝依賴文件,最終運行在8080端口
在DC(DaoCloud)控制檯建立一個集羣
在應用中選擇基於鏡像m建立n個容器
等待初始化完成,能夠看到當前集羣中的節點數量(節點即爲容器數量)
同一個集羣中的機器能夠跑相同或者不一樣的服務,當須要負載均衡時,動態的加入或者移除節點便可(經過配置,自動伸縮)
節點管理經過阿里雲的Agent服務,至關於爲每個節點建立了一個遠程shell,咱們經過控制檯便可輕鬆升級&更新程序
批量更新
動態管理
負載均衡
批量更新,經過一些設定建立的數量如20臺 ,建立完畢後,從原有集羣移除全部節點,加入建立的節點,便可完成更新操做,後續刪除或者銷貨舊版本的容器。停機更新即完成。
動態管理,因爲數量能夠自定義,咱們能夠在用戶無感知的狀況下增長服務器到50或者減小服務器到10,在這個過程當中,用戶是不會感受到變化的(注:這裏須要設計數據共享機制 Session/Cookie)
這兩種方案並不存在互斥性,能夠並從,也能夠只選擇一種,如:
獨立Fabric,則以服務器鏡像爲基礎,備份服務器自己(缺點是數據量大,服務器最少20G)
獨立Docker,則每次都是經過銷貨/初始容器的方式來實現,換言之,若是是一臺服務器,則需更換IP
組合使用,針對熱更新使用Fabric,針對大規模、大版本、又或者數量大時,使用該方式更便捷