微服务、容器、DevOps的三角恋

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 微服务、容器、DevOps的三角恋

容器的普及,带来了微服务架构和DevOps的高速发展。

1 微服务的弊端

1.1 测试、发布工作量剧增

单体应用拆分成多个微服务后,虽能实现快速开发迭代,但带来更大测试和运维部署的成本。

很多业务早期就是一个大的单体Web应用,测试和运维时,只需把Web应用打WAR包,部署到Tomcat完事

拆成微服务后,很多业务需求就需同时修改多个服务的代码,那么这些服务都要打包、测试和发布上线,还要测试这些服务接口的功能,最后发布上线多个系统,测试和运维工作量增都剧增。这个时候就需要有办法能够减轻测试和运维的负担,我在上一讲给出的解决方案是DevOps。

DevOps可理解为开发和运维的结合,服务的开发者不再只负责服务的代码开发,还要负责服务的测试、上线发布甚至故障处理等全生命周期过程,就能把测试和运维从微服务拆分后所带来的复杂工作中解放。

DevOps要求开发、测试和发布流程自动化,这就需保证开发人员将自己本地部署测试通过的代码和运行环境,能够复制到测试环境,测试通过后再复制到线上环境发布。虽然看上去就是复制代码,但实际上本地环境、测试环境及线上环境往往是隔离,软件配置环境差异很大,导致开发、测试和发布流程割裂。

1.2 机器初始化复杂度剧增

弹性扩缩容时不同微服务所要求软件运行环境差异带来的机器初始化复杂度的提升。拆分后的微服务相比原来大单体应用更灵活,经常要根据实际访问量做在线扩缩容,而且通常会采用在公有云上创建的ECS扩缩容。

这又给运维带来挑战,因为公有云上创建的ECS通常只包含基本os环境,微服务运行依赖的软件配置等需运维单独初始化,因不同微服务的软件配置依赖不同,比如Java服务依赖JDK,就需在ECS安装JDK,而且可能不同微服务JDK版本也不同,服务部署的初始化工作十分繁琐。


2 还好有你:容器

容器技术解决了本地、测试、线上环境的隔离,解决部署服务初始化繁琐的问题。

容器,即Container可翻译成集装箱,在港口把货物用集装箱封装起来,然后经过货轮从海上运输到另一个港口,再在港口卸载后通过大货车运送到目的地。如此货物便可在任何地方流转时,都封装在集装箱,无需根据是在货轮还是大货车而对货物重新装配。

软件的容器也就这么个作用,它封装的是软件的运行环境。容器本质是Linux里的进程,但容器通过Namespace和Cgroups,可有自己的root文件系统、网络配置、进程空间,甚至自己的用户ID空间,如此容器里的进程就像运行在宿主机上的另外一个单独的os内,从而实现与宿主机os里运行的其他进程隔离。


Docker即是基于Linux内核的Cgroups、Namespace实现进程的封装和隔离。

虽然容器解决了应用程序运行时隔离问题,但要想实现应用能从一台机器迁移到另外一台机器上还能正常运行,就必须保证另外一台机器上的os一致,而且应用程序依赖的各种环境也必须一致。Docker镜像就解决了这个痛点。

即Docker镜像不仅可打包应用程序本身,而且还可打包应用程序的所有依赖,甚至包含整个os。这样在本机上运行通过的应用程序,就可使用Docker镜像把应用程序文件、所有依赖的软件以及os都打包成一个镜像,可在任何一个安装了Docker的地方运行。


Docker镜像解决了DevOps中微服务运行的环境难以在本地环境、测试环境以及线上环境保持一致的难题。如此一来,开发就可以把在本地环境中运行测试通过的代码,以及依赖的软件和操作系统本身打包成一个镜像,然后自动部署在测试环境中进行测试,测试通过后再自动发布到线上环境上去,整个开发、测试和发布的流程就打通了。


无论使用内部物理机还是公有云的机器部署服务,都可利用Docker镜像封装微服务运行环境,从而屏蔽机器内部物理机和公有云机器运行环境的差异,实现同等对待,降低运维复杂度。


3 微服务容器化实践

Docker解决了服务运行环境迁移问题,因为在使用Docker镜像时并非把业务代码、依赖的软件环境以及os直接打包镜像,而是利用Docker镜像的分层机制,在每层编写Dockerfile逐层打包镜像。

因为虽然不同微服务依赖的软件环境不同,但还是存在相同,因此打包Docker镜像时,可以分层设计、逐层复用,减少每层镜像文件大小。

4 业务案例

看看生产环境如何使用Docker镜像。某Docker镜像分为四层。

image.png

  • 基础环境层
    定义操作系统运行的版本、时区、语言、yum源、TERM等
  • 运行时环境层
    定义了业务代码的运行时环境,比如Java代码的运行时环境JDK的版本。
  • Web容器层
    定义了业务代码运行的容器的配置,比如Tomcat容器的JVM参数
  • 业务代码层
    定义了实际的业务代码的版本,比如是V4业务还是blossom业务。

如此每层镜像都基于上层添加新内容,比如V4业务的Dockerfile

FROM registry.intra.xxx.com/xxx_rd_content/tomcat_feed:jdk8.0.40_tomcat7.0.81_g1_dns
ADD confs /data1/confs/
ADD node_pool /data1/node_pool/
ADD authconfs /data1/authconfs/
ADD authkey.properties /data1/
ADD watchman.properties /data1/
ADD 200.sh /data1/xxx/bin/200.sh
ADD 503.sh /data1/xxx/bin/503.sh
ADD catalina.sh /data1/xxx/bin/catalina.sh
ADD server.xml /data1/xxx/conf/server.xml
ADD logging.properties /data1/xxx/conf/logging.properties
ADD ROOT /data1/xxx/webapps/ROOT/
RUN chmod +x /data1/xxx/bin/200.sh /data1/xxx/bin/503.sh /data1/xxx/bin/catalina.sh
WORKDIR /data1/xxx/bin

FROM代表上层镜像文件为tomcat_feed:jdk8.0.40_tomcat7.0.81_g1_dns”,可见该层包含了Java运行时环境JDK和Web容器Tomcat及Tomcat版本和JVM参数等

ADD,即要在该层镜像添加的文件,主要包含业务的代码和配置

RUN,该层镜像启动时需要执行的命令

WORKDIR,该层镜像启动后的工作目录。如此便可通过Dockerfile基于上层镜像完成该层镜像制作

5 总结

正是因为Docker可做到一处通过、到处运行,对业务价值极大,解决了以前应用程序在开发环境、测试环境及生产环境间移植难,提高了运维自动化水平,也为DevOps理念的流行和业务上云提供了基础。

当然Docker也会带来新问题,如旧的针对物理机的运维模式就无法适应了,需要一种新的针对容器的运维模式。

目录
相关文章
|
2月前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
2月前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
128 24
|
2月前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
181 6
|
2月前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器化到微服务
本文将带领读者踏上云原生的旅程,深入探讨容器化和微服务架构的概念、优势以及它们如何共同推动现代软件的发展。我们将通过实际代码示例,展示如何在Kubernetes集群上部署一个简单的微服务应用,并解释相关的配置和操作。无论你是云原生新手还是希望深化理解,这篇文章都将为你提供有价值的见解和实操指南。
|
3月前
|
Kubernetes Cloud Native 开发者
云原生入门:从容器到微服务
本文将带你走进云原生的世界,从容器技术开始,逐步深入到微服务架构。我们将通过实际代码示例,展示如何利用云原生技术构建和部署应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和启示。
|
3月前
|
Kubernetes Cloud Native 持续交付
容器化、Kubernetes与微服务架构的融合
容器化、Kubernetes与微服务架构的融合
64 1
|
3月前
|
运维 Kubernetes Docker
深入理解容器化技术及其在微服务架构中的应用
深入理解容器化技术及其在微服务架构中的应用
89 1
|
3月前
|
弹性计算 运维 开发者
后端架构优化:微服务与容器化的协同进化
在现代软件开发中,后端架构的优化是提高系统性能和可维护性的关键。本文探讨了微服务架构与容器化技术如何相辅相成,共同推动后端系统的高效运行。通过分析两者的优势和挑战,我们提出了一系列最佳实践策略,旨在帮助开发者构建更加灵活、可扩展的后端服务。
|
3月前
|
Cloud Native 云计算 Docker
云原生技术的崛起:从容器化到微服务架构
云原生技术的崛起:从容器化到微服务架构
|
3月前
|
Cloud Native API 持续交付
云原生之旅:从容器到微服务的演进之路
【10月更文挑战第39天】在这篇文章中,我们将一起探索云原生技术的奥秘。通过浅显易懂的语言和生动的比喻,我们将了解云原生技术如何改变软件开发的世界。文章将带领读者从容器的基本概念出发,逐步深入到微服务架构的实践,揭示这些技术如何助力现代应用的快速迭代与可靠部署。准备好,让我们启程进入云原生的精彩世界吧!