简介

什么是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与传统虚拟机技术的比较

image

核心概念

镜像

Docker镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。

镜像是创建Docker容器的基础。通过版本管理和增量的文件系 统,Docker提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至 可以从网上下载一个已经做好的应用镜像,并直接使用。

容器

Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应 用。容器是从镜像创建的应用运行实例。可以将其启动、开始、停止、删 除,而这些容器都是彼此相互隔离的、互不可见的。

可以把容器看做是一个简易版的Linux系统环境(包括root用户权限、进 程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒 子。

镜像自身是只读的。容器从镜像启动的时候,会在镜像的最上层创建一 个可写层。

仓库

Docker仓库类似于代码仓库,它是Docker集中存放镜像文件的场所。

根据所存储的镜像公开分享与否,Docker仓库可以分为公开仓库 (Public)和私有仓库(Private)两种形式。目前,最大的公开仓库是官方 提供的Docker Hub,其中存放了数量庞大的镜像供用户下载。国内不少云服务 提供商(如时速云、阿里云等)也提供了仓库的本地源,可以提供稳定的国 内访问。

当然,用户如果不希望公开分享自己的镜像文件,Docker也支持用户在 本地网络内创建一个只能自己访问的私有仓库。当用户创建了自己的镜像之 后就可以使用push命令将它上传到指定的公有或者私有仓库。这样用户下次 在另外一台机器上使用该镜像时,只需要将其从仓库上pull下来就可以了。