Docker---大型项目容器化改造
虚拟化和容器化是项目云化不可避免的两个问题。虚拟化由于是纯平台操作,一个运行于linux操作系统的项目几乎不需要做任何改造就可以支持虚拟化。而项目如果要支持容器化则需要做许多细致的改造工作。容器化相对于虚拟化的优势也相当明显,运行于裸机性能高,秒级启停容器,更不用说开发、测试、布署一致的环境(DevOps理念),以及上篇提到的微服务的能力。大家还可以找到各种文章来介绍容器化(Docker)的知识,这里我们就不一一赘述。下面我们会根据项目的实际情况,介绍下容器化改造会面临的问题和解决方案。


一个几十万行c++代码、大几十个应用程序的大型项目进行容器化。如何对原来的代码改造最小,甚至代码都不需要修改。如何静悄悄的,甚至不让业务程序员发觉。如何将业务镜像的体积做到最小。如何快速地制作一个业务镜像。这些一直是困扰我们多时的问题。容器分类的时候,如果需要对代码组织方式和架构进行调整,对于几十万行的项目将会是一个灾难。容化改造完后,如果开发模式变化太剧烈,无可避免会面临几十个、上百个业务程序员重新学习适应的过程,成本惊人。业务镜像的大小直接影响对现场更新容器方便与否的问题,特别是当项目在海外,网络速度不是很快的情况下。自动化、快速的镜像制作是能否进行敏捷开发的关键。
一、如何开始
如何将一个运行于linux的项目挪到容器里面去运行通常是遇到的第一个问题。网上找一个带gcc编译器和linux操作系统的基础镜像,基于这个镜像可以先制作一个编译和CI检查(代码检查、运行单元测试等等)的构建镜像。利用构建镜像进行编译和CI检查,然后基于基础镜像制作运行镜像,将编译好的库和可执行程序拷贝进去(通过Dockerfile)。这样一个最简单镜像就制作好了。

上面方法做出来的业务镜像可以运行,但有两个问题,制作的时间特别长(我们项目需要一个小时)、镜像的业务层特别大(我们项目有1个G)。两个问题不是特别严重,但如果项目拿去商用就是一个很麻烦的问题。
二、容器分层
容器分层的概念是Docker的核心概念,就是支持每个容器可以“继承”自另外一个容器。这里的继承跟面向对象里的继承应该是同一个概念。这样除了可以带来“继承”特性的好处,底层镜像变动时,不需要去更新上层的镜像,这样就可以少更新很多东西。的确很妙,面向对象的继承我都没觉得有这么好用!受这个特性影响,我们将项目用到的第三方库单独提出来做成一层。制作的流程也相应地变成下图所示。


虽然过程多了一步,但效果也是立竿见影的,业务层的制作时间从原来1个小时缩短为12分钟,大小也变为100M左右。
三、业务容器分类
在Docker最佳实践的建议里面,建议一个容器最好只跑一种程序,或者一类程序。像原来那样,一个容器跑几十个进程一定是不合适的。分类清晰的容器也便于管理和进行各种操作。同时,在微服务的最佳实践里面,建议将项目的代码分割成一个个的微服务。每个微服务的代码由不同的团队维护,各自独立。我们先暂时不讨论这种方式的优缺点。原先的项目是一个几十万行、几十个程序的大项目,有几十个人开发人员,有无数的公共模块,每个模块间相互引用也很普遍,每个程序由数量不等的模块来组成。如果按上面的建议来进行Docker的业务分类,无疑会给项目带来巨变,并且涉及组织架构的大调整,几乎是一个不可能的任务。那么如何做既可以对容器进行分类,又保持原有的开发模式不变。有时候察觉不到改变才是推进一项新技术的最佳方式。
方法其实也很简单,容器里面有一个叫docker-entrypoint.sh的角本,管理容器启动后要启动哪些进程。上面我们已经制作了一个项目统一的镜像,在分类的时候,我们只要根据不同类型容器,修改不同的docker-entrypoint.sh来启动不同类型的进程就可以了。要配合设置不同的环境变量,不同的配置文件等等。当然,这一切都很容易!
来源:https://blog.csdn.net/qq_35366269/article/details/86528739
Docker---大型项目容器化改造的更多相关文章
- Azure Devops实践(5)- 构建springboot项目打包docker镜像及容器化部署
使用Azure Devops构建java springboot项目,创建镜像并容器化部署 1.创建一个springboot项目,我用现有的项目 目录结构如下,使用provider项目 在根目录下添加D ...
- springboot项目容器化
创建一个简单的springboot项目,依赖中加入: 编写一个Restfull接口: 编写启动类: 启动项目,浏览器访问该接口,得到想要的结果.下面,就将这个项目进行Docker容器化(applica ...
- BI系统打包Docker镜像及容器化部署的具体实现
在过去的几年中,"云"作为明星热词站在了各种新潮技术之中,你可能使用过,但说不清它的原理:或者是没用过,但听过它的大名:也可能连它的名字都没听过,但你对这只蓝色鲸鱼一定十分眼熟.作 ...
- 研发环境容器化实施过程(docker + docker-compose + jenkins)
目录 背景介绍 改造思路 容器构建 基础准备 中间件容器 外部依赖容器 业务应用容器 容器整合 自动构建容器 Maven相关 非Maven项目 总结 背景介绍 目前公司内部系统(代号GMS)研发团队, ...
- 【转帖】使用容器化和 Docker 实现 DevOps 的基础知识
使用容器化和 Docker 实现 DevOps 的基础知识 https://www.kubernetes.org.cn/6730.html 2020-02-24 15:20 灵雀云 分类:容器 阅读( ...
- 容器化之路Docker网络核心知识小结,理清楚了吗?
Docker网络是容器化中最难理解的一点也是整个容器化中最容易出问题又难以排查的地方,加上使用Kubernets后大部分人即使是专业运维如果没有扎实的网络知识也很难定位容器网络问题,因此这里就容器网络 ...
- 云原生之旅 - 2)Docker 容器化你的应用
前言 上文中我们用Golang写了一个HTTP server,本篇文章我们讲述如何容器化这个应用,为后续部署到kubernetes 做准备. 关键词:Docker, Containerization, ...
- 国内最具影响力科技创投媒体36Kr的容器化之路
本文由1月19日晚36Kr运维开发工程师田翰明在Rancher技术交流群的技术分享整理而成.微信搜索rancher2,添加Rancher小助手为好友,加入技术群,实时参加下一次分享~ 田翰明,36Kr ...
- .NET Core+MySql+Nginx 容器化部署
.NET Core容器化@Docker .NET Core容器化之多容器应用部署@Docker-Compose .NET Core+MySql+Nginx 容器化部署 GitHub-Demo:Dock ...
随机推荐
- iOS UILable 高度自适
#import "ViewController.h" #define FontSize 20 @interface ViewController () @end @implemen ...
- Android 代码规范 code style
/* * 文件名(可选),如 CodingRuler.java * * 版本信息(可选),如:@version 1.0.0 * * 版权申明(开源代码一般都需要添加),如:Copyright (C) ...
- 堪称神器的Windows软件推荐
更多软件使用技巧.破解软件以及硬件选购知识,欢迎加入我的QQ群(701974765)与我们交流!! 先贴上软件列表,详细描述后期更新,可自行百度 TrafficMonitor CPU.内存.网速资源监 ...
- 160407、java实现多线程同步
多线程就不说了,很好理解,同步就要说一下了.同步,指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系.所以同步的关键是多个线程对象竞争同一个共享资源. 同步分为外同步和内同步.外同步就是在外 ...
- Maven聚合、Maven仓库jar包以及Spring+MyBatis+JUnit+Maven整合测试的搭建过程
一.Maven将父项目创建到父项目的内部 在父项目的pom.xml上 点右键,选择maven-->new-->maven module project 二.Maven聚合 在某个项目的p ...
- django post 403解决之道(最新版Django)
写了一个方法,丢出一个post请求,发现报403 百度解决方案: 按提示及google结果修改setting.py,在MIDDLEWARE_CLASSES增加django.middleware.csr ...
- Python IDE软件PyCharm通用激活方法
1,打开软件点击help-Register 2,输入地址http://xidea.online激活
- hdu2254 奥运 矩阵的应用
hdu2254 奥运 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2254 题意:题目让我们求得是的可以得到的金牌数量,而和金牌数量=在t1到t2天( ...
- 并发编程 - io模型 - 总结
1.提交任务得方式: 同步:提交完任务,等结果,执行下一个任务 异步:提交完,接着执行,异步 + 回调 异步不等结果,提交完任务,任务执行完后,会自动触发回调函数2.同步不等于阻塞: 阻塞:遇到io, ...
- 剑指Offer——两个链表的第一个公共结点
题目描述: 输入两个链表,找出它们的第一个公共结点. 分析: 设置两个指针,分别从两个链表的头部开始往后遍历. 谁遍历完自己本身的,就从另一个链表开始遍历,这样大家到达第一个公共结点的时候便会相遇. ...