一、什么是Docker
Docker是基于Go语言实现的云开源项目. Docker 的主要目标是:"Bulid,Ship and Run Any App ,AnyWhere" ,即通过对应用组件的封装、分发、部署、运行等生命周期的管理,达到应用组件级别的"一次封装,到处运行"。这里的应用组件,即可以是一个Web应用,也可以使一套数据库服务,甚至是一个操作系统或编译器.
Docker 基于Linux 的多项开源技术提供了高效、敏捷和轻量级的容器方案,并且支持在多种主流云平台(PaaS) 和本地系统上部署。可以说Docker为应用的开发和部署提供了"一站式"的解决方案。
Docker引擎的基础是Linux容器(Linux Containers , LXC)技术. 在LXC的基础上,Docker进一步优化了容器的使用体验。Docker提供了各种容器管理工具(如分发、版本、移植等)让用户无需关注底层的操作,可以简单明了的管理和使用容器。用户操作Docker容器就像操作一个轻量级的虚拟机那样简单.
二、Docker与虚拟机的比较
作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有显著优势:
- Docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式要快很多。
- Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器。
- Docker通过类似Git的操作来方便用户获取、分发和更新应用镜像,指令简明 ,学习成本很低。
- Docker通过Dockerfile配置文件来支持灵活的自动化创建和部署机制,提高工作效率.
Docker容器除了运行其中的应用之外,基本不消耗额外的系统资源,保证应有性能的同时,尽量减少系统开销。传统虚拟机方式运行N个不同的应用就要启动N个虚拟机(每个虚拟机需要单独分配独占的内存、磁盘等资源),而Docker只需要启动N个隔离的容器,并将应用放到容器内即可。
下表总结了使用Docker容器技术与传统虚拟机技术的特性比较。
下图比较了Docker和常见虚拟机方式的不同之处。
传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。
Docker容器是在操作系统层面实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级.
三、什么是Docker引擎(Engine)
Docker引擎是一个客户端--服务器应用,由如下主要组件组成:
- 一个后台守护进程(daemon process.)
- 一个REST API 指定特定的接口,程序可以使用这些接口告诉和指导守护进程做什么.
- 一个命令行端口(CLI),client.
CLI使用Docker的REST API 来和Docker的守护进程交互,通过脚本或直接的CLI命令。
守护进程(dameon)创建和管理Docker对象(objects).Docker对象包括镜像(images)、容器(containers)、网络(networks)、数据卷(data volumes)等等.
注:docker通过开源的Apache 2.0 许可认证.
四、Docker的架构
Docker使用客户端-服务器(client-server)架构. Docker client 告诉Docker daemon 建立、运行、和分发你你的Docker容器. Docker client和daemon可以运行在同一个系统中,或者可以使用Docker client 和远程的Docker daemon 取得联系。docker客服端和docker守护进程之间通过sockets 或者REST API 交互.
1、Docker守护进程
如上图所示,Docker守护进程运行在一台主机上,用户不直接和守护进程交互,而是通过Docker客户端交互.
2、Docker客户端
Docker客户端,实际是Docker的二进制程序,是主要的用户与Docker的交互方式。它接收用户指令,并与背后的Docker守护进程交互,如此来回往复.
3、Docker 内部(Inside)
要理解Docker内部情况,你需要知道如下三种资源:
- Docker images---Docker 镜像
- Docker registries----Docker 注册服务器
- Docker containers-----Docker容器
3.1、Docker镜像
Docker镜像类似于虚拟机镜像,可以将它理解为一个面向Docker引擎的只读模板,包含了文件系统。
例如:一个镜像可以只包含一个完整的Ubuntu操作系统环境,可以把它称为一个Ubuntu镜像。镜像也可以安装了Apache应用程序(或用户需要的其他软件),可以把它称为一个Apache镜像。
镜像是创建Docker容器的基础。通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至可以从网上下载一个已经做好的应用镜像,并通过简单的命令可以直接使用.
3.2、Docker容器
Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。
容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,而这些容器都是互相隔离、互不可见的。
读者可以把容器看做一个简易版的Linux系统环境(这包括root用户权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序打包而成的应有盒子。
镜像自身是只读的。容器从镜像启动的时候,Docker会在镜像的最上层创建一个可写层,镜像本身将保持不变.
3.3、注册服务器(Registry)
Docker注册服务器是存放仓库的地方,其上往往存放过个仓库。每个仓库集中存放某一个类镜像,往往包括多个镜像文件,可以通过不同的标签(tag)来进行区分。根据所存储的镜像公开与否,Docker仓库可以分为公开(Public)仓库和私有(Private)仓库两种形式.
图--仓库和注册服务器
目前,最大的公开仓库是Docker Hub,存放数量庞大的镜像供用户下载. 用户如果不希望公开分享自己的镜像文件,Docker也支持在本地网络内创建一个只能自己访问的私有仓库。
当用户创建了自己的镜像之后就可以使用push命令将它上传到指定的公有或者私有仓库。这样用户下次用户下次在另一台机器上使用该竟像时,只需将其从仓库上pull下来就可以了。