Docker:解决了VM,代码迁移和SOA

像Docker这样新的软件很少会被初创公司以及大型,知名企业广泛采用 。 创建和维护Docker的公司dotCloud 最近获得了4000万美元的融资 。 微软还于11/18宣布了适用于Windows的Docker CLI 。 Docker还将在Azure以及Windows Server的下一版本中扮演中心角色

那么,所有的炒作是什么?

Docker解决了部署软件时遇到的两个最困难的问题:无痛地旋转VM,以及将应用程序代码与部署环境捆绑在一起。

只需单击一个按钮,即可旋转新的自定义实例。 在平台之间迁移代码很简单,因为我们的应用程序代码与环境打包在一起。

在过去的几个月中,Keyhole一直在围绕Docker吸引着很多人。 当前,我们在一个应用程序中使用它来管理我们的部署过程。 在我了解将Docker与其他虚拟机管理程序和部署工具区分开来的原因之后,我们看到它大量活动的原因将变得清楚。

类固醇上的VM

虚拟机(VM)是一个了不起的工具,已帮助从物理硬件进一步抽象出运行时环境。 不幸的是,VM在启动和执行时会带来相当大的性能损失。

VM中大多数问题的原因是重复工作。 要了解此重复,请考虑Linux操作系统的结构。 Linux内核 (管理网络和线程等深层任务)与用户空间(这是内核外部的所有内容)之间存在明显的区别。

Linux操作系统

诸如VirtualBoxVMWare之类的传统VM在用户空间中运行其VM。 当传统的VM启动计算机实例时,它将在现有用户空间内启动Linux内核和用户空间。

linux-os-with-vm

这是复制起作用的地方。 当已经有Linux内核可供使用时,为什么Linux内核应该位于用户空间内? 没有。 这就是Docker的制造商意识到的。 只要VM的Linux内核与主机的Linux内核匹配,就已经存在VM用户空间可以利用的明显分隔。

linux-os-with-docker-vm

Docker VM启动时,会将VM用户空间附加到主机Linux内核。 这意味着引导以毫秒的方式发生。 性能是主机上运行的软件的97% 。 Docker具有所有优点,而没有任何缺点。 加…

解决部署

Docker VM是从一个定义良好的脚本Dockerfile生成的 。 Dockerfile指定要使用的Linux版本和版本,要安装的软件,要打开的端口,如何提取源代码等。您需要的所有内容都捆绑在一个文件中。 这是我几个月前所做的项目中的Dockerfile示例:

FROM ubuntu:12.04
MAINTAINER Zach Gardner <zgardner@keyholesoftware.com>

# Update apt-get
RUN apt-get update

# Create container
RUN mkdir /container
RUN mkdir /container/project

# Install NodeJS
RUN apt-get --yes install python g++ make checkinstall fakeroot wget
RUN src=$(mktemp -d) && cd $src && \
    wget -N http://nodejs.org/dist/node-latest.tar.gz && \
    tar xzvf node-latest.tar.gz && cd node-v* && \
    ./configure && \
    fakeroot checkinstall -y --install=no --pkgversion $(echo $(pwd) | sed -n -re"s/.+node-v(.+)$/\1/p") make -j$(($(nproc)+1)) install && \
    dpkg -i node_* && \
    rm -rf $src

# Install NPM
RUN apt-get --yes install curl
RUN curl --no-check-certificate https://www.npmjs.org/install.sh | sh

# Install Bower's dependencies
RUN apt-get install --yes git

# Install PhantomJS dependencies
RUN apt-get install --yes freetype* fontconfig

# Move source code to container
ADD / /container/project

# Install NPM dependencies
RUN cd /container/project/ && npm install

# Install Project's Bower dependencies
RUN cd /container/project && (echo -e "n" | ./node_modules/bower/bin/bower install --allow-root)

# Compile code
RUN cd /container/project && ./node_modules/grunt-cli/bin/grunt build

# Start server
CMD /container/project/node_modules/grunt-cli/bin/grunt --gruntfile /container/project/Gruntfile.js prod

我在此脚本中所做的第一件事是定义我正在使用Ubuntu 12.04。 我安装了NodeJS,NPM和git。 我从存储库中复制源代码,下载运行时依赖项,编译我的代码,然后启动服务器。

当您将Dockerfile传递给Docker时,它会生成Docker映像。 考虑Docker映像的最好方法是,它是一个独立的zip文件,其中包含应用程序需要运行的所有内容。

码头工人形象

组合的源代码和执行环境是对传统部署方法的完全转变。 无需移动代码,而是让人们执行Shell脚本来更新环境并希望获得最好的结果,而是可以将新的Docker映像过渡到不同的平台。 几乎不需要人工干预,从而减少了出错的机会。 最重要的是,一旦对特定版本的应用程序执行了质量检查,就可以确定在将应用程序迁移到平台上时该应用程序不会更改。

有趣的是,传输Docker映像的Docker范式与Reactive编程中所做的一些研究一致。 管理状态是应用程序中最困难的事情之一。 可变性使创建线程安全的代码变得不容易。 通过将思想转移到处理不可变的数据,CPU可以比以前更轻松的方式优化线程和操作。 Docker摆脱了平台上软件更新的概念,从而遵循了这一范例。 报废正在运行的Docker映像并将其替换为新映像要容易得多,而不必担心如何升级当前正在运行的映像。 如果版本过时,则不需要脚本来升级Java之类的脚本,也不需要诸如此类的其他令人烦恼的事情。 Docker消除了您平台上运行的软件的猜测:这是Dockerfile中指定的开发人员所要做的。

跨平台迁移映像是一件微不足道的工作。 可以将Docker映像推送到Docker注册表( 公共私有 ),然后下拉至所需平台。 语法与git非常相似:

在开发平台上

docker push zgardner/myapp

在生产平台上

docker pull zgardner/myapp
docker run -i -t zgardner/myapp

在上面的示例中,我首先将myapp推送到Docker注册表。 然后,我从更高的平台上将其下拉,然后运行它。

docker-dev-to-prod1

运行中的Docker映像的术语是Docker容器。 我省略了一些步骤以显示现有容器的关闭,如何指定Docker容器应通过其通信的端口等。这些都是使用Docker的组织可以自行指定的内容。

与我见过的每个内部专有的,自酿的解决方案相比,能够如此轻松地迁移代码的想法是一个可喜的革命。 将Linux内核附加的VM的功能与简化的迁移过程结合在一起,会产生一些非常强大的影响。 Keyhole的我们一直在尝试CoreOSFleet来部署新服务器,使用Docker进行设置,并从Amazon AWS控制台下载Docker映像。 我们也开始尝试…

面向服务的体系结构:像切面包一样容易

Docker是第一个真正的DevOps工具 。 它使开发人员可以轻松指定应在其中执行其代码的环境。 它还消除了担心升级环境的压力。

Docker映像是静态容器,这意味着它们需要在应用程序本身之外卸载持久性数据。 这通常是通过在定义Docker容器时挂载AWS驱动器来完成的。 这也意味着应用程序内部包含的代码必须小巧,简洁且非常集中。 由于该应用程序将在隔离的环境中运行,因此需要对其进行定义,就像可以自己在一个孤岛上运行一样。

这往往很适合使用SOA(面向服务的体系结构) 。 SOA是考虑API以及通常如何组成应用程序的另一种方式。 对应用程序的传统思考方式是,它是由较小的技术部分组成的系统。 这些技术部分可能是“产品”或“客户”或“基金”或“计划”工作之类的东西。 软件公司编写的其他应用程序可能需要其中一些技术部分。 传统方法是尝试共享代码(由于编写代码时仅考虑了原始应用程序而通常不起作用),或者将代码全部复制到一起,这实际上是行不通的。

考虑到SOA编写的应用程序的设计目的是完全不同的目标。 在SOA中,应用程序是通过将业务需求与应用程序代码组合在一起而组成的。 上面提到的某些技术部分实际上是业务需求。 尽管在不同的应用程序中,它们可能会以不同的方式使用,具体取决于UI。 如果可以将这些业务需求中的每一个隔离到一个定义良好,一致的界面中,那么它们可以通过设计重用。

码头工人

使SOA成为组织的主要重点,可以使新应用程序快速有效地组合在一起。 亚马逊是率先采用这种方法的公司之一 。 SOA运作良好,因此正赶上许多其他大小公司。

Docker非常适合SOA。 每个服务都可以视为一个单独的Dockerfile。 跨平台迁移服务就像推送静态Docker映像并将其拉下一样容易。 它们由于在独立VM中运行的本质而被隔离。 使用Swagger之类的API文档工具可以使服务定义得更好。

Netflix等公司也使用Docker 来实现微服务 。 这些服务的范围与SOA中的传统服务不同。 传统服务正在不断发展,并且常常难以隔离和包含。 微服务专注于对环境的了解尽可能少的极小的可重用组件。 Docker提供的隔离与实施可部署在任何地方的微型微服务很好地结合在一起。

在Keyhole,我们正在努力将问答系统与Timesheet应用程序一起重写,以将SOA与Docker一起使用。 到目前为止,结果非常有希望。 我们将来还会发布博客文章,其中将详细介绍在此过程中我们发现并经历的不同事情。

总结一切

Docker是一个非常强大的工具,我们相信它将在未来几年内成为行业标准。 它颠覆了VM和应用程序迁移过程。 帮助客户在其堆栈中实现它,并节省大量的时间和精力,对我们来说将是令人激动的。 Docker将允许开发人员和企业系统工程师停止担心构建和部署问题,而将精力集中在重要的事情上:构建漂亮的应用程序。

翻译自: https://www.javacodegeeks.com/2014/11/docker-vms-code-migration-and-soa-solved.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值