极海云容器化之路

随着业务需求的快速变化和趋于复杂,要求技术架构能够及时调整以适应业务需求。极海云采用了微服务架构来应对这些挑战,将以往复杂且全面的系统被拆分为多个互相关联的微服务,它们之间通过HTTP或者其他网络协议互相协作,从而让我们有能力以服务的粒度对系统个别部分进行调整,提高系统的灵活性,应对快速变化的业务需求。借助微服务,我们不必统一技术栈,只要定义好协作接口。微服务无疑对系统的伸缩性和灵活性有很大的裨益,但同时也带来了一些挑战,技术栈的增多,导致开发、测试和生产环境的依赖也变得多了起来,部署起来也更麻烦,应用程序启动也千差万别,尤其是私有环境部署环境和预期环境不一致时,我们的ops团队就会变得狂躁起来,时间紧,流程多,任务重,就像三座大山一样。那么,有没有可以解决这些问题的技术呢?幸运的是,有!这就是当前正红的容器技术,其中又以docker为当红小生。在这篇文章里,我们就谈一谈docker技术的原委,如何利用docker解决微服务带来的问题。

1. Docker是什么

Docker是一个开源容器项目,可以为应用程序创建一个独立的、不依赖于特定操作系统的,与其他应用程序隔离的运行环境,从而让应用程序开发、布署变得简单。

Docker并没有创新技术,而是创造性的利用Linux现有cgroups、namespace、AUFS等技术,创建独立的软件容器。利用docker,我们可以将应用程序本身、依赖环境,以及配置打包为一个镜像(Image),镜像是一个压缩文件,便于通过网络传输;在部署了docker的环境中,通过 docker run 命令就可以让镜像运行起来,成为容器(container),无需管理其依赖问题。docker还有一些周边的配套设施,例如自动化配置docker运行环境的 docker machine ,管理多个容器之间依赖的 docker compose ,管理容器集群的 docker swarmkubernetes ,这就为docker在容器云领域的流行奠定了基础。

1.1 Docker与虚拟机(VM-Virtual Machine)区别

说到这里,大家肯定会想到虚拟机,在docker出现之前,虚拟机就在这个领域发挥作用。其实,它们两个抽象的层次是不同的,虚拟机是抽象硬件资源,每一个虚拟机实例占用指定数量的CPU、内存、硬盘等资源,这些资源每个虚拟机实例之间不会共享;docker是抽象软件资源,它和Linux上运行的一个应用程序没有多少区别,得益于AUFS,相同的镜像部分占据的资源是共享的,也就是说如果一个镜像启动了多个容器,则只占用一个容器占用的资源,外加AUFS中的可写层(非常少)。这就说明,在部署集群时,docker比虚拟机在资源占用方面更有优势。

另一个不同之处,虚拟机包含系统,所以其启动时间包含系统启动的过程,一般几分钟,而docker镜像启动相当于启动一个进程,往往只需要几秒钟。

1.2 docker与宿主机之间的隔离机制

docker通过Linux的命名空间(namespace)与宿主机进行隔离,命名空间不仅会将docker的进程与宿主机进程隔离,还会对docker和宿主的网络进行隔离,然而,很多时候,容器需要访问宿主机的网络,因此docker提供了四种网络模式:Host、Container、None、Bridge,bridge是docker容器启动的默认网络模式,也就是我们常说的网桥,docker会为每一个启动的容器分配一个IP和mac地址,docker子网通过宿主机的iptables进行转发,例如我们通过 docker run -d 5432:5432 imageName 启动容器,那么访问主机的5432端口,就会转发到相应容器的5432端口。

文件系统的隔离,docker通过libcontainer限制容器对宿主机的真实目录的访问,并将容器的目录映射到docker在宿主机开辟的私有目录,从而使容器既能正常运行,又能实现与宿主机的文件目录的隔离。如果有需要访问宿主机的目录,在启动时可以指定 volume 参数,作用相当于将指定的宿主机目录挂载到容器的指定目录,还可以挂载其他容器的目录(常用于日志收集)。

2. docker全家桶

docker要打造一个生态(可能是效仿乐视),生态主要成员有,自动化配置docker运行环境的docker machine,管理docker镜像的docker registry,管理多个容器之间依赖的docker compose,管理容器集群的docker swarmkubernetes,我们这里就不全介绍了。

2.1 docker compose

docker compose是管理多个容器的工具,主要使用场景是利用docker-compose.yml定义组成app的所有服务以及它们之间的依赖关系,直接在docker-compose.yml所在目录运行 docker-compose up -d ,Compose将启动所有的app,这样就不需要针对每个镜像运行 docker run 启动了。

2.2 docker registry

docker registry用于创建私有仓库服务器,registry本身是一个docker镜像,用来搭建私有仓库,构建好的镜像,可以使用 docker push 来推送自己的镜像到私有仓库,之后就可以 docker pull 命令来下载镜像使用。可以想象docker registry是nodejs中自己搭建的npm私有仓库。

2.3 docker swarm与kubernetes

docker swarm和kubernetes用于管理容器集群,用于构建可以灵活伸缩的云服务场景。docker swarm是docker公司自己构建的一套系统,kubernetes是Google在自己的云服务管理经验之上构建的一套系统,之前一直是竞争状态,可就在最近,docker公司宣布支持kubernetes,估计kubernetes更强大,用户基数大,docker公司不想与用户为敌。

3. docker使用场景

利用docker镜像便于构建、传输、交付的特点,可以利用docker可以做很多事情,比如,构建本地开发环境,持续集成,在一个隔离网络环境内分发镜像。

3.1 docker与本地开发

利用docker的volume参数,将docker宿主机的目录挂载到docker容器指定目录,那么宿主机的相应目录的任意更改将直接反映到容器,无需重新启动容器。这个特性用于开发非常方便,尤其需要复杂依赖的开发,无需配置,直接拉取镜像,启动即可。

3.2 docker与自动部署、持续交付

docker可以与Jenkins结合,构建一个持续集成环境,代码提交到Git仓库,触发Jenkins构建镜像,镜像构建完成推送到registry,并替换掉之前版本的镜像。

4. 容器化给极海的助力

4.1 开发助力

极海是一站式地理大数据云服务提供商,开发的产品表面简单易用,但背后需要复杂的开发环境,往往各个小伙伴分别负责一个产品,不同的产品有不同的依赖,配置开发环境对于负责人来说不难,但对于刚接手或者临时需要开发的小伙伴可就要了亲命!依赖还需要依赖,依赖之间需要配置的情况非常常见,新人入职往往需要三四天的时间配置开发环境~!

极海云各个产品容器化之后,我们便改变了这种现状,新入手一个项目,首先从Git仓库下载代码,然后pull其镜像,使用 volume 参数将代码目录挂载到docker容器,就完成了配置。而且,改变本地目录的代码会直接反映到容器,如果是web应用,那么刷新浏览器之后就可以看到效果。

4.2 私有部署助力

很多极海用户反映使用极海云平台很满意,想要在自己的私有环境部署一套极海云服务,供自己的公司或者机构使用。在以前,由于用户的私有环境安全方面的考虑,不能让外网访问服务器,很多时候我们需要跑一趟,对服务器各种配置,对应用各种配置,期间还会遇到各种没有预期到的问题。现在好了,我们直接给用户一个docker-compose配置文件,用户直接利用docker-compose即可在很短时间内完成部署。

5. 总结

微服务的兴起带来了诸多好处,但同时带来了一些问题,容器化的兴起在很大程度上解决了这些问题,也给我们带来了全新的开发和部署思路。当容器越来越多,如何管理也越发困难,kubernetes便开始在此处发光发热。

我们不断采用新技术,拥抱未来,同时我们也不断踩坑,填坑,不过为了极海的用户们,我们乐此不疲!

庆祝亚运会

继续阅读此作者的更多文章