Docker 是一个用于开发、部署和运行应用的开源平台。它意在使你能更快地进行应用分发。docker
使用 Docker 能够将应用系统和基础设施分离,而且能够用管理应用系统相似的方式对基础设施进行管理。shell
Docker 使用了内核的容器功能 + 工做流程 + 工具来助咱们管理和部署应用。ubuntu
Docker 内核能将应用安全地运行于一个个容器中。同时,它的容器是轻量级的,于是能够在一台主机上同时运行不少个容器。缓存
围绕容器还提供了相关的工具和平台:安全
Docker 引擎是一个 CS 框架的应用程序,有下面几个主要组件:bash
CLI 以脚本或直接命令的形式,利用 Docker REST API 和 Docker 后台进程交互。而其它的 Docker 应用也会使用 REST API 和 CLI。服务器
后台对 Docker 对象进行建立和管理。Docker 对象包括 images, containers, networks, data volumnes 等。网络
在本地,开发人员将应用代码和运行所需的相关服务一块儿放置在一个本地 Docker 容器中,并将其(包含代码及全部开发堆栈)发送给同事。开发完成后,他们能够将代码及开发堆栈推送到一个测试环境中进行测试。在测试环境中,又能够将 Docker images 推送到生产环境中进行部署。app
其基于轻量级容器的特性使得它很是容易进行扩展。 Docker 容器能够运行在开发者机器上,数据中心的物理或虚拟机上,或者云上。框架
因为容器与低层基础设施分离,能够实现实时的升配和降配。
性能上相比虚拟机高效地多。
CS 框架。Docker 后台进程负责建立、运行和发布 Docker 容器。Docker 客户端和后台进程便可以运行在同一个机器上,也能够运行在不一样的机器上。Docker 客户端经过 sockets 或 REST API 与后台进程通信。
运行于服务器上,用户经过 Docker 客户端与其交互。
即二进制程序 docker,它接受用户命令,将命令传给 Docker 后台进程,而后将命令结果返回给用户。
要理解 Docker 的内部机理,要知道三种资源:
Docker image 是一个只读模板。例如,一个 Docker image 能够包含一个 Ubuntu 操做系统、Apache 及你安装的程序。Image 用来建立 Docker 容器。Docker 能够很是容易地建立新 image 或者更新现成的 image,或者你也能够下载别人制做的 image。
Docker image 是 Docker 的 构建 组件。
Docker registries 保存 Docker images。它就是一个仓库,即有私有的也有公共的,能够从中上传或下载 images。公共 Docker registry 是 Docker Hub。Docker registries 是 Docker 的 分发 组件。
Docker 容器相似目录。一个容器包含所需运行程序的全部依赖。每一个容器都根据一个 Docker image 建立。Docker 容器能够被运行、开启、中止、移动或者删除。每一个容器都是一个隔离地安全的应用平台。Docker 容器是 Docker 的 运行 平台。
每一个 image 包含一系列的层。Docker 利用 union file systems 将这些层合并到一个 image 中。UnionFS 容许不一样文件系统(被称做分支)的文件和目录进行透明的层叠,从而造成一个单一的一致的文件系统。
采用层是 Docker 轻量级的一个缘由。例如,当你对应用进行了升级后,就会建立一个新的层,从而完成对 image 的修改。无需对整个 image 进行重建,只需添加或更新相关的层便可。在分发时,也只需分发更新了的层。
每一个 image 都开始于一个最基本的 image ,如 ubuntu,而后在些基础上构建新的 image。
在基 image 以后,经过运行一组步骤(称为指令)来建立出新的 image。每一个指令在咱们的 image 上建立一个新的层。
指令动做包含:
这些指令保存在 Dockerfile 文件中。Dockerfile 是一个脚本文件,包含了从基 image 建立所需 image 的全部指令和命令。
Docker registry 是 Docker images 的仓库。当建立了一个 Docker image 后,能够将它 push 到公共 registry 上如 Docker Hub 中。
经过 Docker 客户端,能够搜索已发布的 image, 而后将它 pull 到 Docker 主机上,最后根据它启动容器。
一个容器包含一个操做系统,用户添加的文件及元数据。容器建立自一个 image。image 告诉 Docker 一个容器中都包含什么内容,当容器加载时要运行哪一个进程,以及其它的配置数据。Docker image 是只读的。而当 Docker 根据一个 image 开启了一个容器后,它将在 image 之上添加一个读写层,而咱们的应用就运行于其之上。
运行一个容器:
$ docker run -i -t ubuntu /bin/bash
上面的命令中:
运行该命令时 Docker 引擎依次执行了以下操做:
使用 Go 编写,并利用了如下几个内核功能。
运行容器时,Docker 会为该容器建立一组 namespaces,从而容器中的每一个部件都运行于独立的 namespace 中,互不干扰。
Linux 上的 Docker 引擎用到的 namespaces:
Docker 引擎利用它实现容器间的硬件资源共享,并设置限制和约束。例如限制某个容器的内存使用量。
Docker 引擎能够使用几个 ufs 的变种,如 AUFS, btrfs, vfs 和 DeviceMapper。
Docker 引擎将这些组件合并成一个封闭体叫一个 container format,默认的 container format 叫 libcontainer。
参考文献: Undering docker