基於Docker&Fabric的Web專案部署方案

arashivision發表於2016-03-17

本文描述了Web專案的兩種部署方案,石器時代的ssh & pull & restart方式不做太多說明

1.基於Fabric(Python)的部署方案

Fabric 是一個用於ssh的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.

1.1結構

  • Interface

    • flask
    • django
  • Script

    • fabric

      • conf (伺服器配置列表)
      • lib(基礎庫&二次開發)

1.2示例

1.2.1.配置檔案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"
    ]
}

1.2.2.更新操作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)

1.3說明

通過不同伺服器的配置資訊,使用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/"

2.基於Docker的部署方案

Docker是一個將程式以及其依賴打包進一個標準單元的服務或者工具集

Docker allows you to package an application with all of its dependencies into a standardized unit for software development.

2.1基礎

Docker服務的基礎是虛擬機器,整個Docker服務包含了虛擬機器以及操作虛擬機器的一些列命令集合

這裡需要理解Docker的幾個基本概念,便於更好的理解這種部署開發&部署方式與常規方案的區別

  • image(映象)
  • container(容器)
  • server(伺服器)

映象相當於一個Linux發行版,對比於Linux下的Ubuntu、CentOs等,我們可以按照自己的需求去定義這個發行版的內容以及元件,基礎映象是最小化的Linux執行單元,那麼,我們需要做的就是根據程式的需要,安裝各種依賴元件,並將APP+DEP進行打包,變成我們的“定製發行版”,以此來部署在真實Server上。於此同時,映象在初始化的過程中,可以定義一些列操作,比如——安裝依賴、拉取程式碼以及執行程式

容器是一個例項化以後的虛擬機器,容器依賴於映象,在映象的基礎上做例項化,是初始化以後的虛擬機器

伺服器,就是傳統的伺服器如實體伺服器或者雲主機等

Docker對應了一些列的服務端程式,是標準的C/S架構,每一個伺服器執行一個或多個容器,一個或多個容器的集合叫做叢集,對伺服器進行一些列的包裝後變成一個控制檯,不再去關心伺服器的初始化過程,只管理容器本身是目前Docker的優勢所在。具體表現為,按照原有方式,我們需要先開通N臺伺服器,再依次在每一臺機器上安裝虛擬機器;現在需要的是,將所有的伺服器進行封裝,變成一個通道,在盒子外,我們告訴盒子我們需要多少個容器,它返回給我們對應的服務即可。國內的DaoCloud、阿里雲容器服務已經相對完善。(阿里測試中,DaoCloud已經相對成熟)

2.2環境打包

2.2.1 映象示例

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埠

2.2.2 部署簡述

  • 在DC(DaoCloud)控制檯建立一個叢集
  • 在應用中選擇基於映象m建立n個容器
  • 等待初始化完成,可以看到當前叢集中的節點數量(節點即為容器數量)
  • 同一個叢集中的機器可以跑相同或者不同的服務,當需要負載均衡時,動態的加入或者移除節點即可(通過配置,自動伸縮)

2.2.3 節點管理

節點管理通過阿里雲的Agent服務,相當於為每一個節點建立了一個遠端shell,我們通過控制檯即可輕鬆升級&更新程式

  • 批量更新
  • 動態管理
  • 負載均衡

批量更新,通過一些設定建立的數量如20臺 ,建立完畢後,從原有叢集移除所有節點,加入建立的節點,即可完成更新操作,後續刪除或者銷貨舊版本的容器。停機更新即完成。

動態管理,由於數量可以自定義,我們可以在使用者無感知的情況下增加伺服器到50或者減少伺服器到10,在這個過程中,使用者是不會感覺到變化的(注:這裡需要設計資料共享機制 Session/Cookie)

3.兩種方案的使用

這兩種方案並不存在互斥性,可以並從,也可以只選擇一種,如:

  • 獨立Fabric,則以伺服器映象為基礎,備份伺服器本身(缺點是資料量大,伺服器最少20G)
  • 獨立Docker,則每次都是通過銷貨/初始容器的方式來實現,換言之,如果是一臺伺服器,則需更換IP
  • 組合使用,針對熱更新使用Fabric,針對大規模、大版本、又或者數量大時,使用該方式更便捷


相關文章