概述
DockerDocker是美国几个年轻人创建了一个公司dotCloud,做一些关于Paas的云计算服务和LXC有关的容器技术,Docker开发与2010年,2013 年开源火起来,2014年出版第一版docker1.0版本,Docker 是一个开源容器引擎
,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,也就是常说的隔离机制,值得一提的是Docker是go
语言开发的
一个完整的Docker有以下几个部分组成:
- DockerClient客户端
- Docker Daemon守护进程
- Docker Image镜像
- DockerContainer容器
特性
-
docker相比KVM之类最明显的特点就是启动快,资源占用小。
-
构建隔离的标准化的运行环境,轻量级的PaaS(如dokku), 构建自动化测试和持续集成环境,以及一切可以横向扩展的应用(尤其是需要快速启停来应对峰谷的web应用)。
-
构建标准化的运行环境,现有的方案大多是在一个baseOS上运行一套puppet/chef,或者一个image文件,其缺点是前者需要base OS许多前提条件,后者几乎不可以修改(因为copy on write 的文件格式在运行时rootfs是read only的)。并且后者文件体积大,环境管理和版本控制本身也是一个问题。
-
标准化构建方法(buildfile)和良好的REST API,自动化测试和持续集成/部署能够很好的集成进来
局限
Docker并不是全能的,设计之初也不是KVM之类虚拟化手段的替代品,简单总结几点:
Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用
LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base的
隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库
网络管理相对简单,主要是基于namespace隔离
cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费)
Docker对disk的管理比较有限
container随着用户进程的停止而销毁,container中的log等用户数据不便收集
传统虚拟化技术与Docker对比
比较 | Docker 容器 | Vm虚拟机 |
---|---|---|
操作系统 | 与主机共享OS | 宿主机OS上运行虚拟机OS |
存储大小 | 镜像小,便于存储和运输 | 镜像庞大 |
运行性能 | 几乎无额外性能损失 | 操作系统额外的cpu,内存消耗 |
移植性 | 轻便,灵活,适应linux | 笨重,与虚拟化技术耦合度高 |
部署速度 | 快速,秒级 | 较慢 |
隔离级别 | 进程之间的隔离 | 操作系统之间的隔离 |
安全性 | 低于vm虚拟机 | 高于Docker容器 |
硬件亲和性 | 面向软件开发者 | 面向硬件开发者 |
为什么Docker比VM更快
(1)docker有着比虚拟机更少的抽象层。
docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上、docker有明显优势。
(2)docker利用的是宿主机的内核,而不需要 宿主机OS。 新建一个docker容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。避免引寻、加载操作系统内核等比较费时费资源的过程;新建一个VM虚拟机时,虚拟机软件需要加载 宿主机OS,整个新建过程是分钟级别的。而docker由于直接利用宿主机的OS,则省略了返个过程,新建一个docker容器只需要几秒钟。
Docker技术的缺点:
- Docker容器还没有任何形式的硬件隔离,因此它们容易受到攻击。
- 1.资源隔离方面不如虚拟机,docker是利用cgroup实现资源限制的,只能限制资源消耗的最大值,而不能隔绝其他程序占用自己的资源。
- 2.安全性问题。docker目前并不能分辨具体执行指令的用户,只要一个用户拥有执行docker的权限,那么他就可以对docker的容器进行所有操作,不管该容器是否是由该用户创建。比如A和B都拥有执行docker的权限,由于docker的server端并不会具体判断docker cline是由哪个用户发起的,A可以删除B创建的容器,存在一定的安全风险。
- 3.docker目前还在版本的快速更新中,细节功能调整比较大。一些核心模块依赖于高版本内核,存在版本兼容问题
Docker容器的优点
-
- DevOps(开发.运维)
传统方式: 一堆的帮助文档,安装程序
Docker: 打包镜像文件发布测试,一键运行
- 2.更快捷的升级和扩容
使用Docker之后,我们部署应用就和搭积木一样
项目打包成一个镜像文件,扩展,服务器A!
- 3.更快捷的运维
在容器技术之后,开发运维环境一致
-
- 更高效的计算机资源利用
Docker是内核级别的虚拟化技术,可以吧计算机的资源利用到极致