分布式系统的部署问题

大多数Web服务都是运行在Linux系统之上,因为Linux开源、免费、安全、稳定等等。Linux计算机的架构大致如图:

Linux计算机架构

  • 计算机硬件:例如CPU、内存、磁盘等。
  • 系统内核:所有Linux发行版的内核都是Linux。内核可以与计算机硬件交互,对外提供内核指令,用于操作计算机硬件。
  • 系统应用:操作系统本身提供的应用、函数库。这些函数库是对内核指令的封装,使系统用起来更加方便。

应用与Linux计算机交互过程大致为:

  1. 应用调用操作系统应用(函数库),实现各种功能。
  2. 系统函数库是对内核指令集的封装,会调用内核指令。
  3. 内核指令操作计算机硬件。

Linux的发行版有很多很多,例如Debain、Ubuntu、CentOS等等。虽然这些都是属于Linxu系统(基于Linux内核),但是它们的操作系统不同,可能会导致软件无法从一个Linux系统移植到另一个Linux系统上。例如,在Ubuntu上运行的软件不一定能移植到CentOS上。

在系统内核相同的情况下,一个应用无法从一个系统移植到另一个系统运行的原因是:不同操作系统提供的系统应用有所不同,那么相应的函数库也会有所差异。软件移植到另外一个系统,由于某些函数库不匹配或不存在,导致软件无法运行。

并且在使用微服务这种分布式架构中,服务是部署在多台服务器上的,每个服务都有它自己依赖的组件和环境等,而它们运行的环境不一定一致,就容易出现各种问题。例如服务部署时所需的函数库、依赖各不相同,有时还会出现冲突。这些都给部署造成很大的麻烦。


Docker 简介

Docker就是用来解决这些部署时产生的问题。

Docker是一款运行在Linux上的软件,它使用的是Linux内核来分隔进程,让各进程能相互独立运行。并且通过这种独立性,封装成一个个独立的容器。每个容器可以当作是一个独立的运行环境。Docker还提供了基于镜像的部署模式,可以将容器打包成镜像,或者通过镜像创建容器。在Docker中的两个基本概念:

  • 镜像Image):Docker将应用程序及其所需的Libs(函数库)、Deps(依赖)、配置等文件(包括应用)打包在一起,称为镜像。这个镜像包含了应用运行所需的完整环境配置。

    一切应用最终都是代码组成,都是硬盘中的一个个的字节形成的文件。只有运行时,才会加载到内存,形成进程。镜像就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的文件包。这个文件包是只读的。

  • 容器Container):镜像中的应用程序运行后形成的进程就是容器。Docker会给容器进程做隔离,对外不可见,避免应用之间互相打扰,防止不同依赖之间的冲突。

    容器就是将这些文件中编写的程序、函数加载到内存中运行,形成进程,只不过要隔离起来。因此一个镜像可以启动多次,形成多个容器进程。

    Docker容器就像是使用镜像安装完成的、可以运行的操作系统。当然Docker容器跟操作系统也并不一样,但是使用起来差别不大。

Docker和虚拟机的差别如下:

  • 虚拟机(Virtual Machine):在操作系统中模拟硬件设备,然后运行另一个操作系统。
  • Docker:仅仅是封装函数库,并没有模拟完整的操作系统。

Docker和虚拟机的架构

特性 Docker 虚拟机
性能 接近原生 性能较差
硬盘占用 较小,一般为MB 较大,一般为GB
启动 较快,一般为秒级 较慢,一般为分钟级

Docker是一个CS架构的程序,由两部分组成:

  • 服务端Server):Docker守护进程,负责处理Docker指令,管理镜像、容器等。
  • 客户端Client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。
  • 仓库Repository):仓库可看成一个代码控制中心,用来保存镜像。

其架构如图所示:

Docker程序架构