基於Docker & Fabric的Web項目部署方案

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

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

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

1.1結構

  • Interfacegithub

    • flaskweb

    • djangoshell

    • ...npm

  • Scriptdjango

    • fabricflask

      • conf (服務器配置列表)api

      • 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,針對大規模、大版本、又或者數量大時,使用該方式更便捷

相關文章
相關標籤/搜索