如何利用容器构建持续交付/持续发布系统?

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:
讲师介绍
 
 

张春源

希云技术总监

 
 

概述

 
 

 

提到软件发布确实是很令人头疼的一个过程,且还是高风险动作。借用一句话:“99%的故障是由于变更引起的”。本次分享内容着重介绍使用容器技术实现自动化构建、部署和测试过程,并使得开发、测试、运维之间能更好的协作,最终可以在几个小时甚至几分钟的时间,实现可重复,且可靠的软件发布系统。

 

常见场景
 
 

 

  • 在开发测试环境中测试均没有问题,但上生产环境的时候会有问题。即使我们在开发测试环境中部署上万遍没问题,但从来没有在生产环境中部署过一次,每到在新版本发布时,大家不仅要加班,而且都还很紧张。如果没有很好的回滚策略,即使发布成功了心还是悬着。

  • 移动互联网飞速发展,业务要求敏捷,要在很短的时间完成从开发到上线的任务。很多企业从开发到上生产的周期都要花好几个月的时间完成,现有IT架构跟不上业务发展。

  • 软件项目开发完成后,要将开发好的版本交付到客户的环境中。目前常见的做法是按照长长的安装文档,且是通过手动安装完成,此种模式不仅对安装实施人员的要求高,且出错几率很高。

 

构建持续交付/持续发布系统需要考虑
 
 

 

1、环境管理

 

环境包括硬件和软件,对于软件环境一定要能对硬件解耦,这样即使在硬件坏的情况下可以在很短的时间内将软件环境部署到新的硬件上。除此之外,好的环境管理方式能有效降低在生产环境中部署的风险。

 

实践推荐:环境的管理在项目开始的时候,开发团队和运维团队就应该全面合作,后面的事情就会变的很容易。

 

 

2、组件和依赖管理

 

很多系统都是由多个组件组合起来对外提供服务。组件内部要依赖库文件,组件之间也有复杂的依赖关系。一套复杂的系统部署起来依赖的处理是非常重要的。组件以及依赖关系的更新,要能以增量的形式进行,并形成不同的版本。

 

3、配置管理

 

配置管理记录了项目演进的过程。好的配置管理系统在非常短的时间内能创建出任何的环境;批量更新线上系统的配置信息且能保证更新失败回退到能正常运行的版本;不仅能满足本部门的需求同样也能满足其他部门的需求,以及不同环境之间的需求。

 

4、版本管理

 

在持续交付和持续发布的过程中,任何一个细节都应被记录(操作系统,中间件,代码,配置文件,依赖信息等),并且形成版本。

 

小提示:程序中不要把在不同环境部署时变化的参数写死,推荐使用名称。如:连接外 部数据库地址、用户、密码等信息。 

 

5、持续交付管理

 

在交付的过程中,任何原因都有可能导致部署失败。失败不可怕,可怕的是不知道怎么失败的。明枪易躲暗箭难防道理让我们明白,软件项目的交付要复杂的多,所以建设持续交付系统一定要建立可重复且可靠的部署流水线,较完善的配置管理系统,以及操作审计系统。问题越早发现修复起来的成本越低,且更好地保证成功的发布上线。

 

为何选择使用容器
 
 

 

以Docker为代表的容器技术,在短短的时间内发展迅速。容器技术早在2008年已经出现,Docker公司厉害的是提供了将软件运行环境整体打包的技术-镜像。

 

现实中很多不标准化的交付,使用镜像都可以实现标准化。标准化以后可以更好的实现自动化,并且能更好的促进上游和下游的发展。如:开发、测试、运维之间能更好的协助,践行DevOps文化。

 

持续交付
 
 

 

原则:可重复、可靠;自动化;版本控制;团队责任。

 

1、可重复、可靠

 

镜像将软件的运行环境以及软件代码打包起来,我们可以基于同一个镜像在不同的环境中生成一模一样的环境。因为容器就是进程,所以一个容器中推荐只运行一个服务。对于企业而言单容器是干不成事的,需要利用编排系统将多个镜像编排起来(镜像/版本、应用配置文件、启动优先级设置、日志处理、数据处理等)形成应用模板。通过应用模板可以重复,且可靠的将应用部署到不同的环境中,实现持续交付第一步。

 

 

2、自动化

 

容器技术在持续集成方面不仅仅解决了CI的问题,并且很好的解决了CD。利用容器实现持续交付区别于传统的做法是,原来开发交付出来的都是软件包和安装部署文档;利用容器技术开发人员交付的是应用模板+镜像,应用模板替代了安装部署文档,镜像技术更可靠的完成了软件包和软件运行环境的交付。并利用CI工具实现了,开发人员提交代码到代码库中,通过钩子可自动触发构建镜像。并可以对镜像以及应用做测试。

 

 

3、版本控制

 

容器要比虚拟机更接近应用层,从叫法上来说虚拟机一般都叫虚拟机,但容器大家都会说是MySQL容器,Tomcat容器。容器更加细化到了应用层。上面我们也都说到了,环境的变更,应用的版本或者是底层操作系统以及库的变更都能做到增量式的版本管理。镜像可以通过Tag来实现版本的管理,应用模板、配置文件、依赖关系等信息同样在企业实际应用中应严格要求通过版本来进行管理。

 

 

4、团队责任

 

DevOps不是一种工具,是一种文化。整个持续交付流程能顺利的建立起来,仅依靠一个人或一个部门基本上建立不起来。在我们给中英人寿保险有限公司利用容器建立持续交付系统的过程深刻的感受到,需要让实际业务团队共同的参与,才真正能最大化容器的优势。容器技术是比较先进,但业务不关心先进性,重点看实际效果。所以DevOps不是个人运维或者开发人员的责任,必须是团队的责任。

 

利用容器实现的交付流水线:

 

持续发布
 
 

 

一切皆模板,服务于应用!

 

 

基于容器实现持续发布系统如下:

 

 

注解:

  1. 开发人员将代码提交至代码仓库

  2. 通过钩子自动触发构建镜像流程

  3. 镜像构建完成后,push到镜像仓库Registry

  4. 有新版本进行生成,自动触发部署流程,部署至测试环境

  5. 测试工作完成后,标记镜像状态为成功,自动触发部署至准生产环境

  6. 准生产环境测试完成后,可自动或半自动部署业务

 

Q&A
 
 

 

Q1:国内代码提交,担心代码泄露,这个问题有考虑怎么解决吗?

A1:代码存放到企业私有代码库中。

 

Q2:张老师好,镜像比较大时,部署怎么解决速度问题?

A2:镜像大有几种原因:1.base镜像大;2.安装的软件没清除;3.构建镜像时下载软件用wget,不用add,这几步做好镜像大小能控制住。另外镜像要规划好,利用好镜像的分层技术。

 

Q3:构建镜像时,wget和add的区别?为什么用wget?

A3: 每条Dockerfile会生成一层,镜像是只读的。如使用add来下载软件包,然后在安装,软件包删除不了,处于不同层!使用RUN可以用wget下载后,安装,再删除,是同一层执行的操作!

原文发布时间为:2016-11-30

本文来自云栖社区合作伙伴DBAplus

相关文章
|
16天前
|
供应链 安全 Cloud Native
阿里云容器服务助力企业构建云原生软件供应链安全
本文基于2024云栖大会演讲,探讨了软件供应链攻击的快速增长趋势及对企业安全的挑战。文中介绍了如何利用阿里云容器服务ACK、ACR和ASM构建云原生软件供应链安全,涵盖容器镜像的可信生产、管理和分发,以及服务网格ASM实现应用无感的零信任安全,确保企业在软件开发和部署过程中的安全性。
|
26天前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
63 3
|
1月前
|
机器学习/深度学习 数据采集 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用
|
2月前
|
Kubernetes 监控 数据中心
容器化与微服务:构建高效开发环境的双剑合璧
【10月更文挑战第20天】本文探讨了容器化技术(如Docker和Kubernetes)与微服务架构的结合,如何共同构建高效、灵活的开发环境。容器化解决了环境一致性、快速部署和资源隔离的问题,而微服务架构则提升了系统的可维护性和可扩展性。通过容器编排工具、CI/CD流程和服务网格,两者的结合进一步优化了开发和运维效率。文章还分享了实施这两项技术的最佳实践和职业心得。
|
2月前
|
Kubernetes Cloud Native 云计算
云原生之旅:构建你的第一个容器化应用
【8月更文挑战第75天】在数字化浪潮中,云原生技术成为推动企业创新和效率提升的关键动力。本篇文章将引导你开启云原生之旅,通过一个简易的步骤指南,帮助你构建并部署第一个容器化应用。我们将一起探索Docker容器的魅力,以及如何利用Kubernetes进行集群管理,实现服务的自动化部署、扩展和管理。无论你是云原生新手还是希望深化理解,这篇文章都将为你提供实践操作的启示和深入思考的契机。
|
2月前
|
监控 Kubernetes 测试技术
掌握Docker网络模式:构建高效容器通信
【10月更文挑战第3天】本文深入探讨了Docker的网络模式,包括它们的工作原理、使用场景以及如何配置和优化容器间的通信。希望能够帮助开发者在项目中有效地应用Docker网络模式,构建高效的容器化应用。
|
2月前
|
运维 Kubernetes 开发者
构建高效后端服务:微服务架构与容器化技术的结合
【10月更文挑战第18天】 在数字化转型的浪潮中,企业对后端服务的要求日益提高,追求更高的效率、更强的可伸缩性和更易于维护的系统。本文将探讨微服务架构与容器化技术如何结合,以构建一个既灵活又高效的后端服务体系。通过分析当前后端服务面临的挑战,介绍微服务和容器化的基本概念,以及它们如何相互配合来优化后端服务的性能和管理。本文旨在为开发者提供一种实现后端服务现代化的方法,从而帮助企业在竞争激烈的市场中脱颖而出。
33 0
|
2月前
|
运维 Kubernetes 监控
掌握Docker容器化技术:构建、部署与管理的高效实践
【10月更文挑战第14天】掌握Docker容器化技术:构建、部署与管理的高效实践
92 0
|
2月前
|
运维 JavaScript Linux
容器内的Nodejs应用如何获取宿主机的基础信息-系统、内存、cpu、启动时间,以及一个df -h的坑
本文介绍了如何在Docker容器内的Node.js应用中获取宿主机的基础信息,包括系统信息、内存使用情况、磁盘空间和启动时间等。核心思路是将宿主机的根目录挂载到容器,但需注意权限和安全问题。文章还提到了使用`df -P`替代`df -h`以获得一致性输出,避免解析错误。
|
3月前
|
网络协议 安全 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基础知识,包括网络驱动、端口映射和命名等核心概念,并深入探讨了 Bridge、Host、Overlay 和 Macvlan 四种网络类型的特点及应用场景。此外,还提供了创建、连接、查看和删除自定义网络的命令示例,以及高级网络配置方法,如网络命名空间、DNS 解析和安全通信配置,帮助开发者构建更健壮的容器化应用。