3.0.4、认识docker架构

认识docker架构

Docker 是什么 ?

Docker是一个开源的平台,用于开发、航运(打包和迁移)和运行应用程序。Docker的设计目是为了解决应用的迅速交付。使用Docker你可以将你的应用和基础平台分离,方便基础平台的管理。Docker为你的航运代码、测试、部署加速,缩短了编码到运行的时间周期。

Docker将一个轻量级的容器虚拟技术结合管理和部署应用的流程工具来实现上述的功能。

其核心思想是,Docker提供一个解决方案,在一个容器里运安全独立地运行绝大多数的应用。独立且安全的特性允许你在宿主机上可以同时运行多个容器。这个轻量级容器的本质,不需要依赖额外的超级监督者(hyvpervistor),这个意味你可以充分的利用你的硬件。

围绕着容器虚拟的工具和平台,对下面几个方面有帮助:

  • 让你的应用(和支持的组件)进入到Docker容器里。
  • 分布和航运这些容器到你的团队里,以便做更生层次的开发和测试。
  • 部署这些应用到你的生产环境中,无论它是在一个本地数据中心或云上。

我可以用Docker做什么?

快速交付你的应用

Docker可以帮你完善你的开发生命周期。Docker允许你的开发者在一个本地容器上开发你的应用和服务。它可以集成到一个持续整合部署的流程里。

例如,你的开发人员编写的本地代码,通过Docker分享他们的开发栈给他们的同事。当他们准备好时,可以将这些代码和栈部署到一个测试的环境上,做任何的必要测试。经过测试环境后,你就可以部署到生产环境中了。

更容易部署和扩展

Docker 的基于容器平台特性允许高的移植性。Docker容器可以在一个开发者的本地主机、一个数据中心或云平台里的物理或虚拟机上运行。

Docker的可移植和轻量级的特性让动态管理工作负载变得简单。你可以使用Docker快速上下扩展应用和服务。Docker这种扩展速度接近实时。

实现更高的密度和运行更多的负载

Docker是轻量且快速的。它提供一个可行的、高性能的替代基于hypervistor虚拟机的方案。这在高密度的环境中特别有用:例如,构建属于你自己的云或平台既服务。然而,它对中小型的部署也有帮助,当你的想在现有的资源下获得更多的性能。

Docker 有什么主要的组件?

Docker有两主要的组件:

  • Docker:开源容器虚拟平台。
  • Docker Hub:我们的软件既服务(saas)平台,用于分享和管理Docker容器。

注意:Docker采用开源Apache 2.0许可。

Docker的架构是什么样子?

Docker采用的是c/s的架构。Docker客户端和Docker守护进程通信,来完成构建、运行和分发你的Docker容器。Docker客户端和守护进程可以运行在同一系统下,或你可以使用一个Docker客户端连接到一个远程的Docker守护进程。Docker客户端和守护进程可以通过socket(套接字)或RESTful API进行通信。

Docker Architecture Diagram

Docker守护进程

如上图所示,Docker守护进程运行在宿主机上。用户不能直接跟守护进程交互,需要经过Docker客户端。

Docker客户端

Docker客户端,docker 二进制格式,是用户和Docker交互的主要接口。它可以接收用户的指令,实现和Docker守护进程的双工通信。

Docker内部构造

为了理解Docker的内部构建,你需要了解三个组件:

  • Docker 镜像
  • Docker 注册中心(registry)
  • Docker 容器

Docker 镜像

一个Docker镜像是一个只读模板。例如,一个镜像可能包含一个安装了Apache和你的web应用的Ubuntu操作系统。镜像通常用于创建容器。Docker提供一个简单的方法去构建一个新的镜像或更新已存在的镜像,或你可以下载其他人已经创建好的镜像。Docker镜像是Docker的构建组件。

Docker 注册中心(registry)

Docker注册中心可以保存镜像。目前有分私有和公共注册中心,你对它们进行镜像上传或下载操作。公共Docker注册中心是 Docker Hub提供的。它为你提供海量的、可用的镜像集合。你可以自己创建或使用他人预先创建的镜像。Docker注册中心是Docker的分发组件。

Docker 容器

Docker容器类似一个目录。一个docker容器保存着运行应用的所有东西。每个容器都是有镜像创建的。Docker容器可以被运行、启动、迁移和删除。每个容器都是一个独立且安全的应用平台。Docker容器是Docker的运行组件。

Docker是如何工作?

到目前为止,我们已经学习了:

  1. 你可以构建一个包含你的应用的镜像。
  2. 你可以基于Docker镜像创建Docker容器去运行你的应用。
  3. 你可以通过Docker Hub 或你自己注册中心分享你的镜像。

让我们瞧一瞧,如何联合这些组件(元素)在一起让Docker工作。

Docker 镜像是如何工作?

我们已经知道Docker镜像只是一个只读的模板。每个镜像都是有一连串的层组成的。Docker使用联合文件系统使这些层联合到一个单一的镜像里。联合文件系统允许单独文件系统的文件和目录,一般称为分支,采用透明的覆盖,形成一个连贯的文件系统。

Docker之所以被称为轻量级的一个原因是这些层。当你更改一个Docker镜像——例如,将应用更新一个版本——获得一个新构建的层。因此,不是替换整个镜像或全部重构,相对一个虚拟机上做些事情,你只是添加或更新一个层,而不是全部。

每个镜像都是从一个基础镜像开始,例如, ubuntu,一个Ubuntu 基础镜像,或者fedora,一个Fedora基础镜像。你可能也使用自己的镜像作为基础来构建一个新的镜像,例如,如果你有一个Apache的基础镜像,你可以使用它作为你所有的web应用镜像基础镜像。

注意:Docker通常会从Docker Hub获取这些基础镜像。

Docker镜像是由这些基础镜像和一些列简单的、描述性的指令集来构建的。每条指令都会在镜像里创建一个层。指令包括像如下的行为:

  • 运行一条命令
  • 添加一个文件或文件夹
  • 创建一个环境变量
  • 当基于这个镜像运行一个容器时,需要运行什么程序

这些指令会被保存在一个称为Dockerfile的文件里。当你发送一个构建镜像指令时,Docker会解析这个Dockerfile文件,执行里面的指令,返回一个最终的镜像。

Docker 注册中心(registry)是如何工作?

Docker注册中心是用来保存你的Docker镜像。一旦你构建完一个Docker镜像,你就可以把它推送到一个注册中心,比如,由Docker Hub提供的一个公共注册中心或运行在你的防火墙后面的注册中心。

使用Docker客户端,你可以搜索那些已经存在的公共镜像并下载它们到你的Docker宿主机上,然后基于它们构建你的容器。

Docker Hub 为镜像提供公共和私有两种注册中心。公共的存储可以给任何人搜索和下载。私有的存储不会出现在搜索结果里,它只允许你和你的用户下载镜像。你可以在这注册一个注册中心计划

容器是如何工作?

一个容器是由一个操作系统、用户附加的文件和元数据。正如我们所看到的,每个容器都是基于一个镜像构建的。那个镜像告诉Docker,创建的容器需要保存什么,容器启动的时候需要运行什么程序,和各种其他的配置数据。Docker镜像是只读的。当Docker基于一个镜像创建运行一个容器时,它就在镜像(使用一个联合文件系统,正如我们前面看到)的顶层添加了一层可读写层,你的应用就是这里运行。

当你运行一个容器时,发生了什么?

不管是使用docker 二进制或API,Docker客户端告诉|Docker守护进程要运行一个容器。

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

然我们分析一下这个命令。Docker客户端是使用docker二进制加上run 选项去告诉守护进程,它想启动一个新的容器。Docker守护进程要运行这个容器,要求Docker客户端必须提供下面信息:

  • 容器是基于那个Docker镜像构建的,这里是 ubuntu 一个Ubuntu的基础镜像。
  • 当容器启动时候,你希望运行的命令,这里是/bin/bash,在新容器里启动Bash shell。

当我们运行这个命令时,底层发生了什么?

按顺序,Docker做了一下事情:

  • 拉取 ubuntu 镜像:Docker 检查ubuntu 镜像是否存在,如果它在宿主机上不存在,之后,Docker会从Docker Hub上下载它。如果镜像已经存在,之后Docker使用它创建一个新容器。
  • 创建一个新容器:一旦Docker拥有这个镜像,它就会使用这个镜像创建一个容器。
  • 分配一个文件系统并挂载一个读写层:容器被创建在文件系统里且在镜像里添加一个可读写层。
  • 分配一个网络/网桥接口: 创建一个允许容器和宿主机通信的网络接口。
  • 设置一个IP地址:从一个可用的IP地址池里查找并附加到容器里。
  • 执行你指定的程序:运行你的应用,等。
  • 抓取并提供应用的输出:连接日志标准输入、输出、错误输出应用运行情况。

你现在已经拥有一个运行的容器!这里,你可以管理你的容器,和你的应用交互,然后,结束、停止和删除你的容器。

底层技术

Docker使用Go语言,基于Linux内核几个特性实现我们所需的功能。

命令空间

Docker利用一个称为namespaces 技术为我们的容器提供一个孤立的工作空间。当你运行一个容器时,Docker为那个容器创建一套命名空间。

这样就提供一层隔离:一个容器的各个方面都运行在它自己的命令空间并没有访问其他的命令空间。

Docker使用的命令空间:

  • pid 命令空间:用于进程隔离(PID:进程ID)
  • net 命令空间:用于管理网络接口(NET:网络)
  • ipc 命令空间:用于管理IPC资源的访问(IPC:进程间通信)
  • mnt 命令空间:用于管理挂载点(MNT:挂载)
  • uts 命令空间:用于隔离内核版本标识符。

cgroup

Docker也使用另外一种称为cgroups 的技术或控制族群。孤立运行应用的关键是它们只使用你需要的资源。这样确保容器可以合理的使用宿主机上的资源。控制族群允许Docker去分享可用的硬件资源给容器,如果需要,可以设置限制和约束。例如,限制指定容器的可用内存。

联合文件系统

联合文件系统,或UnionFS,通过创建层,使得他们非常轻量和快速。Docker使用联合文件系统提供构建容器块。Docker可以使用几个联合文件系统变体:AUFS、btrfs、vfs和DeviceMapper。

容器格式

Docker联合这些组件成一个包,我们成为一个容器格式。默认的容器格式被称为 libcontainer 。Docker也支持传统的Linux容器,使用LXC。在未来,Docker可能还支持其他容器格式,例如,通过整合BSD Jails或Solaris Zones。

来源: <https://docs.docker.com/introduction/understanding-docker/>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章