Docker是一个开源的软件项目,让技术人员可以打包他们的应用及其依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上。在Linux操作系统上,Docker提供了一个额外的软件抽象层及操作系统层虚拟化的自动管理机制。Docker运行名为“Container(容器)”的软件包,容器之间彼此隔离,并捆绑了自己的应用程序、工具、库和配置文件。所有容器都由单个操作系统内核运行,因此比虚拟机更轻量级。
Docker利用Linux资源分离机制(例如Cgroups及Linux Namespace)来创建相互独立的容器(Container)。可以在单个Linux实体下运行,避免了启动一个虚拟机造成的额外负担。Linux核心对Namespace(命名空间)的支持完全隔离了不同Namespace下的应用程序的“视野”(即作用范围),包括进程树、网络、用户ID与挂载的文件系统等,而核心Cgroups则提供了资源隔离,包括CPU、存储器、Block I/O与网络。
Docker在逻辑上分为如下几个部分:
通俗来讲,Docker的设计理念来自于集装箱,可以将不同类型的货物装在不同的环境中,比如一些需要低温环境运送的货物需要装在有“冰块”的集装箱中,比较危险的化学物品需要装在一些特制的集装箱中运送。相同的道理,在一个企业内部,一个系统可能会涉及不同的环境和不同的代码语言,比如Java应用程序需要JRE作为基础环境,NodeJS应用需要Node作为基础环境,还有可能一些应用需要Ubuntu系统,而另一些应用需要CentOS系统,那么我们使用Docker时只要将依赖的系统环境和开发环境做成一个“集装箱”,然后把应用放进这个“集装箱”,即可把我们的应用“跑”起来。