Docker技术浅谈:私有化部署的优势以及在顶象内部的应用实践

2017-11-21|小象 4086

顶象全景式业务安全风控体系基于新一代风控体系构建,并采用Docker技术进行私有云和公有云部署。本文主要和大家分享下Docker容器技术和顶象风控系统私有化部署的优势以及Docker容器技术在顶象内部的应用实践。

undefined

Docker容器技术概述

Docker是一个开源的容器引擎,Docke是以Docker容器为资源分割和调度的基本单位,封装软件的运行时环境,用于快速构建、发布、运行分布式应用的平台。

Docker容器本质上是宿主机上的进程,通过namespace实现资源隔离,通过cgroups实现资源限制,通过写时复制(copy-on-write)实现高效的文件操作。容器是应用程序层的一个抽象,将代码和依赖关系打包在一起。 多个容器可以在同一台机器上运行,并与其他容器共享操作系统内核,每个容器在用户空间中作为孤立进程运行。

undefined

图自官网

Docker引擎包含Docker守护进程(Docker daemon,dockerd 命令)、REST API和Docker客户端(docker 命令)。Docker采用 C/S架构,Docker客户端与Docker守护进程通信,Docker守护进程负责构建,运行和分发Docker容器。 Docker客户端和守护进程可以在同一个系统上运行,也可以将Docker客户端连接到远程的Docker守护进程。 Docker客户端和守护进程使用REST API通过UNIX套接字或网络接口进行通信。Docker容器基于开放标准,可运行在所有主要Linux发行版,Microsoft Windows以及包括虚拟机,裸机和云上的任何基础架构上。

技术优势

Docker能够将应用程序与基础架构分离,从而可以快速交付软件。使用Docker,可以像管理应用程序一样管理基础架构。宿主机不需要去关心某一个容器运行所需要的依赖,只要它可以运行Docker,那么它就可以运行所有的Docker容器,容器将软件与其周围环境隔离开来,并有助于减少在同一基础架构上运行不同软件的团队之间的冲突。

Docker容器实现了应用环境的标准化,我们可以为不同应用、及其不同的版本制作各自的镜像,实现持续集成、应用的快速交付、应用快速更新与回滚。Docker的镜像存储采用分层的形式,不同的 Docker 容器共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率,通过合理的镜像构建方式,镜像所需的存储空间并不会随着镜像的数量而线性增长。在Docker的官方镜像仓库Docker Hub上,我们能找到100,000+的镜像,经镜像仓库的统一管理,我们只需要pull其镜像,然后通过run命令就可以快速搭建起所需的环境、部署应用。而基于Docker提供的Dockerfile,我们可以在基础镜像上自由地构建自己所需的镜像。

相较于以往的基于虚拟机部署,Docker容器更加轻量化并具备可移植性,并且不需要考虑外部的依赖问题,就像Java “Write once,run anywhere”的特性一样,JVM屏蔽了不同平台的差异性,而Docker所提出的 “Build once,Run anywhere,Configure once,Run anything”体现了其更加便捷、部署成本更低的特性,不仅能够有效屏蔽操作系统之间的差异,对于混合部署又能够屏蔽其他应用可能出现的影响,间接保证了应用的高可用,提高了资源的利用率。

Docker容器编排与集群管理

当Docker容器逐渐增多,应用的依赖关系变得复杂,依赖需要多个组件时,就可以使用Docker容器的编排。编排是一个广义的概念,它是指容器调度、集群管理和可能其他主机供应配置。为此,Docker提供了容器集群快速编排的Compose与Swarm工具。Compose是定义、运行多容器、多服务和Swarm集群配置的应用编排程序(Define application stacks built using multiple containers, services, and swarm configurations.),使用YAML文件来配置应用程序的服务,然后通过命令创建并启动配置中所有服务,实现快速部署。

当应用被扩展到多台宿主机,管理每个宿主系统和抽象化底层平台的复杂性变得更有挑战。Swarm作为容器集群的管理工具,可以很容易地部署跨主机的容器集群服务,Compose本身不支持跨主机管理容器,因为它的实现中只能连接一个docker client。Swarm把多个主机的docker engine集群抽象成一个虚拟的Docker主机。在集群中一个应用或者组件发现其运行环境以及其它应用或组件的信息通过服务发现实现,通常是key/value存储,例如Consul、Etcd、ZooKeeper等。Docker1.12及之后的版本已内置SwarmKit,这是一个Swarm的升级项目,在SwarmKit中内置key/value存储,通过构建Swarm集群,在上面就可以把任务负载到不同的机器上。Swarm集群中,节点有两种角色,manager和worker。manager节点通过实现Raft一致性算法来管理全局的集群状态,再配合Compose YML V3的语法可以方便对所有应用的配置管理,高效实现跨主机的容器编排与集群管理。

顶象风控系统的私有部署,除了考虑业务和用户数据的安全问题,还考虑了基础设施的依赖和隔离、快速部署交付、更新等,保证所有组件和服务都可快速的弹性扩容,既满足小范围的测试与业务起步阶段,也可以动态扩容适应业务发展,实现高QPS的支撑。

Docker容器技术在顶象内部的应用

目前Docker容器技术已在顶象内部大规模推行,所有应用均通过Docker容器实现部署、交付与更新。在此列举几个简单的实践例子:

1. 在一个Docker容器中,通常我们只运行一个应用,当使用容器编排时,不同应用的启动时间不同,同时耗费的时间又会与机器的性能有关,在docker-compose的YML文件中, depends_on, links等参数可以控制服务的启动顺序,但是实际上并不知道容器内的应用是否完成启动,当一个服务必须要依赖另一个服务时就需要控制它们之间容器启动的时间间隔,或者在启动应用的命令中预留等待的时间,也可以对两个服务分别编排启动。

2. Compose在镜像的制作上也很方便,YML中提供了build参数用于指定Dockerfile的路径,image参数指定镜像的名称,docker-compose提供了build、push、images等命令可以为所有的应用批量制作镜像,或指定service名称,为单个服务制作镜像。同时YML支持环境变量,通过Linux export命令设置环境变量可以动态地调整参数,而docker-compose config命令则可以检查YML文件的正确性、预览最终的文件内容。

3. Docker容器日志输出的是控制台的日志,保存在/var/lib/docker/containers下以容器ID命名的目录中,在大多数情况下,我们只需要将必要的日志内容输出到文件中,再挂载到宿主机,对此可以屏蔽一些输出到控制台的日志以减小磁盘空间的占用,同时docker run提供了参数 --log-opt 可以用于控制日志大小,在Compose中则有logging max-size相关参数。

4. Docker提供了bridge、host、overlay、container等网络模式,在实际的使用中经常会有跨主机容器访问通信的场景,选择不同的网络模式、合理分配应用的部署可以提高应用的性能。

5. 通过Jenkins搭建持续集成环境,自动构建代码,可以快速把应用打包成镜像并自动部署,将构建结果发送到Sonar, 展示单测覆盖率,代码基本bug检测,并把失败的构建以邮件方式通知相关的开发人员,对需要发布的镜像推送到镜像仓库。基于Docker私有仓库,应用的发布更新从仓库中获取镜像分发,对不同版本的容器区别命名,保留旧版本容器方便及时回滚。 

* 更多业务安全类的技术分享,请关注顶象官方博客:https://www.dingxiang-inc.com/blog 

400-8786-123