轻松玩转应用容器化(一)- 初识容器迁移工具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,欢迎大家积极参与,提交代码。

目录
相关文章
|
5天前
|
运维 Java Go
Go语言基础及其在容器化应用中的优势
【2月更文挑战第23天】本文首先介绍了Go语言的基本特性和优势,然后详细阐述了Go语言在容器化应用中的重要作用和独特优势。通过深入分析Go语言的语法简洁性、并发处理能力和内存管理特性,以及Docker容器技术的轻量级、可移植性和版本控制特点,本文旨在说明Go语言与Docker容器技术的结合能够显著提升应用的开发效率和部署灵活性,为现代软件开发和运维带来革命性的变革。
|
1月前
|
消息中间件 监控 NoSQL
容器化应用系统上生产的最佳实践
容器化应用系统上生产的最佳实践
|
5天前
|
Kubernetes Go 开发者
Go语言与Docker容器结合的实践应用与案例分析
【2月更文挑战第23天】本文通过分析实际案例,探讨了Go语言与Docker容器技术结合的实践应用。通过详细阐述Go语言在容器化环境中的开发优势,以及Docker容器技术在Go应用部署中的重要作用,本文旨在为读者提供Go语言与Docker容器结合的具体实现方法和实际应用场景。
|
7天前
|
存储 Kubernetes 云计算
云计算基础与实战:从虚拟机到容器化应用
云计算基础与实战:从虚拟机到容器化应用
13 0
|
12天前
|
运维 应用服务中间件 调度
|
1月前
|
NoSQL Redis Docker
深入浅出:使用Docker容器化改进Python应用部署
在快速演进的软件开发领域,持续集成和持续部署(CI/CD)已成为加速产品上市的关键。本文将探索如何利用Docker,一种流行的容器化技术,来容器化Python应用,实现高效、可靠的部署流程。我们将从Docker的基本概念入手,详细讨论如何创建轻量级、可移植的Python应用容器,并展示如何通过Docker Compose管理多容器应用。此外,文章还将介绍使用Docker的最佳实践,帮助开发者避免常见陷阱,优化部署策略。无论是初学者还是有经验的开发人员,本文都将提供有价值的见解,助力读者在自己的项目中实现容器化部署的转型。
|
1月前
|
运维 Java 开发者
深入浅出:使用Docker容器化改善Java应用的部署与运维
在当今快速迭代的软件开发周期中,确保应用的一致性、可移植性与易于管理成为了开发与运维团队面临的重大挑战。本文旨在介绍如何通过Docker容器技术,有效地解决这些问题,特别是针对Java应用。我们将从Docker的基本概念出发,逐步深入到实际操作,展示如何将传统的Java应用容器化,以及这一过程如何帮助简化部署流程、提高应用的可靠性和可伸缩性。不同于常规的技术文章,本文试图以一种更加易于理解和实践的方式,让读者能够快速掌握容器化技术,并将其应用于日常的开发与运维工作中。
86 0
|
1月前
|
JavaScript NoSQL Redis
深入浅出:使用 Docker 容器化部署 Node.js 应用
在当今快速发展的软件开发领域,Docker 作为一种开源的容器化技术,已经成为了提高应用部署效率、实现环境一致性和便于维护的关键工具。本文将通过一个简单的 Node.js 应用示例,引导读者从零开始学习如何使用 Docker 容器化技术来部署应用。我们不仅会介绍 Docker 的基本概念和操作,还会探讨如何构建高效的 Docker 镜像,并通过 Docker Compose 管理多容器应用。此外,文章还将涉及到一些最佳实践,帮助读者更好地理解和应用 Docker 在日常开发和部署中的强大功能。
26 0
|
1月前
|
运维 Java Linux
深入解析:使用Docker容器化技术提升Java应用的部署效率
在快速迭代的软件开发周期中,如何保证应用的快速、一致和可靠部署成为了开发团队需要面对的重大挑战。本文将探讨如何利用Docker容器化技术,结合Java应用,实现高效、一致的部署流程。我们将从Docker的基本概念出发,详细介绍将Java应用容器化的步骤,包括创建Dockerfile、构建镜像以及运行容器等关键环节,并通过示例代码加以说明。此外,本文还将讨论在使用Docker部署Java应用时可能遇到的常见问题及其解决策略,旨在为读者提供一种提升部署效率、优化开发流程的有效方法。
293 2
|
1月前
|
Java 持续交付 虚拟化
深入浅出:使用Docker容器化改善Java应用的开发与部署流程
在快速迭代与持续集成的软件开发周期中,确保应用在各种环境中一致运行是一个挑战。本文介绍了如何利用Docker容器技术,来容器化Java应用,以实现环境一致性、简化配置和加速部署过程。我们将从Docker的基础知识开始,探讨其与传统虚拟机的区别,进而深入到如何创建Dockerfile,构建镜像,以及运行和管理容器。此外,文章还将涵盖使用Docker Compose来管理多容器应用的策略,以及如何利用容器化改善CI/CD流程。通过本文,读者将获得关于如何高效地利用Docker改善Java应用开发与部署流程的实践指导。
143 1

相关产品

  • 容器镜像服务
  • 容器服务Kubernetes版