轻松玩转应用容器化(一)- 初识容器迁移工具Derrick

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 2017年是容器领域交战非常激烈的一年,容器编排领域逐渐形成一超多强的局面,各种容器解决方案变得越来越成熟,传统的中间件(监控、日志、报警)对容器化场景支持逐渐完善。到了今年,如果一家公司还没有开始对Docker进行关注,真的不好意思说是在互联网的圈子里了。

前言

2017年是容器领域交战非常激烈的一年,容器编排领域逐渐形成一超多强的局面,各种容器解决方案变得越来越成熟,传统的中间件(监控、日志、报警)对容器化场景支持逐渐完善。到了今年,如果一家公司还没有开始对Docker进行关注,真的不好意思说是在互联网的圈子里了。

de8795d88ad0456d6128968572900d3c61c1d6f7bac5ef2f3c98a0066b8a23919ebc6f2ef86799a5

越来越多的企业开始在生产环境中使用容器技术进行架构,在各种互联网大会上,也有越来越多的嘉宾开始分享他们在使用容器上的心得。但是选择容器技术进行整体的技术架构转型实际上需要极大勇气的,在几年前,容器的解决方案还不完善,第一批吃螃蟹的企业和开发者都头破血流的搭建容器的集群、修改可选项不多的开源工具、适应着整个流程的变更。今天,容器架构的技术债务已经基本还清,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一键实现容器化

f8e01d07cc63a55caf6654c87d0b9eb6a880689d
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的应用已经容器化完毕了。

8c7c53def399f0302f706990aa6d4ba004926f2e

尾声

Derrick目前暂时只支持NodeJs、Python、Java三种语言,但是Derrick的强大之处在于他的插件体系,开发者可以定义自定义插件的方式来实现自己特定场景的探测。在下一篇文章中会讲解下如何通过自定义插件的方式来实现自定义业务的容器化。

Derrick地址:https://github.com/alibaba/derrick,欢迎大家积极参与,提交代码。

目录
相关文章
|
11天前
|
开发框架 安全 开发者
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。本文探讨了 Docker 在多平台应用构建与部署中的作用,包括环境一致性、依赖管理、快速构建等优势,以及部署流程和注意事项,展示了 Docker 如何简化开发与部署过程,提高效率和可移植性。
32 4
|
19天前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
26天前
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?
|
26天前
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
|
28天前
|
运维 开发者 Docker
Docker Compose:简化容器化应用的部署与管理
Docker Compose:简化容器化应用的部署与管理
|
1月前
|
JavaScript 持续交付 Docker
解锁新技能:Docker容器化部署在微服务架构中的应用
【10月更文挑战第29天】在数字化转型中,微服务架构因灵活性和可扩展性成为企业首选。Docker容器化技术为微服务的部署和管理带来革命性变化。本文探讨Docker在微服务架构中的应用,包括隔离性、可移植性、扩展性、版本控制等方面,并提供代码示例。
57 1
|
13天前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
47 0
|
15天前
|
JavaScript Linux 持续交付
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
44 0
|
21天前
|
Kubernetes 监控 安全
容器化技术:Docker与Kubernetes的实战应用
容器化技术:Docker与Kubernetes的实战应用
|
28天前
|
前端开发 开发者 Docker
深入探索Docker Compose:简化多容器应用的部署
深入探索Docker Compose:简化多容器应用的部署
59 0