关于docker的理解
[toc]
前言
近年来,云计算的概念席卷了整个 IT 圈。抛开忽悠概念的因素,云计算的发展和应用极大地改变了 IT 产业的研发、运营和管理。作为云计算最重要的核心技术之一,虚拟化技术的发展促成了这一巨大的变革,而容器技术作为最具有代表性的虚拟化技术革新,目前已经得到了业界的广泛关注,其中以 Docker 最具有代表性,最为火爆,鹅厂目前很多应用也或多或少使用到了 docker。
通过上图的分析可以看到,虚拟机和容器技术在隔离的层次上并不相同,虚拟机有从操作系统开始的完整的基础设施,而容器仅在工具、库这个层次及以上形成了自己的特有区域。这个特点决定了两者的属性,容器是比虚拟机更轻量的资源单元。轻量,意味着快速启停、迁移、分发等优良的性质,并且在资源总量一样的情况下,能够支持的容器单元数量将数倍于虚拟机。
WoW,Docker 来了!它是谁?能干嘛?
Docker 是谁?Docker 是由 dotCloud 公司在 2013 年开源的一款开源容器引擎,后来 Docker 火了干脆公司就改名为 Docker 了……
Docker 是一种基于 Linux 内核隔离技术的容器实现,用 Go 语言编写,其功能特性归纳为:
- 资源隔离,包括文件系统、进程、网络等;
- 资源控制;
- 文件系统,具有写时复制、日志记录、版本管理等;
- 提供控制 API;
- 提供镜像分发、重用的生态系统。
Docker 的实现依赖了以下技术:
- Namespace,利用 Linux 内核提供的 namespace 机制,容器能够建立资源隔离单元,隔离内容包括进程(PID)、网络(Net)、进程交互(IPC)、文件目录(Mnt)、hostname 及用户和用户组等。
- CGroup,利用 CGroup 机制来处理不同容器之间竞争宿主机系统资源的问题,实现对资源的配额和度量。
- LXC,在 Docker 发展的过程中,早期使用 LXC 来共享内核,实现容器的快速启停以及减少内存的消耗,在后来的发展中,docker 主键用 libcontainer 替代并扩展了 LXC 的功能。
- AUFS,Docker 默认使用 AUFS 构建容器的文件系统,提供写时复制(Copy On Write)的特性,这是 Docker 镜像保存、修改及分发的基础。
基于 docker 提供的基础功能和其开源的属性,业界巨头和初创公司纷纷以此为基础开发出各种框架和工具,在分布式特性、网络特性、存储特性以及管理特性等方面对 Docker 进行扩展和补充,鹅厂 IEG 内部使用的 Docker 管理平台以及 TEG 的 Gaia 系统都是很好的例子。关于 docker 技术原理的文章能够很容易搜索到,本文就不在这里展开了,下面将根据容器的特点介绍几个典型的应用场景,并给大家介绍如何从零开始写一个简单的基于 Docker 的负载均衡器。
根据前述,Docker 作为一种容器,能够快速启停、占用较少的系统资源,同时根据其自身实现技术特点,又具备写时复制、保存分发等特点。所以不难想到以下几种应用场景很适合使用 Docker 实现:
- 平台即服务(PAAS),沙箱的完美替代品;
- 自动测试及持续集成,测试妹纸笑开了花;
- 构建标准化无状态运行环境及快速部署,你知道重装环境有多么烦么;
- 高可用(HA)和负载均衡(LB)系统,让故障和攻击陷入人民战争的汪洋大海,一会慢慢讲。
夸了那么多,难道 Docker 就没有缺点么?不是的,目前 Docker 正在快速发展过程中,在人们使用的过程中逐渐暴露了 Docker 的很多问题,其中不乏一些很严重的问题:
- 隔离性问题,docker 依赖 Linux 内核提供的隔离机制,相比虚拟机而言,级别和程度都有不少下降,这也是追求轻量带来的副作用
- 安全性问题,跟隔离性分不开,目前 Docker 存在诸如 root 权限提升,共享宿主信息等安全漏洞,这阻碍了其推广到企业级应用的脚步
- 性能问题,由于引入了 AUFS,提供了很好的 COW 特性,但是这也会对 I/O 性能造成一定影响,因此不建议用 docker 负担有状态的任务
- Docker 提供用于镜像分发和重用的生态系统,全球开发者都能够通过这个平台进行交流,但随之而来的就是如何保证镜像的质量、可靠性和安全性,PS.别人做的你敢用?
尽管存在诸多问题,但是这并不妨碍 docker 前进的脚步。业界也在期盼 docker 的快速成长。