云原生漫游指南(1)丨先从构建一个容器起步

云原生概念自从2013年首次被提出以后,已经深刻影响到了云计算时代的IT架构变革。

 

云原生不只代表了一系列IT技术,更是一套适用于云计算时代的IT架构与方法论,包括容器化、微服务、DevOps、持续交付等主题。它通过优化应用的架构设计、部署方式和运行方式,让云计算弹性、灵活、自动化的优势得到充分发挥,极大提高了IT系统研发和运维的效率,从而帮助企业将精力更多投入到业务创新之中。

 

在云原生转型的浪潮驱动下,纷繁复杂的新技术和新理念正在不断出现和普及,Docker、Kubernetes、ServiceMesh、Serverless等等。这些技术变革在刷新着我们知识库的同时,也难免会给我们带来一丝恐慌。

 

  • 如何开始云原生转型?
  • 怎样最快实现云原生架构?
  • 都有哪些环节需要充分考虑?

为了降低大家在面对云原生时的“知识焦虑”,我们通过总结众多客户的云原生转型经验,推出了包含9个关键站点的云原生漫游指南。希望可以帮助大家更好地理解云原生,更好地规划自身企业的云原生转型路径。

 

本次文章介绍容器化以及镜像。 Don't panic,请跟随我们一起来!

第一站 

容器化:高内聚、低耦合

 

容器是云原生技术最重要的基石,因此云原生之旅的第一站,是应用的容器化。

 

这也就是将应用开发的产出物构建成容器镜像的格式,从而让应用可以通过容器的方式在任何服务器上进行部署。容器化既影响到应用的开发模式,也影响到应用的打包交付方式。

 

应用容器化交付可以简单描述为三个步骤:

 

  1. 编写和集成应用代码
  2. 创建一个Dockerfile
  3. 对该Dockerfile执行docker image build命令

由于容器镜像本身是一个最小粒度的部署单元,通常更新容器应用时都是对整个镜像进行升级和重新部署,因此单个容器内不建议同时部署过多的服务或相互依赖的组件,以避免镜像过于复杂导致容器部署和更新成本升高。

 

所以在开发阶段就需要考虑如何拆分服务和组件,尽量遵循高内聚、低耦合的设计原则,规划好如何将应用打包到多个不同镜像中交付。

 

此外容器本身具有易于分布式部署和故障转移的特性,因此应用在设计时尽量做到支持并行、计算与存储分离,也能更加充分地发挥出容器化的优势。

 

接下来需要将拆分后的应用分别构建成对应的Docker镜像,Dockerfile是用来描述镜像构成的文本文档,简单来讲就是描述如何一步一步“组装”一个Docker镜像。

 

通常Dockerfile中都会引用一个基础镜像,比如Ubuntu的某个基础版本,然后在这个镜像中逐步执行应用代码的拷贝、编译、启动等命令,下图即是一个最简单的Dockerfile示例:

 

Dockerfile的编写并不复杂,常用的语法只有十多条,但是如何编写一个优雅的Dockerfile是需要一定经验积累的。

 

Dockerfile的开发者可以参考Docker官网的最佳实践,其中有许多设计原则可以参考,比如:利用构建缓存、尽量减少构建层数等等。

 

Dockerfile最佳实践链接: https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

 

当docker imagebuild命令执行完成并将应用程序构建成为docker镜像时,我们的第一站就圆满完成了。

 

第二站

镜像&运行时:速度和安全

 

构建标准的Docker镜像之后,接下来我们需要考虑镜像的存放与运行。如果说构建镜像是云原生大餐中准备食材的过程,那么镜像仓库和容器运行时就是我们的冰箱与锅炉,让我们可以随时取用构建好的镜像。

 

镜像仓库提供的基本能力是容器镜像的上传、拉取和版本管理,用户可以上传镜像到仓库中,并通过不同的版本号(tag)来区分同一个镜像的多次上传。仓库通常还会将镜像分为公共镜像和私有镜像,公共镜像是面向所有用户的,只要知道镜像地址即可拉取,而私有镜像则需要使用特定的访问凭据登录之后,才能拉取或上传新版本。

 

DockerHub是一个由Docker公司运行和管理的基于云的公共镜像仓库,提供了非常丰富的社区镜像可供拉取。

 

但是由于DockerHub的服务器在海外,因此国内拉取这些公共镜像往往速度较慢,百度智能云为用户提供了DockerHub加速器,具体使用方法可以参考百度智能云CCE的产品文档。同时百度智能云也提供了容器镜像仓库服务,从而满足搭建用户专属镜像仓库的需求,提供更加安全的镜像存储和高性能的上传下载。

 

容器镜像从仓库拉取到服务器之后,需要由容器运行时(Container Runtime)来启动。

 

容器运行时实际上是一个基于API的容器生命周期管理工具,提供从容器仓库拉取容器镜像、配置存储和启动容器等能力。容器运行时的启动速度、性能损耗和安全隔离是容器使用者非常关心的问题,因此社区中诞生了很多针对不同场景的容器运行时技术,包括:containerd、CRI-O、RKT、Kata-container等等。

 

为了让这些不同的运行时可以对底层操作系统以及上层的容器编排系统兼容,业界推出了OCI(Open Container Initiative)和CRI(Container Runtime Interface)两套规范,从而让用户的容器镜像可以跨平台运行,并且减少对不同运行时的关注。

 

对于容器的使用者而言,如果不希望在服务器上自行搭建和维护容器运行时,可以使用云上的相关服务,如百度智能云的容器实例(BCI)和边缘计算(BEC),它们分别在云中心和云边缘为用户提供全托管的容器运行时,用户只需要提供容器镜像和启动参数,即可通过这两个服务快速运行和管理容器。

 

后续,我们将继续介绍其他几个关键站点,敬请期待。点击关注百度智能云微信公众号,关注实时动态。

https://mp.weixin.qq.com/s/rEkzsymO2vywvVLbgqWuyg