Skip to content

Docker 从何而来?

本文档介绍了运维工作的进化过程,通过本文你可以了解到 Docker 催生的大概过程。

运维工作进化论:测试环境和生产环境

测试环境

搭建测试环境需要一台服务器、一套 LNMP 应用,更新要用到 FTP。LNMP 是一套由 Linux、Nginx、MySQL 和 PHP 组成的 Web 开发环境,是目前最流行的 PHP 开发环境之一。但是,Nginx 并不能处理动态请求,因此当用户发起动态请求的时候,Nginx 无法像静态请求一样直接返回结果,而是需要通过 fastcgi 协议将请求转发给后端的 PHP 解释器,再由 PHP 解释器处理请求并返回结果。

面临的问题

  • 生产后有了一定程度的流量,需要运营和测试等部门给出数据,根据数据考虑冗余。
  • 防止单点故障,保证业务稳定,做 HA 集群。
  • 节约成本,使用公有云服务器,提前部署。
  • 更新方式太过原始,测试环境使用 git。并搭建使用 gitlab。

原生产环境

  • 多点集群单体应用
  • 公有云
  • git 更新

虚拟化和云计算

  • 物理隔离:2005 年以前,大多数企业采用物理方法,将内网与外网隔离。从而避免入侵或信息泄露的技术手段。保证网络的保密性、安全性、完整性、防抵赖和高可用性。但其资源利用率极低,灵活性差,成本高。
  • 虚拟化:2008 年左右,企业开始使用虚拟化技术,通过硬件和软件,实现物理架构资源的重新整合利用。可以用一台物理机,通过虚拟化,划分为多套系统,在系统之内进行多方位隔离,隔离之后相当于多台服务器。大幅降低了 IT 硬件成本,减少资源浪费,提升了系统的稳定性和安全性。
  • 云计算:2018 年至今,大部分企业开始使用云计算技术。分布式计算技术透过网络将庞大的计算处理程序,自动分拆成无数个子程序。然后,交由多部服务器组成的系统进行搜寻、计算、分析之后,将处理结果回传给用户。

随着运维人员的版本更新频率增加,运维团队熬夜加班,各部门协调不稳定,导致工作人员压力更大,形成了恶性循环。

为了解决上述问题,开发人员做了功能开关。在独立的分支上开发新功能,全部开发测试完成之后,合并到主干。从而减少运维人员的工作压力。与此同时,运维人员通过脚本自动化和 Jenkins 程序,建立了持续集成和持续交付项目。

通过蓝绿发布的方式发布应用,减少发布过程中,服务停止的时间,从而进一步减少工作时间。

蓝绿发布示意图

蓝绿发布是一种持续部署的方式,通过将新版本的服务部署到一个全新的环境中,然后将流量逐渐切换到新环境中,从而实现零停机发布。

运维生产环境的发展

生产环境

生产环境是由多点负载均衡单体应用、混合云、devOps 组成,但是这样会面临很多问题。

  • 资源利用率较低:一个虚拟机运行多个项目,那么资源的治理、迁移、容灾怎么协调?
  • 扩容不及时:脚本化启动 n 台虚拟机要多久?n 个容器要多久?环境部署要多久?风险大不大?
  • 环境不一致导致的问题。

新型生产环境

新型的生产环境是由多点负载均衡单体应用、Docker 和 devOps 组成的。

Docker 于 2013 年初开源,基于 Linux 内核的 cgroup、namespace 和 AUFS 类的 UnionFS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。容器就是一个技术类型,而 Docker 是当下最驻留的一种实现容器的方案。

提示

其他方案包括 LXC、Mesos、RKT 等。容器和传统虚拟化最大的区别就是,虚拟化的封装是系统级的封装,而 Docker 等是进程级的封装。

微服务

微服务就是将前端拆成各个模块,然后连接到服务库。微服务需要跑多个容器,而容器多又涉及到通信、架构、伸缩、更新、监控等问题。

K8S

K8S 是由 Google 设计,基于 Google 内部的 Borg 系统,是一个开源的容器编排引擎。K8S 的核心功能包括:自动化部署、自动化扩展、自动化容器间通信、自动化负载均衡、自动化存储管理、自动化监控、自动化日志管理、自动化故障处理等。

  • 其中,K8S 的自愈功能,是指重新启动失败的容器,在节点不可用的时候,将容器调度到其他节点上。
  • K8S 的弹性伸缩功能,是指根据负载情况,自动增加或减少容器的数量。简单来说,它会监控容器 CPU 的负载,如果这个平均值高于 80%,则会自动增加容器数量,如果低于 10%,则会自动减少容器数量。
  • K8S 的自动发现和负载均衡,不需要修改应用程序来使用不熟悉的服务发现机制。Kubernetes 会自动为容器提供自己的 IP 地址和一个 DNS 名称,其他容器可以使用该名称来发现和通信,借此在容器之间实现负载均衡。
  • K8S 的滚动升级和一键回滚,是指在升级应用程序时,Kubernetes 会逐步将新版本的容器替换旧版本的容器,如果发现新版本的容器有问题,可以通过一键回滚,将新版本的容器替换为旧版本的容器。

K8S 架构图

云原生技术栈的概念和技术

云原生技术栈

云原生是一个生态概念、是一线互联网公司发展到某个极端的必然选择。主要包含三大要素:容器及编排管理微服务DevOps。其主要技术模块有应用定义及部署,编排与管理,运行环境,配置等。

在云原生时代,云原生、容器、devOps 等一定是未来若干年的发展方向。容器不但解决了大型架构的发展瓶颈,而且取代了传统韵味。Docker 是云原生时代的基石和应用基础。学习 Docker 需要一定程度的经验积累,所以现在企业对运维人员的要求也越来越高。

容器

镜像和容器的关系——镜像是静态的定义、是容器的模板,容器是镜像的运行实例。容器可以被创建、启动、停止、删除、暂停等。容器的本质是进程,但是它是被隔离的进程,容器进程运行在自己的命名空间下,与宿主机的进程隔离。

容器存储层的生存周期和容器一样,容器消亡,容器存储层也就随之消亡。因此,任何保存在容器存储层的信息都会随容器删除而丢失。如果需要让容器存储层中的信息持久化,可以通过数据卷(Volume)来实现。

容器和虚拟机架构图对比

容器和虚拟化

虚拟机是一个主机模拟出多个主机,需要先拥有独立的系统。传统的虚拟机,利用 hypervisor 模拟出独立的硬件和系统,在此之上创建应用。Docker 则是在主机系统建立多个应用机器配套环境,把应用和配套环境独立打包成一个单位,是进程级别的隔离。

  • 容器的启动速度快,秒级启动,虚拟机需要分钟级启动。
  • 容器的性能接近原生,虚拟机性能有损耗。
  • 容器内存代价小,虚拟机内存代价大。
  • 容器对磁盘的使用一般是 MB 级别,虚拟机是 GB 级别。
  • 单机支持上千个容器,虚拟机一般几十个。
  • 容器的隔离性属于安全隔离,虚拟机属于完全隔离。
  • 容器的迁移性好,虚拟机迁移性差。

总而言之,容器相比于虚拟机的优势在于,可以再次提高服务器的资源利用率,重量更轻,体积更小,能够匹配微服务的部署需求,保持多环境运行的一致性,快速部署迁移,且容错率高。但是其劣势在于,安全性相对较差,多容器管理有一定的难度,稳定性较差,排错难度大。

Docker底层技术

  • Namespace:命名空间是 Linux 内核的一项功能,它允许进程在隔离的环境中运行,彼此之间无法感知。Docker 利用命名空间实现了容器的隔离性。
  • Cgroups:Cgroups 是 Linux 内核的一个功能,它允许用户限制一个或多个进程的资源使用,如 CPU、内存、磁盘、网络等。Docker 利用 Cgroups 实现了容器的资源限制。
  • rootfs:rootfs 是容器的根文件系统,它包含了容器运行所需的所有文件。Docker 利用 rootfs 实现了容器的文件系统隔离。