基于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,针对大规模、大版本、又或者数量大时,使用该方式更便捷
时间: 2024-10-27 00:14:57

基于Docker & Fabric的Web项目部署方案的相关文章

java web项目部署之后,运行几天会不正常,登录页面可以打开,但是进行任何数据库操作都会特别卡

问题描述 java web项目部署之后,运行几天会不正常,登录页面可以打开,但是进行任何数据库操作都会特别卡 java web项目部署之后,运行几天会不正常,登录页面可以打开,但是进行任何数据库操作都会特别卡,比如登录. 查了tomcat日志,宕机前只有一个MySQLSyntaxErrorException错误 大神分析一下 还有没有需要提供的东西?? 用的是java,tomcat7,springmvc,spring3.0,hibernate,mysql 解决方案 数据库连接使用完成后有没有关闭

java web项目部署到Linux后访问WEB-INF/classes文件下一个文件的问题

问题描述 java web项目部署到Linux后访问WEB-INF/classes文件下一个文件的问题 java web项目部署到Linux服务器上,其中有一个模板下载的请求连接,模板文件就是放在src下面编译后放在classes文件夹下.现在问题是访问这个下载链接时,项目日志报异常了No such file or directory.是不是我这个java应用没有访问这个文件的权限呢?怎么才能让它能访问呢? 解决方案 No such file or directory 有记录具体的路径信息吗?文

tomcat-windows下的web项目部署到linux下,报错了

问题描述 windows下的web项目部署到linux下,报错了 报500的错,谁知道是怎么回事啊 java.lang.reflect.InvocationTargetException sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.Delega

服务器-为什么要把web项目部署在linux上,如果要完成它,需要学哪些知识

问题描述 为什么要把web项目部署在linux上,如果要完成它,需要学哪些知识 本人小白,只知道在windows上用tomcat部署项目,也只知道用端口号去访问,怎么样才能让所有人都可以访问自己做的网站,经常听说把项目部署到linux服务器,但一直不明白,求指点! 解决方案 让所与人都可以访问,前提是你要有,在公网的服务器和公网的IP.这样你的服务器才算是对大众可见.当然现在只能使用IP的方式访问.如果要是使用XXXX.com的形式,那么你就要有域名了..这个就要设计域名申请,要是服务器在国内的

web项目部署.jsp 找不到id

问题描述 web项目部署.jsp 找不到id ${news.id} ${news.title} ${news.timelength} /c:forEach 错误提示: javax.el.PropertyNotFoundException: Property 'id' not found on type java.lang.String javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:266) javax.el.Bean

web项目部署到websphere上出错,部署到tomcat上没问题

问题描述 web项目部署到websphere上出错,部署到tomcat上没问题 为了简单化问题,特意写了有一个servlet,页面就一句hello的测试小项目, websphere安装完之后也无法访问,直接访问项目名的话是这个样子 访问具体页面的话提示这样 我的版本是was7,百度上查找了几天也没个有效的办法,求大师指点一下是哪里出了问题,感激不尽 解决方案 已解决 我的编译器jdk版本高于服务器的版本 所以出错 重新用低版本jdk编译之后问题解决了 希望遇到相同问题的可以排除这方面的原因 解决

web项目部署在tomcat6.0中,一运行就报这样的错,各路大神,帮帮小生

问题描述 web项目部署在tomcat6.0中,一运行就报这样的错,各路大神,帮帮小生 20150703 16:42:55 INFO org.springframework.web.struts.ContextLoaderPlugIn.init(ContextLoaderPlugIn.java:218) ContextLoaderPlugIn for Struts ActionServlet 'action_tmp, module '': initialization started 七月 03

javaweb-我的java web项目部署到linux下遇到的mysql问题

问题描述 我的java web项目部署到linux下遇到的mysql问题 //查询当前店铺 -自定义类别 public List findShopCovertype(String shopCode){ String sql = "SELECT A.shop_code,A.cover_type_code,A.cover_type_name FROM shop_cover_type A WHERE A.shop_code = ?"; final List list = new ArrayL

如何将Java Web项目部署到服务器上

转自:(此处更详细)http://blog.csdn.net/gulu_gulu_jp/article/details/50994003   二.项目部署 我们对于 Java Web 项目在本地机器(无论是 Windows 还是 Linux)上的部署已经了然于心了,那么对于在云服务器上部署 Java Web 项目又是如何操作的呢? 其实很简单,还是离不开 Web 项目部署的那三点:① 基础的 JDK 环境② 一个 Web 服务器.如 Tomcat.JBoss③ 一款数据库.如:mysql 对于云