Docker 是一个开源的应用容器引擎,让开发者能够打包他们的应用以及依赖包到一个可移植的容器中,而后发布到任何流行的Linux机器上,也能够实现虚拟化,容器是彻底使用沙箱机制,相互之间不会有任何接口。
一个完整的Docker有如下几个部分组成: dockerClient客户端 Docker Daemon守护进程 Docker Image镜像 DockerContainer容器
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和建立Docker容器。Docker 容器经过 Docker 镜像来建立。容器与镜像的关系相似于面向对象编程中的对象与类。
docker | 面向对象 |
容器 | 对象 |
镜像 | 类 |
Docker采用 C/S架构 Docker daemon 做为服务端接受来自客户的请求,并处理这些请求(建立、运行、分发容器)。 客户端和服务端既能够运行在一个机器上,也可经过 socket 或者RESTful API 来进行通讯。 Docker daemon 通常在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。
在docker的网站上提到了docker的典型场景: Automating the packaging and deployment of applications(使应用的打包与部署自动化) Creation of lightweight, private PAAS environments(建立轻量、私密的PAAS环境) Automated testing and continuous integration/deployment(实现自动化测试和持续的集成/部署) Deploying and scaling web apps, databases and backend services(部署与扩展webapp、数据库和后台服务) 因为其基于LXC的轻量级虚拟化的特色,docker相比KVM之类最明显的特色就是启动快,资源占用小。所以对于构建隔离的标准化的运行环境,轻量级的PaaS(如dokku), 构建自动化测试和持续集成环境,以及一切能够横向扩展的应用(尤为是须要快速启停来应对峰谷的web应用)。 1.构建标准化的运行环境,现有的方案大可能是在一个baseOS上运行一套puppet/chef,或者一个image文件,其缺点是前者须要base OS许多前提条件,后者几乎不能够修改(由于copy on write 的文件格式在运行时rootfs是read only的)。而且后者文件体积大,环境管理和版本控制自己也是一个问题。 2.PaaS环境是不言而喻的,其设计之初和dotcloud的案例都是将其做为PaaS产品的环境基础 3.由于其标准化构建方法(buildfile)和良好的REST API,自动化测试和持续集成/部署可以很好的集成进来 4.由于LXC轻量级的特色,其启动快,并且docker可以只加载每一个container变化的部分,这样资源占用小,可以在单机环境下与KVM之类的虚拟化方案相比可以更加快速和占用更少资源
Docker是基于Linux 64bit的,没法在32bit的linux/Windows/unix环境下使用 LXC是基于cgroup等linux kernel功能的,所以container的guest系统只能是linux base的 隔离性相比KVM之类的虚拟化方案仍是有些欠缺,全部container公用一部分的运行库 网络管理相对简单,主要是基于namespace隔离 container随着用户进程的中止而销毁,container中的log等用户数据不便收集 Docker对disk的管理比较有限 Docker并不是适合全部应用场景,Docker只能虚拟基于Linux的服务。Windows Azure 服务可以运行Docker实例,但到目前为止Windows服务还不能被虚拟化。 可能最大的障碍在于管理实例之间的交互。因为全部应用组件被拆分到不一样的容器中,全部的服务器须要以一致的方式彼此通讯。这意味着任何人若是选择复杂的基础设施,那么必须掌握应用编程接口管理以及集群工具,好比Swarm、Mesos或者Kubernets以确保机器按照预期运转并支持故障切换。 Docker在本质上是一个附加系统。使用文件系统的不一样层构建一个应用是有可能的。每一个组件被添加到以前已经建立的组件之上,能够比做为一个文件系统更明智。分层架构带来另外一方面的效率提高,当你重建存在变化的Docker镜像时,不须要重建整个Docker镜像,只须要重建变化的部分。 可能更为重要的是,Docker旨在用于弹性计算。每一个Docker实例的运营生命周期有限,实例数量根据需求增减。在一个管理适度的系统中,这些实例生而平等,再也不须要时便各自消亡了。 针对Docker环境存在的不足,意味着在开始部署Docker前须要考虑以下几个问题。首先,Docker实例是无状态的。这意味着它们不该该承载任何交易数据,全部数据应该保存在数据库服务器中。 其次,开发Docker实例并不像建立一台虚拟机、添加应用而后克隆那样简单。为成功建立并使用Docker基础设施,管理员须要对系统管理的各个方面有一个全面的理解,包括Linux管理、编排及配置工具好比Puppet、Chef以及Salt。这些工具生来就基于命令行以及脚本。
参考资料:linux
https://baike.baidu.com/item/Docker/13344470?fr=aladdin#reference-[3]-12232642-wrap