Docker Overview

Docker 是一个用于开发、交付和运行应用的开放平台,Docker 设计用来更快的交付你的应用程序。Docker 能够将你的应用程序和基础设施层隔离,而且还能够将你的基础设施看成程序同样进行管理。Docker 能够帮助你更块地打包你的代码、测试以及部署,而且也能够减小从编写代码到部署运行代码的周期。docker

Docker 将一个轻量级的容器虚拟化平台和一组标准工做流程、工具进行集成,来帮助你方便地管理和部署应用。ubuntu

 

什么是 Docker 平台?

核心是,Docker 提供了一种在安全隔离的容器中运行近乎全部应用的方式,这种隔离性和安全性容许你在同一主机上同时运行多个容器,而容器的这种轻量级特性,意味着你能够节省更多的硬件资源,由于你没必要消耗运行 hypervisor 所须要的额外负载。安全

基于容器虚拟化的工具或者平台能够为你提供以下帮助:bash

  • 将应用程序(包括支撑的组件)放入 Docker 容器中;
  • 将这些容器打包并分发给你的团队,以便于后续的开发和测试;
  • 将这些容器部署到生产环境中,生产环境能够是本地的数据中心,也能够在云端。

 

什么是 Docker 引擎?

Docker 引擎是一个 C/S 应用,主要有如下组件:服务器

  • 一个叫作守护进程的长时间运行的服务器程序
  • REST API 接口提供程序与守护进程交互
  • 一个 CLI 命令行工具

CLI 命令行工具利用 REST API 来与守护进程交互,使用脚本或直接用命令。网络

守护进程建立并管理 Docker 对象,Docker 对象包括镜像、容器、网络、数据卷等等。架构

注:Docker 在 Apache 2.0 开源协议下进行受权。app

 

我能够用 Docker 作些什么?

快速分发你的应用

Docker 是开发过程当中较为理想的助手,它容许你在包含了你的应用和服务的本地容器中进行开发,而后帮你完成集成和部署。socket

例如,你的开发人员能够在本地编写代码而后经过 Docker 与其余同事共享,当他们完成了各自的开发任务后,能够将他们的代码推送到一个测试的环境中进行测试,完成测试后即可以将相应的 Docker 镜像部署到生产环境中。工具

 

更方便地进行部署和调整规模

Docker 这种基于容器的平台具备高度的便携性,它能够无缝地运行于开发者的本地主机、数据中心其它的物理机或虚拟机、或者云端。

Docker 的便携性和其自然的轻量特性易于实现动态地负载管理,你能够利用 Docker 快速地增减应用和服务的部署规模,Docker 的速度保证了这种规模的调整近乎实时。

 

更高密度的部署应用和运行更多的应用

因为 Docker 轻量而且快速,所以相对于基于 Hypervisor 的虚拟机的部署方式,Docker 提供了一种更可行和划算的替代方案,这对于高密度部署环境尤为有用,例如在构建私有云或 PaaS。固然,当你想在有限的资源里部署更多的应用时,Docker 对于中小型的部署也很是有用。

 

Docker 的架构?

Docker 是 Client/Server 的架构,Docker 客户端与 Docker daemon 进行交互,daemon 负责构建、运行和发布 Docker 容器。客户端能够和服务端运行在同一个系统中,也能够链接远程的 daemon。Docker 的客户端的 daemon 经过 RESTful API 进行 socket 通讯。

 

Docker 守护进程

就像上图所示,Docker 守护进程(daemon)在主机上运行,用户不能直接和守护进程打交道,可是能够经过 Docker 客户端与其进行交互。

 

Docker 客户端

Docker 客户端—— docker 二进制文件的功能之一是 Docker 的初始用户界面,它接收用户的命令并反馈,而且与 Docker 的守护进行交互。

 

Docker 内部机制

理解 Docker 的内部机制,你须要明白以下三个组件:

  • Docker 镜像
  • Docker 注册中心
  • Docker 容器

 

Docker 镜像

Docker 镜像是一个只读的模板。例如,一个镜像能够包含安装了 Apache Web 服务应用的 Ubuntu 操做系统。镜像能够用来建立 Docker 容器。Docker 提供了构建新镜像或升级原有镜像的较为便利的方式,或者你也能够下载别人已经建立好的镜像。Docker 镜像是 Docker 的构建组件。

 

Docker 注册中心

Docker 注册中心用于上传和下载镜像,分为公共注册中心和私有注册中心两种。公共注册中心为 Docker Hub,它提供了大量的现成镜像,你能够构建本身的镜像并上传到上面,也能够在上面下载别人构建的镜像。Docker 注册中心是 Docker 的发布组件。

 

Docker 容器

Docker 容器就像是一个文件夹,它包含了一个应用程序运行所须要的全部内容。每一个容器都是基于 Docker 镜像构建。咱们能够运行、开始、中止、迁移或者是删除 Docker 容器。每一个容器均是一个隔离的、安全的应用平台。Docker 容器是 Docker 的运行组件。

 

Docker 镜像是如何工做的?

咱们已经知道 Docker 镜像实质上是一些用于加载 Docker 容器的只读模板,每一个镜像包括不少层。Docker 利用 union file systems 将这些层组合为一个镜像。Union file systems 容许相互隔离的文件或目录透明的叠加在一块儿,而呈现为一个统一的文件系统。

Docker 如此轻量化的缘由也是因为这些层的存在。当你对一个 Docker 镜像进行修改时——例如将一个应用升级为一个新的版本——会构建一个新的层,所以,与虚拟机的替换整个镜像或彻底构建的方式不一样,Docker 仅对相关的层进行添加或升级。因此你仅须要发布镜像的更新部分而没必要发布整个镜像,这种方式使得镜像的发布更加快速和简单。

每一个镜像始于一个基础镜像,例如:ubuntu 即是一个基础的 Ubuntu 镜像,fedora 是一个基础的 Fedora 镜像。你也能够将你本身制做的镜像做为基础镜像,例如你能够将一个 Apache 镜像做为一个 Web 应用的基础镜像。

注:Docker 通常从 Docker Hub 上获取基础镜像。

Docker 镜像从这些基础镜像中按照一系列的步骤进行制做,咱们称这些步骤为指令,每一个指令在你的镜像中建立一个新的层,指令包括如下行为:

  • 运行一条命令;
  • 添加一个文件或目录;
  • 建立一个环境变量;
  • 今后镜像中加载一个容器时须要运行的进程。

这些指令存储在 Dockerfile 中,Docker 在构建镜像过程当中读取这个 Dockerfile,运行里面的指令并返回最终的镜像。

 

Docker 注册中心如何工做的?

Docker 注册中心是 Docker 镜像的存储中心,当你构建完一个镜像后即可以将其推送到 Docker Hub 或你本身的注册中心。

利用 Docker 客户端,你能够搜索已经发布的镜像,而后将其拉取到你的 Docker 主机上,以便于基于这些镜像构建容器。

Docker Hub 为镜像提供了公共的和私有的存储空间。公共的存储空间任何人都可以在上面搜索和下载,私有存储空间仅对你本人或你的团队开放搜索以及拉取下载,你能够经过这里注册一个私有的存储空间。

 

容器是如何工做的?

一个容器包括操做系统、用户添加的文件以及相关的元数据。咱们知道,每一个容器都是从镜像中构建出来的,这个镜像告诉 Docker 容器用到什么资源、当容器加载时启动哪一个进程以及容器启动时的其它配置。Docker 镜像是只读的,当 Docker 从一个镜像运行一个容器时,它会在镜像的上层添加一个用于运行应用的可读写的层(利用的就是上文提到的 union file system)。

 

运行一个容器时到底发生了什么?

不论是经过 Docker 命令仍是 API 调用的方式,Docker 客户端都会通知 Docker 的守护进程运行一个容器。

$ docker run -i -t ubuntu /bin/bash

咱们来看一下这个命令,Docker 客户端利用 docker 命令并结合 run 选项来启动一个容器,一个最小配置的 Docker 客户端运行一个容器须要告诉 Docker 守护进程如下事项:

  • 此容器基于什么镜像来构建,此处是 ubuntu —— 一个基础的 Ubuntu 镜像;
  • 须要在容器中运行的命令,此处是 /bin/bash —— 在容器中启动一个 Bash Shell。

那么咱们看看运行上述命令时到底发生了什么?

按照顺序,Docker 依次干了以下事情:

  • 拉取 ubuntu 镜像:Docker 首先检查一下 ubuntu 镜像在本地服务器上存不存在,若是不存在,则自动从 Docker Hub 中下载,若是已经存在则直接利用这个镜像来启动一个新的容器。
  • 建立一个新的容器:若是 Docker 本地服务器中存在这个镜像,那么就据此来启动一个容器。
  • 分配一个文件而且将其挂载到一个可读写的层:容器在此文件系统中被建立,而且将其做为一个可读写的层添加到镜像中。
  • 分配一个网络或桥接的接口:建立一个网络的接口以便于 Docker 容器可以访问本机。
  • 设置一个 IP 地址:为此容器从地址池中找到并绑定一个 IP 地址。
  • 执行指定的进程:运行你的应用程序,而后;
  • 获取并提供应用程序的输出: 链接标准输入、标准输出和标准错误接口,这样你即可以观察到程序运行的一切。

如今你已经运行了一个容器,这样你即可以管理你的容器、与应用程序进行交互,当运行结束是中止或者删除你的容器。

 

底层技术问题

Docker 是用 Go 语言实现的,用到了一些 Linux 内核的特性实现上述功能。

 

命名空间(namespaces)

Docker 在为容器提供一个隔离的工做空间时,用到了命名空间的技术,当你运行一个容器时,Docker 会为此容器建立一组命名空间。

这样即可以提供一个隔离的层:每一个容器运行在本身的命名空间中,而外部不能访问这个层。

Docker 用到的一些命名空间有:

  • pid 命名空间:用于隔离进程(PID:Process ID);
  • net 命名空间:用于管理网络;
  • ipc 命名空间:用于访问 IPC 资源(IPC:InterProcess Communication);
  • mnt 命名空间:用于管理挂载点(MNT:Mount);
  • uts 命名空间:用于隔离内核和版本标识(UTS:Unix Timesharing System)。

 

控制组(Control Groups)

Docker 还用到了另一项技术叫 cgroups 或者叫控制组(control groups)。实现程序运行环境的隔离的关键在于使这些程序只用到它们须要的资源,这就可以保证这些容器是主机服务环境小社会中的好市民。控制组容许 Docker 在不一样的容器之间共享硬件资源,须要时添加一些限制和约束,例如限制一个容器最大访问内存量。

 

统一文件系统(Union file systems)

统一文件系统或者说是 UnionFS,是建立层的时候用到的文件系统,使文件系统很是轻量和快速。Docker 使用统一文件系统为容器构建 blocks,Docker 可使用几种不一样的文件系统:AUFS、btrfs、vfs 以及 DeviceMapper。

 

容器格式(Container format)

Docker 容器将这些组件合并在一块儿,咱们称之为容器格式,容器的缺省格式称为 libcontainer。Docker 还支持利用 LXC 技术的传统 Linux 容器格式,将来还将会支持其它的容器格式,例如:与 BSD Jails 或者 Solaris Zones 实现整合。

相关文章
相关标签/搜索