简介
什么是docker?
Docker是基于Go语言实现的开源容器项目,诞生于2013年年初,最初发起者是dotCloud公司。
Docker项目已加入了Linux基金会,并遵循Apache2.0协议,全部开源代码 均在https://github.com/docker/docker上进行维护。在Linux基金会最近一次关 于“最受欢迎的云计算开源项目”的调查中,Docker仅次于 2010年发起的 OpenStack项目,并仍处于上升趋势。
Docker的构想是要实现“Build,Ship and Run Any App,Anywhere”,即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件“一次封装,到处运行”的目的。这里的应用组件,既可以是一个 Web应用、一个 编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群。
Linux容器技术(Linux Containers,LXC)
IBM DeveloperWorks网站关于容器技术的描述十分准确:“容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心CPU本地运行指令,而不需要任何专门的解释机制。此外,也避免了准虚拟化(paravirtualization)和系统调用替 换中的复杂性。”
LXC被集成到了主流Linux内核中,进而成为了Linux系统轻量级容器技术的事实标 准。从技术层面来看,LXC已经趟过了绝大部分的“坑”,完成了容器技术实 用化的大半历程。
从Linux容器到Docker
早期的Docker代码实现是直接基于LXC的。自0.9版本开始,Docker开发 了libcontainer项目,作为更广泛的容器驱动实现,从而替换掉了LXC的实 现。目前,Docker还积极推动成立了runC标准项目,试图让容器支持不再局 限于Linux操作系统,而是更安全、更具扩展性。
简单地讲,读者可以将Docker容器理解为一种轻量级的沙盒 (sandbox)。每个容器内运行着一个应用,不同的容器相互隔离,容器之间 也可以通过网络互相通信。容器的创建和停止都十分快速,几乎跟创建和终 止原生应用一致;另外,容器自身对系统资源的额外需求也十分有限,远远 低于传统虚拟机。很多时候,甚至直接把容器当作应用本身也没有任何问 题。
Docker与传统虚拟机技术的比较
核心概念
镜像
Docker镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。
镜像是创建Docker容器的基础。通过版本管理和增量的文件系 统,Docker提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至 可以从网上下载一个已经做好的应用镜像,并直接使用。
容器
Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应 用。容器是从镜像创建的应用运行实例。可以将其启动、开始、停止、删 除,而这些容器都是彼此相互隔离的、互不可见的。
可以把容器看做是一个简易版的Linux系统环境(包括root用户权限、进 程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒 子。
镜像自身是只读的。容器从镜像启动的时候,会在镜像的最上层创建一 个可写层。
仓库
Docker仓库类似于代码仓库,它是Docker集中存放镜像文件的场所。
根据所存储的镜像公开分享与否,Docker仓库可以分为公开仓库 (Public)和私有仓库(Private)两种形式。目前,最大的公开仓库是官方 提供的Docker Hub,其中存放了数量庞大的镜像供用户下载。国内不少云服务 提供商(如时速云、阿里云等)也提供了仓库的本地源,可以提供稳定的国 内访问。
当然,用户如果不希望公开分享自己的镜像文件,Docker也支持用户在 本地网络内创建一个只能自己访问的私有仓库。当用户创建了自己的镜像之 后就可以使用push命令将它上传到指定的公有或者私有仓库。这样用户下次 在另外一台机器上使用该镜像时,只需要将其从仓库上pull下来就可以了。