传统 Java 网站如何实现容器化?看看 Cars.com 如何玩转 Docker!
背景
Cars.com 是美国的汽车门户网站,为用户提供各种购车相关的信息和资讯,类似于国内的汽车之家。
他们之前的技术栈是比较传统的 Java Web 结构:Java 7, Websphere/Weblogic, Oracle Linux, IBM 硬件,Oracle 数据库 。开发语言包含 Java,NodeJs,Go。随着网站宣传的投入,Cars.com 的流量也变大了。
· 3000万访问者 / 月
· 470万车辆信息
· 每天处理200万张图片请求
· 每天服务端处理1亿次请求
问题来了,流量变大之后,传统的架构显得力不从心。同时,软件交付流程也成为了瓶颈,来看看他们的痛点。
痛点
· 两套操作系统和中间件
操作系统和中间件的选型不同,各自分别包含Websphere, Weblogic, Oracle Linux, Redhat Linux, AIX等等。
· 每套运行环境需要5份
包含开发者环境,功能测试环境,集成测试环境,性能测试环境,生产环境。
· 10个 Web 应用,100多个服务需要部署。
由于环境的差异性,上线流程的复杂性,导致 Cars.com 的团队经常碰到的问题是:为什么代码在这个环境能运行,在另外一个环境不行?久而久之为团队带来大量重复的定位环境问题的工作,严重影响了开发进度。
Cars.com 总结了他们的诉求 – 实现不可变基础设施
· 统一上线流程。
· 具备实时扩展的能力,应对高峰期流量。
· 当服务出现问题,能够自动回滚,自动恢复。
使用 Docker 实现不可变基础设施
为什么选择 Docker?
· 提供一致性,可预期的环境。
使用 Docker 可以屏蔽环境的差异,解决维护5份环境的痛点。
· 实现微服务部署。
Cars.com 底层有100多个服务,服务如果不能单独部署,会有造成构建时间长,上线周期长,排除问题困难等问题。 实现微服务的独立部署,可以加速软件上线速度,降低问题排除难度。
· 秒级故障恢复。
Docker 作为服务的载体,具备快速销毁,快速上线,快速回滚的能力。一旦线上服务出问题,可以快速回滚到上一个版本。
· 实现蓝绿部署,金丝雀发布。
快速发布环境,让一部分用户体验某些新功能,待功能被快速验证得到积极的反馈之后,再进行大面积部署。
构建一个通用 Docker 镜像
为什么需要构建通用的 Docker 镜像?
· 公司内部有很多镜像,当有新的环境需要搭建时,要把镜像从仓库一个一个都拷贝到开发者的机器。
· 多语言开发团队,包括 JavaScript,Java,Go 等等,每种语言打包的镜像体积过大,导致镜像构建,下载速度慢,影响开发效率。
经过一系列实践,Cars.com 总结出来了通用镜像的方案:
· 采用 Alpine Linux 作为基础镜像
Alpine Linux 系统的文件大小非常小,可以达到5MB。
· 轻量级的容器
- 删除 Package Manager 里面的所有Source。
- 在软件安装完之后,删除安装包,删除没有用到的依赖,删除临时文件。
- 剪裁官方镜像。剪裁 Node 镜像,Node 官方镜像最新版达到了649MB,他们将这个镜像缩减到55MB。JDK 缩减到122MB,Tomcat 从357MB 缩减到181MB。
在裁剪镜像大小的实践中,Artifactory 中的 Docker info 提供了帮助,可以在 Docker info 中看到每次打包的镜像 Layer 的实际大小,通过裁剪每层 Layer 的大小,最终达到缩小镜像的目的。
仓库的需求
每个团队都有管理包的需求,开发者要管理 Jar,War,静态文件,系统 Admin 要管理不同的 Linux 发行版,每种语言都用不同的包管理系统,维护这5,6种二进制包仓库非常麻烦,他们使用了 Artifactory 作为一站式包管理平台。理由:
· 本地搭建的仓库
大大提升所有语言构建,打包的速度。
· 支持 NPM modules,Docker 注册中心,Maven,Go。
· 支持 Linux 的包管理工具(RPM,Debian)。
· 和 Jenkins/Bamboo/MSBuild/TFS 等工具集成,收集构建信息。
· 元数据支持,并且提供 Rest API。
Cars.com 通过为 Docker 镜像,War 包设置元数据,使得任何包都可以通过 Artifactory Query Language 根据元数据,过滤出符合上线条件的包,打包到镜像里,部署到环境上。
封装 Docker API – PowerTrain
为什么要封装Docker API?
· 需要即时响应快速上线,回滚,支持滚动升级,动态绑定端口。
· 保证开发者环境里能跑的应用,在生产环境里也能跑,实现不可变基础设施。
· 声明式配置管理。
PowerTrain 的配置文件 powertrain.mk 解决的问题是将不同环境中变化的部分,作为变量,存在文件里,当需要生成某个环境时,只需将需要的变量传递给 PowerTrain,即可获取对应环境所需的依赖,实现按需搭建环境。
PowerTrain 也封装了一些 Docker 的常用操作,例如 Docker build,pull,push 等等,在这基础之上增加的一些定制化的信息,来适应灵活的镜像构建和部署。利用 Docker 的轻量级部署特性,实现快速搭建环境,快速上线服务。PowerTrain 的具体的实现可以在 Carsdotcom 的 Github 上找到源代码。
持续集成流水线
· 开发提交代码到 Bitbucket。
· Commit 触发 Jenkins 的 Webhook, 执行构建。
· Jenkins 执行 PowerTrain build。
· 从 Artifactory 找到对应的 War 文件,基础镜像,构建出新的镜像。
· 快速搭建测试环境,使用 Docker 作为载体运行 war 包,进行测试(功能,接口,性能) 。
持续交付流水线
· 镜像通过测试,会升级到 Artifactory 的生产仓库。
· 通过 Jenkins 触发 PowerTrain 命令,部署到生产环境。
要部署到不同的环境,只需要执行不同的 powertrain.mk 文件,就能拉取不同的依赖,部署到不同的环境。
总结
Cars.com 通过一系列的实践,完成了从传统 Java Web 应用到容器化的转型。得到的收获:
· 使用 Docker 屏蔽之前5份环境的差异,实现一次构建,处处运行,大大减少运维中的重复性工作。使用 PowerTrain 的配置文件,让上线流程脚本化,实现不可变基础设施。
· 使用 Artifactory 作为多语言的本地仓库,大大提高获取第三方依赖,和管理自研件的效率。
· 剪裁 Docker 镜像,实现轻量级镜像发布,在突发流量到来时能够实现动态扩容,以及快速故障恢复。
作者;王青
目前任职 JFrog 中国首席架构师,之前在 IBM,HPE,爱奇艺,新浪,VIPKID 等公司做过研发和架构,是有十多年开发经验的互联网老兵,专注于软件生命周期管理,微服务架构,云原生应用,容器化等领域。
欢迎转载,但转载请注明作者与出处。谢谢!
传统 Java 网站如何实现容器化?看看 Cars.com 如何玩转 Docker!相关推荐
- 一张图搞懂容器所有操作 - 每天5分钟玩转 Docker 容器技术(26)
前面我们已经讨论了容器的各种操作,对容器的生命周期有了大致的理解,下面这张状态机很好地总结了容器各种状态之间是如何转换的. 如果掌握了前面的知识,要看懂这张图应该不难.不过有两点还是需要补充一下: 可 ...
- 两种进入容器的方法 - 每天5分钟玩转 Docker 容器技术(23)
我们经常需要进到容器里去做一些工作,比如查看日志.调试.启动其他进程等.有两种方法进入容器:attach 和 exec. docker attach 通过 docker attach 可以 attac ...
- 如何自定义容器网络?- 每天5分钟玩转 Docker 容器技术(33)
除了 none, host, bridge 这三个自动创建的网络,用户也可以根据业务需要创建 user-defined 网络. Docker 提供三种 user-defined 网络驱动:bridge ...
- Docker学习总结(36)——利用Google开源Java容器化工具Jib构建镜像
一.前言 容器的出现让Java开发人员比以往任何时候都更接近"编写一次,到处运行"的工作流程,但要对Java应用程序进行容器化并非易事:你必须编写Dockerfile,以root身 ...
- 对传统应用进行容器化改造
https://mp.weixin.qq.com/s/0yWIuIwarLiml4MD0pDxMg 本文接下来简要介绍什么是容器化,要在 Docker 容器中运行传统应用的缘由,容器化的过程,其间可能 ...
- Java开源开发平台O2OA V7.0发布,支持Docker容器化部署和三员管理模式
O2OA开发平台开源至今,已经有很多开发者参与我们每个版本的迭代和更新,有的开发者已经利用O2OA在公司内部搭建公司的开发平台,有的开发者在商业项目中使用O2OA平台作为信息化系统建设的基础能力平台. ...
- docker4dotnet #2 容器化主机
.NET 猿自从认识了小鲸鱼,感觉功力大增.上篇 <docker4dotnet #1 前世今生 & 世界你好>中给大家介绍了如何在Windows上面配置Docker for Win ...
- Docker最全教程之MySQL容器化 (二十四)
Docker最全教程之MySQL容器化 (二十四) 原文:Docker最全教程之MySQL容器化 (二十四) 前言 MySQL是目前最流行的开源的关系型数据库,MySQL的容器化之前有朋友投稿并且写过 ...
- AI独角兽商汤科技的内部服务容器化历程
本文由阿尔曼,商汤科技运维工程师于4月26日晚在Rancher微信群所做的技术分享整理而成.商汤科技是专注于计算机视觉领域的AI公司.本次分享结合了容器平台团队帮助公司业务/内部服务容器化历程,介绍商 ...
最新文章
- python使用matplotlib可视化线图(line plot)、并自定义设置可视化图像中没有网格线(remove grid line in matplotlib plot result)
- 特种部队【动态规划】
- Oracle中分区表中表空间属性
- 【笛卡尔树】【树状数组】Beautiful Pair(P4755)
- react之虚拟DOM的两种创建方式
- Android使用adb命令查看CPU信息
- net 中viewstate的原理和使用
- find和chmod结合来修改权限
- 数论 欧几里德算法
- nodejs下载集成到idea
- bum报文_数据中心VxLAN技术概念和原理解读
- html将网页保存成图片,谷歌浏览器保存网页为图片方法_chrome如何将网页保存为图片-win7之家...
- 阿里云网站域名备案流程全过程(图文讲解)
- 在线图片尺寸修改 生成图标
- 头条白板面试_我收到的最佳白板面试建议
- C语言情人节玫瑰花代码
- 7-7 韩信点兵 (10 分)
- 线上展厅3d化宣传效果怎样 广州商迪
- web前端-前端三剑客之CSS(1)
- word里显示的这个向下箭头是什么意思
热门文章
- java.lang.ClassNotFoundException: org.eclipse.jdt.internal.compiler.env.INameEnvironment
- GD32官方资料学习体系(主要包括MCU选型、原理图PCB设计、软件开发入门及用户手册等)
- 【历史上的今天】6 月 26 日:EDSAC 计算机之父诞生;B 站成立;Skype 创始人出生
- 多模态训练如何平衡不同模态
- vue02(脚手架,部署,helloworld)
- word删除页眉线,添加第几页共几页
- 解决linux看温度是报错No sensors found问题
- python实现情感分析
- i3cpu驱动xp_Intel英特尔 Core i3/Core i5/Core i7系列CPU显示驱动 14.46.9.5394版 For XP-64
- 战神引擎mud2没有mysql文件_战神引擎架设不要(MongoDB)芒果数据库配置教程