1.Docker容器的历史介绍

Docker 是基于 Go 语言实现的开源容器项目。它诞生于 2013 年年初,最初发起者是dotCloud 公司 。

Docker 项目已加 入 Linux 基金会,并遵循 Apache 2 . 0 协议, 全部开源代码均在 https: //github . com/docker 项目仓库进行维护 。 在 Linux 基金会最近一次关于“最受欢 迎的 云 计算开源项目”的调查中, Docker 仅次于 2010 年发起的 Open Stack 项目,并仍处于上升趋势 。2014 年, Docker 镜像下载数达到了 一百万次, 2015 年直接突破十亿次, 2017 年更是突破了惊人的百亿次。

Docker 的构想是要实现“ Build , Ship and Run Any App, Anywhere ”,即通过对应用的封装( Packaging )、分发( Distribution )、部署( Deployment )、运行( Runtime )生命周期进行管理,达到应用组件级别的“一次封装 ,到处运行” 。 这里的应用组件, 既可以 是一个 Web 应用、一个编译环境,也可以是一套数据库平台服务,甚至是 一个操作系统或集群 。

与大部分新兴技术的诞生一样, Docker 也并非“从石头缝里蹦出来的”,而是站在前人的肩膀上 。 其中最重要的就是 Linux 容器( Linux Containers, LXC )技术 。 IBMDeveloper Works 网站关于容器技术的描述十分准确:“容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资惊使用需求 。 与虚拟化相
比,这样既不需要指令级模拟,也不需要即时编译 。 容器可以在核心 CPU 本地运行指令,而不需要任何专门的解释机制 。 此外,也避免了准虚拟化( para-virtualization )和系统调用替换中的复杂性 。 ”当然, LXC 也经历了长期的演化 。 最早的容器技术可以追溯到 1982 年 l-Jnix 系列操作系统上的 chroot 工具(直到今天,主流 的 Unix 、 Linux 操作系统仍然支持和带有该工具) 。 早期的容器实现技术包括 Sun Solaris 操作系统上的 Solaris Containers ( 2004 年发布), FreeBSD操作系统上的 FreeBSD jail ( 2000 年左右发布),以及 GNU/Linux 上的 Linux-VServer (http ://
linux -vse凹er.org, 2001 年 10 月)和 OpenVZ (http://openvz.org, 2005 年) 。在 LXC 之前,这些相关技术经过多年的演化已经十分成熟和稳定,但是由于种种原因,它们并没有被很好地集成到主流的 Linux 内核中,使用起来并不方便 。 例如,如果用户要使用 OpenVZ 技术,需要先于动给操作系统打上特定的内核补丁方可使用,而且不同版本并不一致 。 类似的困难造成在很长一段时间内这些优秀的技术只在技术人员的小圈子中交流 。后来 LXC 项目借鉴了前人成熟的容器设计理念,并基于一 系列新引人的内核特性,实现了更具扩展性的虚拟化容器方案 。 更加关键的是, LXC 终于被集成到到主流 Linux 内核中,进而成为 Linux 系统轻量级容器技术的事实标准 。 从技术层面来看, LXC 已经趟过了绝大部
分的“坑”,完成了容器技术实用化的大半历程 。
在 LXC 的基础上, Docker 进一 步优化了容器的使用体验,让它进入寻常百姓家 。 首先,Docker 提供了各种容器管理工具(如分发、版本、移植等),让用户无须关注底层的操作,更加 简单明了地管理和使用容器;其次, Docker 通过引人分层文件系统构建和高效的镜像机制,降低了迁移难度,极大地改善了用户体验 。 用户操作 Docker 容器就像操作应用自身一
样简单 。
早期的 Docker 代码实现是直接基于 LXC 的 。 自 0.9 版本开始, Docker 开发了 libcon­tainer 项目作为更广泛的容器驱动实现,从而替换掉了 LXC 的实现 。 目前, Docker 还积极推动成立了 rune 标准项目 ,井贡献给开放容器联盟,试图让容器的支持不再局限于 Linux 操作系统,而是更安全 、更开放、更具扩展性 。简单地讲,读者可以将 Docker 容器理解为一种轻量级的沙盒( sandbox ) 。 每个容器内运行着一个应用,不同的容器相互隔离,容器之间也可以通过网络互相通信 。 容器的创建和停止十分快速,几乎跟创建和终止原生应用 -致;另外,容器自身对系统资源的额外需求也十分有限,远远低于传统虚拟机 。 很多时候,甚至直接把容器当作应用本身也没有任何问题 。笔者相信,随着 Docker 技术的进一步成熟,它将成为更受欢迎的容器虚拟化技术实现,并在云计算和 DevOps 等领域得到更广泛的应用 。

举个简单的例子,假设用户试图基于最常见的 LAMP (Linux+Apache+MySQL+PHP )组合来构建网站 。 按照传统的做法,首先需要安装 Apache 、 MySQL 和 PHP 以及它们各自运行所依赖的环境;之后分别对它们进行配置(包括创建合适的用户、配置参数等);经过大量的操作后,还需要进行功能测试,看是否工作正常;如果不正常,则进行调试追踪,意
味着更多的时间代价和不可控的风险 。 可以想象,如果应用数目变多,事情会变得更加难以处理 。
更为可怕的是, 一旦需要服务器迁移(例如从亚马逊云迁移到其他云),往往需要对每个应用都进行重新部署和调试 。 这些琐碎而无趣的“体力活”,极大地降低了用户的工作效率 。究其根源,是这些应用直接运行在底层操作系统上,无法保证同一份应用在不同的环境中行为一致 。
而 Docker 提供了一种更为聪明的方式,通过容器来打包应用、解藕应用和运行平台 。这意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,无论新旧服务器是否是同一类型的平台 。 这无疑将帮助我们节约大量 的宝贵时间,并降低部署过程出现问题的风险 。

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/basic/docker/2839.html

发表评论

邮箱地址不会被公开。 必填项已用*标注