分布式系统的部署问题
大多数Web服务都是运行在Linux系统之上,因为Linux开源、免费、安全、稳定等等。Linux计算机的架构大致如图:
- 计算机硬件:例如CPU、内存、磁盘等。
- 系统内核:所有Linux发行版的内核都是Linux。内核可以与计算机硬件交互,对外提供内核指令,用于操作计算机硬件。
- 系统应用:操作系统本身提供的应用、函数库。这些函数库是对内核指令的封装,使系统用起来更加方便。
应用与Linux计算机交互过程大致为:
- 应用调用操作系统应用(函数库),实现各种功能。
- 系统函数库是对内核指令集的封装,会调用内核指令。
- 内核指令操作计算机硬件。
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 | 虚拟机 |
---|---|---|
性能 | 接近原生 | 性能较差 |
硬盘占用 | 较小,一般为MB | 较大,一般为GB |
启动 | 较快,一般为秒级 | 较慢,一般为分钟级 |
Docker是一个CS架构的程序,由两部分组成:
- 服务端(Server):Docker守护进程,负责处理Docker指令,管理镜像、容器等。
- 客户端(Client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
其架构如图所示:
评论