学习番外:Docker和K8S理解
场景一:程序员A写的程序代码基于Linux操作系统,且在开发环境中设置好了依赖项和配置。此时他需要将自己的代码部署到Centos操作系统的空白服务器,他要面临两个问题,第一,操作系统不一致如何保证代码可以运行?第二,部署在新的服务器上又需要各种依赖项和配置,太麻烦了。
场景二:程序员A写了一个程序并成功运行,程序员B想直接在A的基础上继续开发,结果当B获得A的代码之后发现在他自己的环境中无法运行。
首先要弄明白这个环境是什么?环境其实就是操作系统和程序代码所需要的依赖库以及各种配置。
以上两个场景都可以归结为:程序代码开发运行部署过程中怎样弱化依赖项和配置与操作系统影响?
解决思路为:程序和环境一起打包,给到其他运行服务器。
由此,Docker就诞生了,Docker就是这样一款可以将程序和环境打包的工具软件。
那么它具体是怎么实现的呢?
首先构建基础镜像Base image,操作系统分为用户空间和内核空间,而程序运行在用户空间,为了轻量化直接阉割操作系统取用户空间,以及对应操作系统的文件系统和依赖库,这三者形成基础镜像。
为了简化部署过程中安装各项依赖以及配置的操作,编写Dockerfile将各操作提前写好后直接运行docker build进行构建即可安装好环境与代码。
但是又会面临一个问题:如果有很多服务器要部署,是否每次都是本机做好镜像后传送镜像和Dockerfile给各服务器呢?如果服务器非常多,很考验本机的网络带宽。于是,参考github做法,可以基于Docker Registroy的能力建立镜像仓库,比如官方镜像仓库Docker Hub,非官方仓库如清华的镜像仓库Tuna等。
目的服务器从镜像仓库拉取镜像之后运行,这样的程序代码以及环境运行起来了就形成容器。
程序员写了很多容器用来存储相关的服务,比如他写了一个博客系统,主要有三个容器,分别为数据库服务、身份验证服务、博客Web服务,但是这三个容器启动的顺序是有要求的,要先启动数据库服务再启动身份验证服务最后再启动博客Web服务。
这个场景要解决的问题就是一套服务的多个容器在一个服务器上的部署问题。为了方便管理容器部署顺序以及给各容器分配内存计算资源等,一般写一个yaml文件对此信息进行统一管理,也就是Docker Compose功能。
利用Docker Compose功能,这个程序员终于将一套服务部署在一个服务器上了,此时他又遇到一个问题,由于这个服务器时不时会宕机且他的应用程序太火爆了访问的人数很多,部署在一台服务器已经无法满足高可用的要求了,于是他想着将此服务部署在多台服务器上形成灾备和高可用。此时他又面临一个问题,每一台服务器都手动去部署吗,他如何实现一台服务器宕机时立马转移到另一台服务器上?这个场景要解决的问题就是,应用程序在服务器集群部署并且实现实时迁移和动态扩缩容。要解决这个问题可以使用Docker swarm,它是对一整套服务在多个服务器集群进行部署且实现实时迁移和动态扩缩容的工具。而其实,这也是K8S的功能,即容器编排引擎。
说到这里终于引出了K8S,其实K8S的Pod实际是多个Container组成的一整套服务,K8S通过控制平面的管理节点来编排管理调度Node节点的多个Pod的过程,就相当于Docker swarm的功能。
学到这里,终于可以自信得说自己对一些概念的理解了!下一篇文章我将以一个程序员的视角来将这些概念串联起来,通过讲清楚遇到的困境以及对应的解决方法来将各个知识串联起来。请关注我!