容器: 让“基础设施即代码”更容易

容器在“基础设施即代码(Infrastructure as Code)”中有什么意义?

一句话概括的话,容器意味着一切。

为什么这么说呢?当你在比较单体应用和微服务时,一定会有一些权衡和取舍。一方面,从单体模型转移到微服务模型,能够将进程分离成独立的工作单元。这使得开发者们可以将注意力放在单一功能上,并且有助于测试和扩展。另一方面,由于将所有的东西都分成了单独的服务,过去你只需管理一个单一部署单元的基础设施,现在你却必须管理每一个服务的基础设施。正是为了应对这一挑战,“基础设施即代码”作为一个解决方案便诞生了。

容器技术已经存在一段时间了,它以不同的形式实现且已取得不同程度的成功。这项技术从上世纪80年代初的chroot开始,并在之后带来了如Virtuozzo和Sysjail这样形式的产品。直到2013年Docker的诞生和其后的迅猛发展,一切才化零为整,才真正开始深刻影响了应用程序在容器模型中的开发、测试和部署。

“基础设施即代码”的实践,和Docker容器一起,象征着一个最具颠覆性和创新性的改变,它影响了我们今天开发和发布软件的过程。

什么是“基础设施即代码”(IaC)?

在深入探讨IaC及它和容器的关系之前,先看看IaC的具体含义吧。IaC指的是开发应用程序本身的同时,对硬件和操作系统需求的供应编写脚本的实践。通常,管理这些脚本的方式和软件代码库类似,包括版本控制和自动化测试。

当正确执行时,脚本将代替管理员登陆新机器并进行配置。这些脚本描述了新机器的理想状态,并会执行必要的步骤来配置机器,以实现这一状态。

“基础设施即代码”带来的核心便利

IaC旨在利用系统配置来缓解最常见的痛点,特别是以前配置一个新环境通常需要花费大量的时间。每一个环境都需要单独配置,且如果某处出现错误,通常需重新进行整个过程。IaC消除了这些痛点,并向开发者和运维人员提供了以下额外的便利:

  1. 重新使用常见的脚本变得相对简单了。
  2. 整个供应过程可实现自动化,连供应硬件都可以作为持续交付过程的一部分。
  3. 版本控制,可以根据需要测试和回滚较新的配置。
  4. 同行审查和脚本强化。不需手动地从文档或内存中配置,就可以对脚本进行审查、更新和持续改进。
  5. 文档是自动的,因为本质上它就是脚本本身。
  6. 过程可以被测试。

容器,将“基础设施即代码”带向新高度

作为开发者,我想我们都遇到过诸如“我不知道啊,反正它在我的机器上工作!”这样的情况。往好处说,这是一种诙谐有趣的说法;但往坏处说,它代表了我们每天都要处理的一个很大的问题。Docker这一革新性的技术不仅有效消除了开发者的这些担忧,它还使得IaC在开发过程中成为一个核心组件。

为了更好地说明这一点,让我们想象一个已经Docker化的Web应用,它有简单的UI界面。该应用将有一个类似于如下所示的Dockerfile,具体说明了包含该应用的容器的配置信息。

FROM ubuntu:12.04
# Install dependencies
RUN apt-get update -y && apt-get install -y git curl apache2 php5 libapache2-mod-php5 php5-mcrypt php5-mysql
# Install app
RUN rm -rf /var/www/*
ADD src /var/www
# Configure apache
RUN a2enmod rewrite
RUN chown -R www-data:www-data /var/www
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
EXPOSE 80
CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]

如果你熟悉Docker,这是一个相当典型和简单的Dockerfile,你应该已经知道了它是什么。如果你不熟悉Dockerfile,那么可以理解为,这个文件将用于创建一个Docker镜像,它本质上是一个用来创建容器的模板。Docker容器创建完毕后,镜像将用于构建容器,于是一个自包含的应用程序就这么产生了。从开发工作站到高可用云集群,它可以在已经将其实例化的任何机器上使用。

我们看一下文件中的几个关键参数,并看看它们在过程中实现了什么:

FROM ubuntu:12.04

这一行是从Docker Hub中拉取一个Ubuntu Docker镜像,作为新容器的基础。Docker Hub是主要的Docker镜像在线仓库。如果你访问Docker Hub并在其中搜索这个镜像,你就能找到Ubuntu镜像仓库了。这是一个官方镜像,是由Docker支持的专门团队负责管理的。使用该镜像的好处是,当你的底层技术出现问题时,很有可能已经有人开发出了修复补丁并实现了它,并且你所需要做的只是更新你的Dockerfile到新版本,重建你的镜像,并再一次测试和部署你的容器。

Dockerfile中剩下的几行将使用apt-get在基础镜像上安装各种软件包。将应用程序的源添加到/var/www目录,配置Apache,然后将容器的公开端口设置为端口80。

最后,当容器搭建好后运行CMD指令,这将初始化Apache服务器,打开它以接收http请求。

这是“基础设施即代码”最简单的形式。这就是它的全部。

此时,假如你已经在工作站上安装并运行Docker了,你可以从Dockerfile所在的目录中执行以下指令:

$ docker build -t my_demo_application:v0.1

Docker将为你构建镜像,将其命名为my_demo_application并加标签v0.1,v0.1实际是一个版本编号。镜像创建后,您可以使用以下命令获取该镜像,并使用该镜像创建容器。

$ docker run -d my_demo_application:v0.1

就像这样,你就可以在本地机器上运行你的应用程序,或者在你选择的任何硬件上运行它。

结语

一份简单的Dockerfile,可以检查你的源代码,指定应用程序的环境、配置和访问路径,这就是Docker和“基础设施即代码”的最简单形式。同时你可以使用docker compose来定义多层次服务的组合应用,每个服务都包含一个独立的Dockerfile或者导入Docker仓库的一个镜像。你还可以使用docker compose的增强版本rancher compose,这是微服务部署利器,可以让我们更加便利得玩转rolling upgrade等高级特性。

译者:刘力,Rancher Labs大中华区架构师。

原文链接:Rancher Labs

时间: 2024-11-04 23:20:51

容器: 让“基础设施即代码”更容易的相关文章

容器: 让“架构即代码”更容易

容器在"基础设施即代码(Infrastructure as Code)"中有什么意义? 一句话概括的话,容器意味着一切. 为什么这么说呢?当你在比较单体应用和微服务时,一定会有一些权衡和取舍.一方面,从单体模型转移到微服务模型,能够将进程分离成独立的工作单元.这使得开发者们可以将注意力放在单一功能上,并且有助于测试和扩展.另一方面,由于将所有的东西都分成了单独的服务,过去你只需管理一个单一部署单元的基础设施,现在你却必须管理每一个服务的基础设施.正是为了应对这一挑战,"基础设

Developer Friendly | 基础设施即代码的事实标准Terraform已支持京东云!

Developer Friendly | 基础设施即代码的事实标准Terraform已支持京东云! Chef.Puppet.Ansible.SaltStack 都可以称为配置管理工具,这些工具的主要目标是在已经存在的机器上安装和管理软件.而随着云计算时代的到来,在现在的环境下,大家使用容器等服务,镜像已经包括了软件的安装与配置.一旦你有了镜像,你需要的是一些服务器去运行它. Terraform 这一更注重于数据中心以及相关服务的编排工具的工作重点就是创建资源并且引导进行初始化. 对于提供服务器这

解读基础设施即代码

现代软件开发对基础设施的管理提出了更苛刻的要求.产品要适应瞬息万变的市场,要求基础设施要有更快的响应速度.而持续交付和DevOps的推行要求产品团队对部署和运维要有更高的自主性.技术的快速进步和演化,也使得基础设施的配置不得不频繁变化.在这种快速变化的过程中,要求基础设施既要灵活,也要安全.可靠. 而传统的基础设施运维管理具有以下几个问题. 被动响应. 产品团队获取服务器资源采用的是申请制,中间存在若干审批过程,以及需要等待运维团队实施,响应不及时. 自动化缺乏串联.虽然有一定的自动化,但不能做

如何在Android开发中让你的代码更有效率

如何在Android开发中让你的代码更有效率 最近看了一个视频,名字叫做Doing More With Less: Being a Good Android Citizen,主要是讲如何用少少的几句代码来改善Android App的性能.在这个视频里面,演讲者以一个图片app为例讲解如何应用Android中现有的东西来改善app性能问题. 这个图片app的代码:https://github.com/penkzhou/iogallery.ppt:http://greenrobot.qiniudn.

CSS 黑魔法小技巧,让你少写不必要的JS,代码更优雅

首页 登录注册 CSS 黑魔法小技巧,让你少写不必要的JS,代码更优雅 阅读 8113 收藏 927 2017-09-26 原文链接:github.com 腾讯云容器服务CSS,立即免费体验容器集群吧!cloud.tencent.com 之前不久,由于自己平时涉猎还算广泛,总结了一篇博客:这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已,没想到受到了大家的欢迎,有人希望能博主还能整理个 CSS 的一些黑魔法小技巧,无奈我 CSS 一直很渣,没什么干货,最近写了一个 Chro

让你的自动化代码更健壮

在做自动化测试时,尤其是UI级自动化,如何让你的代码更健壮可能是你经常要考虑的问题,这里分享几个小Tips. 多用WaitForXXXX 严格意义上讲,任何长时间的“硬等待”都是可取的!!到处随意的Sleep()只能显示你技能的匮乏,写出的Case也会效率低下.所以当此之时, 我们都应该多用WaitFor方法,而且任何的自动化框架都是有类似方法的,像Robotium的: solo.waitForDialogToClose() //waits for the dialog to close sol

怎样让你的代码更好的被JVM JIT Inlining

好书推荐:Effective Java中文版(第2版) JVM JIT编译器优化技术有近100中,其中最最重要的方式就是内联(inlining).方法内联可以省掉方法栈帧的创建,方法内联还使让JIT编译器更多更深入的优化变成可能.本人在fastxml(速度比XPP3(基于xmlpull)还快的xml解析器)开源项目中针对方法内联进行了很多学习和实践,这里总结一下,介绍一下怎么让你的代码更好的被JVM JIT Inlining. Inlining相关的启动参数 上一篇博客<Java JIT性能调优

让代码更帅一点

博主的私人博客 写代码最重要的是实现功能,但是除了实现功能之外,我们还应该想办法,让代码变得更规范,更漂亮 最近在读<禅与Objective-C编程艺术>和<Effective Objective C 2.0:编写高质量iOS与OS X代码的52个有效方法>,这两本都讲解了代码规范方面的东西,结合自己平时的代码习惯,发现有很多地方自己做的还是不够好,代码写得不够帅,所以总结一下,让以后的代码更帅一点 条件语句 条件语句一定要使用括号,如果不使用括号,if后面的那行代码删除,之后的代

基于AOP的MVC拦截异常让代码更优美

与asp.net 打交道很多年,如今天微软的优秀框架越来越多,其中微软在基于mvc的思想架构,也推出了自己的一套asp.net mvc 框架,如果你亲身体验过它,会情不自禁的说‘漂亮’.回过头来,‘漂亮’终归有个好的思想,其中类似于AOP的思想,就在其中体现的淋漓尽致,今天本文主要讨论的是基于AOP思想构成的‘异常过滤器’.我们的目的只有一个,让try...catch...无处盾形,让代码更健壮优美. 一.理解mvc里filter是怎么运行的 老外的一篇文章是这样的草图 通过翻译中文是这样的 其