不可变基础架构与容器

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文讲的是不可变基础架构与容器,【编者的话】本文翻译自Tutum社区,在文章中,作者讲解了什么是immutable infrastructure、immutable infrastructure的优势,以及如何构建immutable infrastructure,并着重介绍了两种构建方式,突出了Tutum在构建应用程序容器过程中体现的优势。
本文讲的是不可变基础架构与容器 【编者的话】本文翻译自 Tutum 社区,在文章中,作者讲解了什么是 immutable infrastructure immutable infrastructure 的优势,以及如何构建 immutable infrastructure ,并着重介绍了两种构建方式,突出了Tutum在构建应用程序容器过程中体现的优势。

很久以前,我在纽约参加了一场 Docker见面会 ,在会上, Michael Bryze(Gilt的CTO)谈论了使用Docker过程中的 不可变基础架构优势 。有些人仍 心存疑惑 ,但在Tutum,我们强力支持这个受益于容器崛起的model。

什么是“Immutable Infrastructure”?

当你向应用程序部署更新时,正常情况下,你会创建新的实例(存在于服务器或容器上),并删除旧的实例,而不是尝试去更新原有实例。一旦你的应用程序开始运行,就不要再动它。重复性、管理开销的减少、更易回滚等优势自然形成, 关于其优势, Chad Fowler Michael DeHaan Florian Motlik 曾在在他们的文章中深入探讨过。

为了实现这些优势,你需要构建一个应用程序来满足下面这两个基本要求:
  • 你的应用程序进程是无状态的。它们的状态要储存在一个服务中,这个要位于“immutable infrastructure”的范围之外(除了使用Volume的,并正在运行的容器,这个问题我们将会解决)
  • 你要有一个模板或一组可以从头部署应用程序实例的指令。

第二个要求是关键,虽然有很多种实现方式,但容器就是为了满足这个要求而创建的。

使用配置管理软件

在这个model中,需要使用容器吗?从技术上讲,答案是否定的。但是,使用容器能带来的巨大的帮助。

在没有使用容器的情况下,通过部署新的虚拟机,你仍然可以获得不可变性。这个新的虚拟机中,可以使用新版本应用程序的VM模板(应用程序可以是自动化的),也可以通过使用像Chef或者Puppet这样的配置管理软件来进行配置。目标是从头开始部署新的应用程序实例,并且处理流量。

一旦完成这些,你就可以切换你的负载平衡器,从而开始发送请求,并终止旧的负载平衡器。采用这种model,在为本地应用程序升级而移除代码时,你的 'recipes' 复杂度就降低了。

但老实说,为每一个只能在特殊cloud provider上工作的应用程序版本创建VM模板,这不是理想的解决方案(即使可以自动化进行,这个过程仍然是麻烦的),并且对开发者来说,避免持续性地测试配置管理脚本是一种有经验的做法。

借助容器进行工作

为什么使用容器?因为,相较于对虚拟机进行快照处理,或者为配置服务器运行脚本,容器可以做到快速创建、测试以及部署。并且,一旦你的应用程序完成构建、测试以及标记。部署它将是一个非常高效的过程,因为你已经从等式中基本移除了底层操作系统的配置。

为最新的Vanilla OS,部署cloud provider的基础模板,通过以上步骤,你就可以将重任委托给你的cloud provider。如果打过补丁,并且为虚拟机(关于虚拟机,你不用在意具体细节,只要虚拟机运行Docker就可以)优化过,它甚至可以有更好的性能。

每次你想要推送新版本的应用程序时,容器也不再需要部署新的服务器。因为,所有的应用程序依赖项和逻辑已经内置在容器中,并且已经被它们的新版本替代了,你的服务器可以保持,并获得不可变基础架构model的优势,这可以显著地减少开发时间。

最重要的是,你仍可以受益于容器,例如,不会被任意cloud provider或者Linux发布版所限制(只要它们运行的是Docker),如果可以在本地工作,那么,它同样也可以在任意provider上工作。这不是我们梦寐以求的吗?

通过使用容器,如何使你的新版本部署工作自动化地进行呢?下面有两个主要的步骤:
  • 构建你的新镜像。虽然有很多种构建应用程序镜像的方法(手动,或者使用配置管理软件等),但是,使用一个简单优化的Dockerfile是普遍的做法。在推送镜像前,你可以使用CI/CD平台进行测试。在生产部署时,要为镜像加上版本号标记,这有助于在必要时回滚应用程序。
  • 部署你的新容器。你可以在新的,或者已经存在的服务器上部署(手动或自动)容器,并切换负载平衡器,向你新部署的容器发送流量。这可以是实例级别的(例如,在每台AWS EC2的实例上使用应用程序容器,以及动态负载均衡器),也可以是容器级别的(使用haproxy或者nginx服务器,转发流量到你的应用程序容器)。

在为应用程序使用多台主机和容器的情况下,如何使步骤2自动化地进行呢?那就使用Tutum。

借助Tutum进行工作

通过使用Tutum,部署新版本应用程序成了一个微不足道的任务。你只需要在服务定义上改变镜像标记,并点击 重新部署 就可以了。

在一个回滚到特定版本不是那么重要的非生产部署下,通过使用我们的
自动重新部署特性 ,或者与DockerHub相关的自动重新部署 triggers ,我们甚至可以使自动部署程序自动化地进行。

一旦自动部署程序开始工作,Tutum将会用新容器,一个接着一个地替代原有的旧容器。我们提供了一个 tutum/haproxy 镜像,这个镜像会根据它所处的容器进行自动配置。无论你是使用Docker links在本地部署,还是进入Tutum内部部署,当所连接的服务发生收缩或被重新部署等情况时,它都会自动化地重新调整它自己。

如果你想要并行地使用新容器与旧容器进行快速地回滚,你不需要一些和 Asgard 一样超级复杂的工具。

无论是部署一个使用新镜像标记的服务,还是从tutum/haproxy服务中增加一个链接。Tutum都将会检测到更改,并自动化地开始转发请求到新的服务和旧的服务。当你准备好切换时,你只需要终止旧的服务。默认情况下,tutum/haproxy会自动检测到死亡的应用程序容器,并再次发送请求到健康的容器。

要是开发者使用data volumes呢?我知道我刚才说过,这些应用程序需要是无状态的,但在Tutum中,volumes是跨部署的持久化存在,因此,如果你重新部署一个 tutum/mysql 容器(默认情况下,这种操作会为/var/lib/mysql创建一个data volume),Tutum将会重新使用这个Volume,并保留它的数据。

一旦你的容器开始运行,就不要去碰它!使用docker exec(或者Tutum的“terminal”特性)只能调试,并运行一次性管理任务,不要去改变你的应用程序代码!应用程序的改变应该在镜像和环境变量中完成,而不是正在运行的实例。

然后呢?

我们正在努力使从代码到部署的过程变得清晰明了,简单而有力。我们还有一些令人兴奋的新特性,这些特性会在接下来的几个礼拜内宣布。同时,我们听取 社区的意见 ,并欢迎你的想法和观点。

原文链接:Immutable Infrastructure and Containers   (翻译:洪国安 审校:魏小红)

============================================
译者介绍
洪国安,编程爱好者,目前是一名大三学生,希望通过帮社区翻译,提高自己的知识面。

原文发布时间为:2015-06-10
本文作者:Arthur
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:不可变基础架构与容器
目录
相关文章
|
1月前
|
Kubernetes 开发者 Docker
基于容器技术的微服务架构
基于容器技术的微服务架构
32 0
|
2月前
|
Kubernetes 物联网 数据中心
大规模 IoT 边缘容器集群管理的几种架构 -2-HashiCorp 解决方案 Nomad
大规模 IoT 边缘容器集群管理的几种架构 -2-HashiCorp 解决方案 Nomad
|
1月前
|
运维 API Docker
深入浅出:微服务架构与容器化技术的完美融合
【2月更文挑战第13天】 在现代软件开发领域,微服务架构和容器化技术已成为推动企业快速发展的两大核心力量。本文将从微服务的基本概念出发,深入探讨其与容器化技术结合的必然性与优势,进而分析如何在实践中有效地实现二者的完美融合。通过对微服务架构的细致解析及容器化技术的应用展示,旨在为读者提供一种全新的视角,理解并掌握这一前沿技术趋势,以指导实际工作中的技术选择与架构设计。
|
2月前
|
开发者 Docker 微服务
深入浅出:使用Docker容器化部署微服务架构
在当今快速迭代的软件开发环境中,微服务架构因其高度解耦和独立性而成为企业首选。然而,微服务的管理和部署可能会变得复杂和繁琐。本文将探讨如何利用Docker,一个轻量级的容器化技术,来简化和加速微服务的部署。我们将从Docker的基础概念入手,详细介绍如何创建、配置和运行微服务容器,最后讨论Docker在微服务架构中的优势和挑战。本文旨在为开发者提供一条清晰的路径,通过容器化技术实现微服务架构的高效部署和管理。
87 0
|
2月前
|
Kubernetes 开发者 Docker
深入浅出:使用Docker容器化部署微服务架构
在当今快速演进的软件开发领域,微服务架构因其高度的模块化和可伸缩性而受到广泛欢迎。然而,微服务的部署和管理也带来了新的挑战。本文旨在通过深入浅出的方式,探讨如何利用Docker容器技术有效地部署和管理微服务架构。我们将从Docker的基本概念出发,逐步深入到如何构建、部署微服务,并讨论在此过程中可能遇到的常见问题及其解决策略。本文不仅适合刚接触Docker和微服务的新手,也为有经验的开发者提供了实用的参考。
56 1
|
2月前
|
JSON JavaScript Docker
深入浅出:使用Docker容器化部署微服务架构
本文旨在向读者展示如何利用Docker技术高效地构建和部署微服务架构。通过深入浅出的方式,我们将探索Docker的基本概念、容器化的优势以及如何将其应用于微服务架构中。此外,文章还将提供一个简单的示例,指导读者实践如何使用Docker将一个现有的后端应用容器化,并部署到本地开发环境中。不同于传统的摘要,这里我们强调实践操作的重要性,鼓励读者通过实际操作来加深对Docker和微服务架构的理解。
52 1
|
2月前
|
Java 开发者 Docker
深入浅出:使用Docker容器化部署微服务架构
在本文中,我们将探索Docker容器技术如何革新微服务架构的部署方式,提高开发效率和应用的可扩展性。不同于传统摘要的概述风格,我们将通过一个实际案例,步骤明晰地展示如何将一个简单的微服务应用容器化,并在Docker环境中部署运行。本文旨在为开发者提供一个清晰、易懂的指南,帮助他们理解容器化技术的基本原理和操作流程,无论是初学者还是有经验的开发人员都能从中获益。
|
2月前
|
存储 Kubernetes Docker
深入浅出:使用Docker容器化部署微服务架构
在当今快速迭代的软件开发周期中,微服务架构凭借其高度的模块化和灵活性成为了众多企业的首选。然而,随之而来的是对环境一致性和服务部署效率的挑战。本文将探讨如何利用Docker这一轻量级容器技术,实现微服务的快速、一致和可靠部署。通过深入浅出的方式,我们将介绍Docker的基本概念、容器化微服务的优势以及步骤详解,旨在为读者提供一个清晰的实践指南,帮助他们在微服务架构的部署过程中提升效率和可靠性。
66 0
|
2月前
|
设计模式 运维 Docker
深入浅出:使用Docker容器化部署微服务架构
本文旨在为读者提供一个全面且易于理解的指南,介绍如何使用Docker技术来容器化部署微服务架构。随着云计算和微服务架构的普及,Docker作为一种轻量级的容器解决方案,已经成为开发和运维领域的热门技术。本文将从Docker的基本概念出发,详细讲解如何将传统的应用服务转化为容器化的微服务,包括Dockerfile的编写、镜像构建、容器部署以及服务编排等关键步骤。此外,文章还会探讨使用Docker部署微服务架构的最佳实践和常见问题,帮助读者有效地管理和优化其微服务系统。
79 1
|
2月前
|
Kubernetes API Docker
深入浅出:使用Docker容器化部署微服务架构
在本文中,我们将探索如何利用Docker容器技术实现微服务架构的高效部署与管理。不同于传统的摘要方式,我们将采用一个故事化的场景引入,设想在一个快速发展的互联网公司中,随着业务的扩张,传统的单体应用逐渐变得难以维护和扩展。开发团队决定采用微服务架构来解决这一问题,而Docker作为容器化技术的佼佼者,被选为部署和管理微服务的关键工具。文章将详细介绍Docker的基本概念、微服务架构的优势,以及如何结合两者进行高效的应用部署和管理。
25 0