【Docker官方文档】理解Docker

本文来自Docker的官方文档,详细介绍了Docker的体系结构、重要概念、内部工做机理等内容,推荐不了解Docker内部原理的同窗阅读。

linux

什么是Docker?

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

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

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

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

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

 

我能够用Docker作些什么?

快速分发你的应用

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

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

ubuntu

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

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

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

安全

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

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

bash

Docker主要包括哪些组件?

Docker主要包括两个组件:服务器

  • Docker:开源的容器虚拟化平台;
  • Docker Hub :用于分享和管理Docker容器的软件即服务平台。


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

网络

Docker的架构?

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

architecture.jpg

 

Docker守护进程

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

app

Docker客户端

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

socket

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怎样工做的

至此,咱们已经知道了:

  1. 你能够构建用于存储你的应用程序的镜像;
  2. 你能够从Docker镜像中建立容器用来运行你的应用;
  3. 你能够经过Docker Hub或者你本身的注册中心来共享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的守护进程运行一个容器。

$ sudo 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。

容器格式

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

下一步

安装Docker,请参照installation section

Docker用户指南,请参照深刻学习Docker

原文连接:Understanding Docker(翻译:deerlux 校对:李颖杰)

相关文章
相关标签/搜索