Docker化运维方式讲解
应用迁移需求
应用运维需要考虑的一个重要问题就是迁移, 在不同机器、机房、环境间迁移。迁移的原因有很多, 比如硬件过保(硬件故障), 机房迁移, 应用扩缩容等。
应用迁移的核心需求是:
简单。迁移操作必须足够简单, 没有学习成本, 点击一下即可。
快速。迁移过程能在极短的时间内完成。
无损。迁移之后应用与原应用一模一样, 不丢失任何配置和数据。迁移之后应用功能和业务逻辑与原部署应用一模一样,无任何业务风险。
许多公司还在使用古老的 rhel 5/6 和 linux 2.6.x 内核, 难以充分发挥现代操作系统和硬件的能力, 部分原因也是受制于应用迁移技术不成熟, 不能保证快速无损迁移应用, 不敢迁移。
具备快速迁移的能力, 同样可将应用快速切换到任意版本, 实现快速回滚。
tomcat webapp 部署结构
我们看一下一个基于 tomcat 部署的 java webapp 应用部署结构如下:
apache-tomcat-8.0.35/ |
其主要分为两个部分:
- 静态二进制文件。包含 bin/, lib/。这部分是三方软件包 tomcat 自带的内容。对应用而言, 这部分内容是只读访问的, 不会修改。
- 外部配置和数据。包含 conf/, logs/, temp/, webapps/, work/。这里的“外部”是指从 tomcat 软件包的角度来看, 对应用来说, 这部分才是真正的应用软件包。
注意: tomcat 软件包也包含 conf/。但应用可能会对 conf/ 进行修改, 所以应用使用了一个独立维护的 conf/ 副本, 而不是 tomcat 软件包自带的 conf/ 内容。
很显然, 要迁移这个应用, 只需要迁移第 2 部分, 即外部配置和数据即可。为了简化迁移, 许多应用被设计为无状态的, 即 logs/, temp/, work/ 等外部数据目录不包含任何影响应用功能的配置或数据, 这部分内容不需要迁移。只需要迁移 conf/, webapps/ 目录, 这部分内容可打包为应用软件包。
这样, 在新环境部署应用, 只需要安装 tomcat 软件包和应用软件包即可。
新环境部署
在新环境上完成应用部署, 有两种玩法:
- 列一个软件包清单 (如上例中的 tomcat 和应用), 在新环境上按照清单完成软件包安装, 这是 juju 的玩法。
- 将所有软件包安装好并打包成一个二进制镜像, 拷贝到新环境上部署运行, 这是 docker 的玩法。Dockerfile 描述如何创建镜像, 类似于软件包清单。
docker 镜像不止是预安装软件包, 还包含基础操作系统环境, 统一的日志、数据路径, 环境变量等标准化应用运行环境。这可难不倒 juju, juju 同样基于一个标准镜像创建 vm 或 lxc 容器, 再安装软件包, 同样提供标准化的运行环境。这两种方式各有优缺点, 在此不作深究。但就使用成本来说, docker 目前在国内外发展火热, 技术和实践经验相对成熟, 更容易使用。
单机多实例隔离部署
使用 docker 应用容器部署应用, docker 容器为应用提供了标准一致且相互独立的运行环境, 这样应用使用相同的配置和路径, 也可以在单个宿主机上实现多实例部署。与 vm 的单机单部署模式相比, 应用容器要做的足够轻, 消除 vm 的额外开销, 并且完美支持微服务编排。
软件包与配置分层
有些软件包很好的实现了软件包默认配置与应用自定义配置的分离, 如 tomcat, 只需指定 CATALINA_BASE 目录与 CATALINA_HOME 目录分开, 将应用部署到 CATALINA_BASE 下, 即可实现应用自定义配置和 tomcat 软件包默认配置分离, 两者独立维护, 互不影响。
许多软件包没有实现这样的能力, docker 通过分层文件系统解决这个问题, 同时可以避免每个软件包都去考虑设计配置分离功能。
应用自定义配置在软件包安装层的上层, 运行容器时覆盖默认配置, 但在软件包安装层升级软件包时看不到应用自定义配置, 不会受应用自定义配置影响。需要注意的是, 软件包升级后是否兼容旧的应用自定义配置, 是否需要更新自定义配置, 需要应用负责人关注和测试。
按照 docker 的分层设计思想, 越基础越固定不变的东西越要放到底层, 越容易变化的东西越要放到上层, 因此应用依赖的软件包和基础配置要放到底层, 可以独立为一个 base 镜像, 应用本身和自定义配置放在上层。如果应用本身或配置更新更频繁, 可将这两者再分成两层。
配置管理
假设我们要修改一个应用配置, 一种方式是登陆一台机器修改, 测试 ok 后将修改同步到所有其他机器。这种方式很原始并且缺乏监管, 容易出错。比如新扩容了 100 台机器每台都要更新一遍, 如果操作有遗漏, 哪些机器配置已经更新, 哪些机器还是旧的配置也缺乏监管。
按 docker 的玩法, 应该是先更新镜像, 测试 ok 后分发镜像到所有机器更新容器。docker 监管了所有容器部署的镜像版本和容器状态, 从而可以很方便的检查哪些容器更新了, 哪些没有更新。对于很少变化的静态配置, 应该固化到镜像中。
对于一些经常变化的配置, 重新打镜像和更新容器成本太高, 应该设计成预定义的开关, 使用开关平台进行监控和管理, 或者使用 diamond 等配置管理平台管理。
docker 容器数据卷
docker 容器内的文件系统伴随容器而生, 销毁或更新容器时 (如升级镜像或修改容器配置), 原有数据将会丢失。并且受分层文件系统设计影响, 其性能可能更差(与存储引擎实现有关)。
因此, 需要持久化保存的配置和数据, 或有高写性能要求的, 如 logs/, data/ 等外部数据目录, 应使用 docker 数据卷 挂载到宿主机上。
Dockerfile 中使用 VOLUME 指定容器中需要挂载为数据卷的目录列表。
docker 化运维方案
综上所述, docker 化运维需要将应用拆分为 3 部分:
- 基础环境, 应用所有依赖, 应用软件包和静态配置, 固化到镜像。
- 需要动态修改的配置, 通过开关平台或 diamond 等配置平台进行管理。
- 需要持久化保存或频繁写需求的配置或数据目录, 挂载为数据卷。
部署运维时, 使用 docker 分发镜像, 配置平台推送配置, 即可实现应用快速部署、迁移、更新、回滚、扩缩容等运维操作。
Docker化运维方式讲解的更多相关文章
- 持续化运维 DevOps
DevOps(Development和Operations的组合词)是一组过程.方法与系统的统称,用于促进开发(应用程序/软件工程).技术运营和质量保障(QA)部门之间的沟通.协作与整 ...
- 不看好运维竖井产品模式,优云打造融合化运维PaaS平台
2018年1月13号中国双态运维用户大会上,优云软件总裁刘东海接受了36Kr记者的专访,期间谈到了新时代下的企业运维模式,新兴技术和传统运维的融合以及优云未来的发展方向等问题.以下为访谈实录: 优云软 ...
- saltstack---自动化运维平台
https://github.com/ixrjog/adminset[自动化运维平台:CMDB.CD.DevOps.资产管理.任务编排.持续交付.系统监控.运维管理.配置管理 ] https://ww ...
- storm进程正常运行一段时间shut down,运维方式
storm启动一段时间后,无征兆的停止了,然后nimbus,supervisor,ui所有的worker都stop了. 我用的storm是0.8.2版本的 nimbus中留下的log如下 -- :: ...
- linux运维配置讲解--sshd-config
文件配置: 1, /etc/ssh/sshd_config ssh配置文件 2, /etc/shadow 密码文件 3, /etc/sudoers 授权用户管理文件 4, /etc/issue 系统信 ...
- 老司机实战Windows Server Docker:4 单节点Windows Docker服务器简单运维(下)
上篇中,我们主要介绍了使用docker-compose对Windows Docker单服务器进行远程管理,编译和部署镜像,并且设置容器的自动启动.但是,还有一些重要的问题没有解决,这些问题不解决,就完 ...
- 新IT运维时代 | Docker运维之最佳实践-上篇
容器技术的发展可以分为两个阶段,第一个阶段聚焦在IaaS层,仅仅把容器当做更轻量级虚拟机来使用,解决了应用运行时进程级资源隔离的问题:随着Docker的出现,容器虚拟化才有了统一的平台,由此容器技术发 ...
- 新IT运维时代 | Docker运维之最佳实践-下篇
上篇针对操作系统.主机配置.容器镜像.容器运行时四大方面分享一些Docker的运维经验,本篇将着重在Docker Daemon参数和权限两个方面进一步分享.(阅读上篇请点击右侧:新IT运维时代 | D ...
- Docker学习总结(14)——从代码到上线, 云端Docker化持续交付实践
2016云栖大会·北京峰会于8月9号在国家会议中心拉开帷幕,在云栖社区开发者技术专场中,来自阿里云技术专家罗晶(瑶靖)为在场的听众带来<从代码到上线,云端Docker化持续交付实践>精彩分 ...
随机推荐
- Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析
这是关于RecyclerView的第二篇,说的是如何自定义Item动画,但是请注意,本文不包含动画的具体实现方法,只是告诉大家如何去自定义动画,如何去参考源代码. 我们知道,RecyclerView默 ...
- jquery中on/delegate的原理
jquery中on/delegate的原理 早期版本中叫delegate, 后来有过live函数,再后来统一用on.下面的方法等效: // jQuery 1.3 $(selector).(events ...
- 【转】WPF 给DataGridTextColumn统一加上ToolTip
源地址:http://dongguojun.iteye.com/blog/1671963 我发现WPF中DataGridTextColumn直接设置它的ToolTipService.Tooltip并不 ...
- 从零学java--传智播客
java的输入需要引用Scanner包 import java.util.Scanner; class ScannerDemo{ public static void main(String[] ar ...
- Segmentation fault (core dumped)
问题: 在Linux中实现快速排序时,没有加入终止条件,结果出现Segmentation fault (core dumped)这个问题,Segmentation fault (core dumped ...
- Windows系统盘占用空间分析
磁盘分析 本机的系统盘是C盘,操作系统是Windows 7 专业版,通过磁盘属性可以看到C盘的已用空间是69.4G. 而我们运行自己编写的脚本(脚本程序参考附录,统计原理:计算目录下各个文件的大小,然 ...
- 清除页面广告?身为前端,自己做一款简易的chrome扩展吧
大家肯定有这样的经历,浏览网页的时候,左右两端广告,诸如“屠龙宝刀,点击就送”,以及最近火的不行的林子聪37传奇霸业什么“霸业面具,霸业吊坠”的魔性广告总是充斥我们的眼球. 当然有现成的扩展程序或者插 ...
- UWP开发之Mvvmlight实践三:简单MVVM实例开发(图文详解付代码)
在做MVVM各种框架对比之前,我觉得有必要先自己做一个简单的MVVM实现案例比较好,这样就可以看到自己实现的时候有那些不方便的地方.而各种框架又是怎么解决我们这些麻烦的. 案例介绍:用户登录画面,没有 ...
- 关于MVC EF架构及Repository模式的一点心得
一直都想写博客,可惜真的太懒了或者对自己的描述水平不太自信,所以...一直都是不想写的状态,关于领域驱动的东西看了不少,但是由于自己水平太差加上工作中实在用不到,所以一直处于搁置状态,最近心血来潮突然 ...
- Difference Between HashMap and IdentityHashMap--转
原文地址:https://dzone.com/articles/difference-between-hashmap-and Most of the time I use HashMap whenev ...