基於Docker&Fabric的Web專案部署方案
本文描述了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,針對大規模、大版本、又或者數量大時,使用該方式更便捷
相關文章
- 基於 Docker 映象部署 go 專案DockerGo
- java web專案war包自動升級部署方案JavaWeb
- docker部署Web專案(二)DockerWeb
- Tomcat部署web專案TomcatWeb
- Flask web專案 gunicorn部署FlaskWeb
- 微前端專案部署方案前端
- 基於 deployer 的 Web 端自動部署Web
- 基於gin框架封裝的web專案骨架goskeleton框架封裝WebGo
- 基於go語言gin框架的web專案骨架Go框架Web
- Tomcat部署web專案流程TomcatWeb
- go web 專案開發部署GoWeb
- web前端基於vue的大型專案分模組開發Web前端Vue
- 10個基於Web的開源專案管理系統Web專案管理
- 八個免費基於Web的專案管理系統Web專案管理
- uoj專案部署的學習實踐和基於JUnit進行的專案測試
- 在docker容器中部署Web專案DockerWeb
- 基於RSA的WEB前端密碼加密方案Web前端密碼加密
- 基於web網站專案的效能測試結果分析Web網站
- 基於struts專案許可權解決方案的探索 (轉)
- Golang基於Gitlab CI/CD部署方案GolangGitlab
- 基於Jenkins自動化部署spring boot專案JenkinsSpring Boot
- 只需三分鐘——基於 Serverless 快速部署 Laravel 專案ServerLaravel
- 基於Spring的Web專案執行時切換資料來源的一種解決方案SpringWeb
- web專案部署,一篇就搞定!Web
- Python在Windows系統下基於Scrapyd部署爬蟲專案(本地部署)PythonWindows爬蟲
- Java Web系列:Java Web 專案基礎JavaWeb
- web專案中圖示的前端處理方案Web前端
- 基於開源的 ChatGPT Web UI 專案,快速構建屬於自己的 ChatGPT 站點ChatGPTWebUI
- 專案完成 - 基於Django3.x版本 - 開發部署小結Django
- 區域網內基於WEB的檔案傳輸解決方案詳解 (轉)Web
- 基於.NetCore開發部落格專案 StarBlog - (5) 開始搭建Web專案NetCoreWeb
- 關於idea部署本地專案的問題Idea
- Jenkins部署Web專案到遠端tomcatJenkinsWebTomcat
- 前端專案基於GitLab-CI的持續整合/持續部署(CI/CD)前端Gitlab
- 基於React-Native0.55.4的語音識別專案全棧方案React全棧
- java專案部署異常解析及處理方案Java
- Nuxt專案的部署UX
- 如何基於專案人力和管線方案選擇FGUI和UGUIUGUI