本文描述了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,针对大规模、大版本、又或者数量大时,使用该方式更便捷