前言
2017年是容器领域交战非常激烈的一年,容器编排领域逐渐形成一超多强的局面,各种容器解决方案变得越来越成熟,传统的中间件(监控、日志、报警)对容器化场景支持逐渐完善。到了今年,如果一家公司还没有开始对Docker进行关注,真的不好意思说是在互联网的圈子里了。
越来越多的企业开始在生产环境中使用容器技术进行架构,在各种互联网大会上,也有越来越多的嘉宾开始分享他们在使用容器上的心得。但是选择容器技术进行整体的技术架构转型实际上需要极大勇气的,在几年前,容器的解决方案还不完善,第一批吃螃蟹的企业和开发者都头破血流的搭建容器的集群、修改可选项不多的开源工具、适应着整个流程的变更。今天,容器架构的技术债务已经基本还清,k8s、swarm、prometheus、grafana等等一系列容器相关的开源工具都被越来越多的企业与开发者证明他们的稳定,选择容器化已经没有那么痛苦。但是,我们发现依旧有很多大型的企业在进行容器化转型前有所犹豫,那么大家的犹豫的点在什么。
Derrick助力企业容器化转型
很多大型企业对容器的认知是清晰的,容器能够带来的好处是显而易见的,但是同样也会带来一些成本。如果投入和产出的边际效益并不可观,那么会让很多企业没有动力使用容器。总结起来这些根本的因素并不是架构的变更带来的技术成本,而是使用容器后对于现有流程的冲击,而这个冲击并不是指技术的投入,真正的冲击是对人的冲击,是使用容器后对于人的学习成本与习惯成本的冲击。如果使用容器需要让所有的开发者都成为Docker的专家,这样的成本我想大部分的公司都无法接受。容器技术或者容器平台缺乏一个桥梁,可以无缝将提供的服务与开发者的本地代码连接起来,这个才是对于容器化而言的最大痛点。
于是基于这一点,在今年的杭州云栖大会上,阿里云容器团队开源了阿里云容器迁移工具Derrick。Derrick的idea在早在去年3月就开始酝酿,当时mesos、k8s、swarm还在群雄割据,使用容器的开发者的关注点还在到底该选用哪个编排工具以及相应的上下游的解决方案支持。很多时候当一个大型企业下定决心选择了容器编排工具以及上下游方案后发现团队中大部分开发人员连完整的Dockerfile都没有办法完整写出来,更别提如何进行容器化架构改造带来的其他技术成本了。为了解决这个问题,我们为客户编写了大量的Dockerfile,包括Java、Python、C++、NodeJs等常见语言、常见框架的都做了支持。在支持客户的过程中发现大部分的Dockerfile的编写工作是由运维人员或者开发Team中的极少数人编写的,大部分的开发者倾向于对Docker是无感知的,而是通过Jenkins或者自动化流程来进行自动部署。从中我们可以发现三件事情:1.一个公司应用编程框架是可复制的,一个Dockerfile可以在多个团队间共享。2.使用容器的公司或者团队一定会有少数几个人员会成为Docker的专家。3.直接在测试环境容器化验证会导致持续集成的流程变得更长,更难排查问题。
为了解决这个问题我们萌发了构建一个自动化工具的想法,通过自动化工具将一些预定好的Dockerfile挖坑,通过探测或者开发者填写信息,然后转变为Dockerfile。最开始的思路比较简单,只需要一个类似yeoman的工具,可以将不同的语言或者框架定义成模板,然后开发者自己填写参数进而进行预定的Dockerfile以及相关文件的渲染,再通过封装Docker命令屏蔽开发者本地验证的学习成本。按照这个想法做出了雏形之后,我们发现真实的情况是有所出入的,一个从零开始的项目会能够快速的进行容器化流程开发,但是对于大部分企业而言如何迁移一个应用是更常见的场景。因此,就按照这个想法借鉴Buildpack的思维,构建了现在的Derrick,目前支持NodeJs与Java两种语言,通过代码的探测、分析可以在几秒钟内完成一个应用高质量的容器化过程。
Derrick一键实现容器化
Derrick是一个Python语言的本地工具,目前支持NodeJs、Python、Java,开发者可以通过pip在本地进行安装
# 不常使用Python的开发者建议先执行 sudo pip install --ignore-installed six 升级six包
sudo pip install python-derrick
下面我们通过一个简单的NodeJs进行举例
# 下载NodeJs demo项目
git clone git@github.com:ringtail/derrick-nodejs-demo.git
# 进入项目目录
cd derrick-nodejs-demo
# 运行Derrick 输入想要构建的镜像与版本例如: nodejs-demo:0.1
derrick init
# 本地验证容器化结果
derrick up
首次执行derrick init
的结果如下
8888888b. d8b 888
888 "Y88b Y8P 888
888 888 888
888 888 .d88b. 888d888888d888888 .d8888b888 888
888 888d8P Y8b888P" 888P" 888d88P" 888 .88P
888 88888888888888 888 888888 888888K
888 .d88PY8b. 888 888 888Y88b. 888 "88b
8888888P" "Y8888 888 888 888 "Y8888P888 888
===================================================
Derrick is a scaffold tool to migrate applications
You can use Derrick to migrate your project simply.
===================================================
This is the first time to run Derrick.
Successfully create DERRICK_HOME in /Users/zhongweilzw/.derrick
Derrick detect your platform is NodeJs and compile successfully.
此时在项目的根目录下已经生成了Dockerfile、docker-compose.yml等文件了,而这些配置文件则会成为后续整个DevOps流程的基础配置信息,此时执行derrick up
的结果如下。
Building web
Step 1/14 : FROM registry.cn-beijing.aliyuncs.com/codepipeline/node:6 AS base
---> c0cea7b613ca
Step 2/14 : WORKDIR /app
---> Using cache
---> c8c07dfd8dc9
Step 3/14 : COPY package.json .
---> Using cache
---> 055581ce2b5c
Step 4/14 : RUN npm set progress=false && npm config set depth 0
---> Using cache
---> 623f6b32520b
Step 5/14 : RUN npm install --only=production --registry=https://registry.npm.taobao.org
---> Using cache
---> f69ea9289d5c
Step 6/14 : RUN cp -R node_modules prod_node_modules
---> Using cache
---> 53ac8e86e88b
Step 7/14 : RUN npm install --registry=https://registry.npm.taobao.org
---> Using cache
---> d75ad55f841b
Step 8/14 : FROM base As test
---> d75ad55f841b
Step 9/14 : COPY . /app
---> Using cache
---> 5eb0247a9f71
Step 10/14 : RUN npm test
---> Using cache
---> 765536e52fc6
Step 11/14 : FROM base AS release
---> d75ad55f841b
Step 12/14 : COPY --from=base /app/prod_node_modules /app/node_modules
---> c1f1db7c2dc9
Step 13/14 : COPY . /app
---> 6c340f7d54ee
Step 14/14 : CMD npm start
---> Running in 3bec7ae892b4
---> 9ab9c384c029
Removing intermediate container 3bec7ae892b4
Successfully built 9ab9c384c029
Successfully tagged registry.cn-beijing.aliyuncs.com/ringtail/nodejs-demo:latest
WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating nodejsdemo_web_1 ...
Creating nodejsdemo_web_1 ... done
Your application has been up to running! You can run `docker ps` to get exposed ports.
通过 docker ps
,我们可以找到此时映射的端口,通过访问端口,即可在本地验证应用容器化的效果。
(venv) derrick-nodejs-demo git:(master) docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c47e02a9fe0d nodejs-demo:0.1 "npm start" 3 seconds ago Up 2 seconds 0.0.0.0:32774->3000/tcp derricknodejsdemo_web_1
访问浏览器localhost:32774,一个NodeJs的应用已经容器化完毕了。
尾声
Derrick目前暂时只支持NodeJs、Python、Java三种语言,但是Derrick的强大之处在于他的插件体系,开发者可以定义自定义插件的方式来实现自己特定场景的探测。在下一篇文章中会讲解下如何通过自定义插件的方式来实现自定义业务的容器化。
Derrick地址:https://github.com/alibaba/derrick,欢迎大家积极参与,提交代码。