1. 容器生态系统
Docker 容器能有今天的蓬勃发展,与它生态系统的支持是分不开的。这一套完整的生态系统就是 Docker 发展的基础,为 Docker 提供了一整套技术支持,包括核心技术、平台技术、支持技术。
🍑 核心技术
容器的核心技术是用来支持容器在主机上运行起来的技术,如下图所示
容器规范
虽然 Docker 是最常用的容器之一,但容器不是只有 Docker,还有其他的容器,如 rkt。
为了容器技术能够有更加良好的发展,各个容器技术的开发公司联合成立了 OCI ( Open Container Initiative,开放容器计划)组织。OCI组织的主要目的就是定制一套完整的容器规范,以保证各个容器之间能够兼容。
目前已经发布了两个容器规范,分别是 runtime spec(运行环境规范) 与 image format spec(镜像格式规范),如下图所示。
这两个规范保证了不同公司开发出来的容器能够在不同的环境下运行,保证了容器的可移植性与互操作性。
容器 runtime
容器 runtime 是指容器的运行环境,用来包容容器的运行。
例如,要养一株花,就要给它阳光、空气和水,来营造一个舒适的环境。容器也是一样,想要让它运行起来就要给它相应的环境。
目前有三种主流的容器runtime,如下图所示。
LXC (Linux Containers ) 是一款比较老的容器 runtime,最初 Docker 在 Linux 系统中就是用LXC 作为容器 runtime的,如下图所示👇
rkt 是Core OS 公司开发的容器 runtime, 目前是 Docker 默认使用的容器 runtime, 如下图所示。👇
runC 是 Docker 公司自己专门为 Docker 容器开发的 runtime,与 rkt 一样都是符合 OCI 规范的。
管理工具
管理工具是任何一款应用程序必备的要素,否则将无法对应用进行管理。
例如,开车时,司机需要通过方向盘等来对汽车进行操作,用户则需要通过管理工具来对容器进行操作,如下图所示。
容器的管理工具不仅为用户提供管理界面,还与 runtime 进行交互,所以不同的 runtime 对应不同的管理工具。
LXC对应的容器管理工具是 Ixd。
runC 对应的容器管理工具是 Docker Engine,分为 deamon 与 CLI 两部分。
rkt 对应的容器管理工具是 rktCLI。
定义工具
容器的定义工具用于定义容器的内容与属性,使用户随心所欲地创建自己想要的容器,如下图所示。
Docker Image 就是 Docker 镜像,用户会先根据自己的要求创建一个镜像,再根据配置好的镜像创建出容器。DockerImage 相当于一幅设计蓝图,用户将蓝图规划完成之后,Docker 程序会按照蓝图创建容器。
Dockerfile 是一个文本文件,它包含了在创建镜像时需要使用的命令,这些都是用户事先配置完成的。在创建镜像时,只要指定一个 Dockerfile,Docker 程序就会按照 Dockerfile 中的命令进行镜像的创建。
ACI (App Container Image,应用程序容器镜像)也是一种容器镜像,只不过它是由 CoreOS 公司开发的,专门用于 rkt 容器。
容器仓库
容器仓库并不是用来存放容器的,而是用来存放镜像的。
用户可以将使用过的镜像上传到容器仓库中,下次使用时再从容器仓库中下载需要的镜像,并且仓库中的镜像在一定范围内是共享的。各类容器仓库如图所示。👇
Docker Registry 支持企业自己搭建私有仓库。
Docker Hub 是 Docker 公司为用户提供的公有仓库,里面有许多 Docker 镜像,为广大用户提供了极大的便利。
Quay.io 也是公有仓库,只不过是由红帽(Red Hat)公司提供的。
容器OS
容器 OS(Operating System,操作系统)专门用于容器的运行。
虽然几乎所有的系统都可以通过容器runtime来运行容器,但容器OS比起其他系统更加轻巧,更加适宜容器的运行,容器OS中的容器运行起来更加高效。常见的容器OS如图所示。
🍑 平台技术
在容器普及之前,企业为了便于管理,服务器都是分布式部署,容器平台技术支持容器集群在分布式环境中运行,如图所示。
容器编排引擎
企业根据业务需求随时可能会对容器进行创建、迁移或销毁。容器编排引擎为工程师们提供了更方便的容器集群管理方式。常见的容器编排引擎如图所示。
Docker Swarm 是 Docker 公司于2014年12月发布的容器编排引擎。
Kubernetes 其实是 Google(谷歌)公司早就开发出来的,直到2014年才启用。Kubernetes同时支持 Docker 容器与 rkt 容器,是目前国内企业中最常用的容器编排引擎之一。
Mesos 是一个分布式内核,Marathon 是一个框架,二者结合即可为企业提供完整的容器集群管理引擎。
容器管理平台
容器管理平台与容器编排引擎一样用于管理容器集群,但容器管理平台是位于容器编排引擎之上的平台, 它可以兼容各类容器编排引擎。
容器管理平台将编排引擎的功能抽象化地呈现在Web页面中,使用户的管理方式更加简单。常见的容器管理平台如图所示。
容器PaaS
PaaS (Platform as a Service,平台即服务) 是指将研发平台或环境作为一种服务,通过商业模式提供给用户或企业。
容器 PaaS 就是基于容器的 PaaS,开发人员无须对低层设施进行操作,直接在 PaaS 上进行研发。常见的容器 PaaS 如图所示。
🍑 支持技术
容器支持技术是用来支持容器设备的技术,有了这些技术的支持,容器才能完整地运行并运用到企业中,如图所示。
容器网络
容器运行在物理机中,一台物理机中又可能会有多个容器。
由于业务的架构不同,容器与容器之间或者容器与其他设备之间,都可能需要网络支持,但它们又相互隔离。
容器网络技术的出现解决了各个设备之间复杂的网络问题。常见的容器网络技术如图所示。
Docker Network 是 Docker 容器本身的网络技术,Flannel、Weave与 Calico 都是主流的第三方容器网络技术,企业根据业务的不同需求选择不同的容器网络技术。
服务发现
容器集群是动态的,访问量增大就会自动创建容器,访问量减小就会自动销毁容器,还会根据业务需要进行容器迁移。
在这样一系列的变动之后,业务信息也发生改变,服务发现技术将这些变动之后的最新信息通知客户机,让客户能够准确地访问服务。常见的服务发现技术如图所示。
容器监控
在传统的服务集群中,为确保业务的正常运行,需要对业务进行监控管理。容器集群是动态的,这无疑给容器监控带来了挑战。常见的容器监控工具如图所示。
docker ps/top/stats 是 Docker 自带的命令行形式的监控工具,docker stats API 是通过接口使用户可以获取容器状态的工具。
数据管理
容器集群既然为用户提供服务,就会产生数据,为保证这些数据的安全性,就有了容器的数据管理技术。
数据管理技术可以使容器集群发生变化时,不对持久化数据造成损失,并且完整地保留新的数据。常见的数据管理技术如图所示。
日志管理
在用户访问网站时,Web 服务会将访问信息记录到特定的文件当中,这些文件就是日志文件。
常见的日志管理工具如图所示。
Docker Logs 是 Docker 容器自带的日志管理工具。Logspout 通过容器接口从各个容器中收集日志信息,将收集到的日志信息发送给后续的程序进行处理,最终日志信息被写入日志系统。
容器安全
容器的安全性是企业工程师们时刻要关注的,也是整个企业都需要重视的事情。常见的容器安全工具如图所示。
Docker 本身也是有安全机制的,它通过对资源的限制与对信息的过滤来提高容器的安全性。另外,还有其他的第三方安全工具,如 Docker Bench、Clair 等。
Docker Bench 会按照相关安全规范来对容器进行一系列检查。
Clair 通过对镜像文件的扫描来发现容器的潜在风险。
2. 总结
本篇文章介绍了容器的基本概念、虚拟化技术、Docker容器相对于传统虚拟化技术的优势,以及Docker容器在企业项目中存在的必要性。
我们可以清晰地感受到 Docker 容器在生产环境中带给我们的巨大便利,以及容器对于企业的重要性。