
Docker是一个开源项目诞生于2013年初,最初是dotCloud公司内部的一个业余项目,基于Google公司的Go语言实现,项目后来加入Linux基金会,遵从Apache2.0协议,项目代码在Github上维护。
Docker的目标是实现轻量级的操作系统虚拟化解决方案,Docker的基础是Linux容器LXC等技术,在LXC基础上Docker做了进一步的封装,让用户不需要关心容器的管理,使得操作更为简便。用户操作Docker容器就像操作一个快速轻量级的虚拟机一样简单。
什么是虚拟机呢?
虚拟机本质上是对现实计算机的仿真,它会像真机一样执行程序。使用虚拟机管理程序hypervisor可以将虚拟机运行在物理机上,也可以运行在裸机上。虚拟机管理程序本身在物理机(主机)上运行,主机为虚拟机提供资源,包括RAM和CPU。这些资源在虚拟机之间被划分并根据需要进行分配。如果一个虚拟机上运行了资源占用很大的应用程序,你可以相应地为它分配更多的系统资源。

什么是虚拟机管理程序hypervisor?
由于虚拟机拥有自己的虚拟操作系统,管理程序为虚拟机管理和执行访问操作系统提供了一个平台,它允许主机与作为客户端运行的虚拟机之间共享其资源。

什么是容器呢?
容器是通过抽象用户空间来提供操作系统级别的虚拟化,容器看起来像是一个虚拟机。它们有执行进程的私有空间,有专用的网络接口和IP地址,同样也可以挂载文件系统...
容器和虚拟机之间的一个重要的区别在于:容器和其它容器是共享主机系统的内核的。

Docker与传统虚拟化方式(虚拟机,VM)有什么不同之处呢?

-
传统虚拟机是在硬件层面实现虚拟化
传统虚拟化
虚拟机VM是一个运行在宿主机之上的完整的操作系统,虚拟机运行自身操作系统时会占用较多的系统资源。
系统虚拟化 -
Docker是在操作系统层面上实现虚拟化
Docker虚拟化
Docker与VM不同的是,只包含应用程序与依赖库,基于libcontainer运行在宿主机上,并处于一个隔离的环境中,使得Docker更加轻量且高效。

Docker引擎是什么呢?
Docker引擎是一个C/S结构的应用,由三部分构成:
- Server
服务器docker daemon是一个常驻进程 - REST API
实现客户端与服务器之间的交互协议 -
CLI
客户端docker CLI命令行工具实现容器和镜像的管理为用户提供统一的操作界面
Docker引擎
Docker的架构是什么样的呢?
Docker使用C/S架构,客户端通过接口与服务器进程通信以实现容器的构建、运行和发布。
-
Docker daemon
Docker守护进程运行在宿主机上,用户通过Docker客户端(docker cli)与之交互。
Docker后台守护进程 -
Docker client
Docker客户端是一个命令行工具(CLI),是用户使用Docker的主要方式。Docker客户端与Docker服务器守护进程通信并将结果返回给用户,Docker客户端也可以通过socker或RESTful API访问远程的Docker daemon。
Docker的C/S架构
Docker客户端和服务器可以运行在同一台集群,也可以通过跨主机实现远程通信。

Docker的核心是什么呢?

- 镜像
image
Docker镜像是一个只读的模板,是一堆只读层(read-only layer)的统一视角。镜像可以用来创建Docker容器,一个镜像可以创建多个容器。Docker提供了一个简单的机制来创建镜像或更新镜像,用户甚至可以直接从其他人哪里下载一个已经做好的镜像来直接使用。
镜像
镜像是容器的基石,镜像保存了启动容器的条件,容器基于镜像的启动而运行。Docker镜像是一个层叠的只读文件系统,最底端是一个引导文件系统和bootfs。用户永远不会和引导文件系统有交互,实际上当容器启动后,bootfs会被移到内存中,而引导文件将被卸载。

Docker镜像的第二层是root文件系统rootfs,位于引导文件系统之上,可以有多种操作系统。
- 仓库
repository
仓库是集中存放镜像的场所,仓库分为公开仓库(public)和私有仓库(private)两种形式,最大的公开仓库是Docker Hub,存放庞大的镜像供用户下载。用户可以在本地网络内创建一个私有仓库,但用户创建了自己的镜像后可使用push命令将他上传到公有或私有仓库。下载在另外一台机器上使用时只需要从仓库中pull下来即可。Docker的仓库跟Git类似,注册服务器可理解为GitHub这样的托管服务器。实际上,仓库注册服务器(registry)上存放着多个仓库,每个仓库又包含多个镜像,每个镜像有着不同的标签(tag)。
仓库

- 容器
container
Docker利用容器来运行应用,容器是从镜像中创建的运行实例。每个容器都是相互隔离的,以保证平台的安全。容器的定义和镜像的定义一样,也是一堆层的统一视角,唯一的区别在于容器的最上层是可读写的。
一个运行态的容器被定义为一个可读写的“统一文件系统+隔离的进程空间+包含其中的进程”。
一个运行态容器
正是文件系统隔离技术使得Docker成为一个非常具有潜力的虚拟化技术,一个容器中的进程可能会对文件进行修改、删除、创建等操作,这些改变都将作用于可读写层。








