Docker 2 之 Docker 基本概念与架构

学习内容整理笔记来自 极客学院的 docker 入门教程,更多信息查看 Docker 文档

二. Docker 的基本组成

Docker 包含以下基本组成:

  1. 客户端(Docker Client)
  2. 守护进程(Docker Daemon)
  3. 镜像(Docker Image)
  4. 容器(Docker Container)
  5. 仓库(Docker Registry)

Docker 包括三个基本概念:镜像(Image)、容器(Container)、仓库(Repository)。理解了这三个概念,就理解了 Docker 的整个生命周期。

1.Docker 客户端/守护进程

Docker 是 C/S 架构的程序,Docker 客户端向 Docker 服务器端(即 Docker 的守护进程)发出请求。等 Docker 的守护进程处理完所有的工作并返回结果。Docker 客户端对服务器端的访问既可以是在本地也可以通过远程访问。

理解 Docker C/S 架构
Docker 2 之 Docker 基本概念与架构_第1张图片

通过 Docker 客户端执行各种命令,然后 Docker 客户端会将这些命令发送给守护进程。守护进程执行的结果传回给客户端,使我们可以通过客户端来查看命令执行的结果。

守护进程(Docker Daemon)
守护进程创建并管理 docker 对象,如镜像,容器,网络和数据卷等。

Docker引擎 是一个 客户端-服务端 架构的应用,它由以下主要组件构成:

  • 一种长期运行的叫做守护进程(daemon process)的服务(dockerd 命令)
  • 一套 REST 型的 API,它给程序提供了用来连接守护进程并给守护进程发送指示的接口
  • 一套命令行用户接口(CLI)(docker 命令)

Docker 2 之 Docker 基本概念与架构_第2张图片

命令行接口使用 docker 提供的 REST型 的 API 来控制或和 docker守护进程 交流,可以使用脚本或直接发送命令。很多其他 docker应用 会使用更底层 API 或命令行接口。

注意: Docker 遵循 apache2.0 开源协议

2. 镜像(Docker Image)

Docker 镜像就是一个只读的模板, 镜像是 Docker 容器的基石,容器基于镜像启动和运行。镜像好比容器的源代码保存了用于启动容器的各种条件。例如一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。

Docker 2 之 Docker 基本概念与架构_第3张图片

那么,再深一层次理解,Docker 镜像是一个层叠的只读文件系统,而它最低端是一个引导的文件系统(即 bootfs)。这很像典型的 Linux 引导文件系统,Docker 用户几乎永远与引导文件系统有交互。实际上,当一个容器启动后,它将会被移到内存中而引导文件系统将会被卸载。而 Docker 镜像的第二层是 rootfs(Ubuntu) 文件系统,它位于引导文件系统之上。root 文件系统可以是一种或多种操作系统。比如 Ubuntu 以及 Centos 等。在传统的 Linux 引导过程中,root 文件系统会最先以只读的形式加载。当引导结束并完成了完整性检测后,它才会被切换为读写模式。但在 Docker 里,root 文件系统永远只能是只读状态。并且 Docker 利用联合加载技术又会在 root 文件系统之上加载更多的只读文件系统。联合加载指的是,一次同时加载多个文件系统。但在外面看起来只加载一个文件系统。联合加载会将各层系统叠加到一起,让最终的文件系统会包含所有的底层文件和目录。Docker 将这样的文件系统称为镜像。一个镜像可以放到另一个镜像顶部,对于下面的镜像称为副镜像。依次类推直到镜像站到最底部,最底部的镜像称为基础镜像。也就是图中镜像栈中的 root 文件系统。


Note:镜像可以用来创建 Docker 容器,Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

3.容器(Docker Container)

Docker 利用容器来运行应用,容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括 root 用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。镜像是只读的,容器在启动的时候创建一层可写层作为最上层。


1.容器通过镜像来启动

Docker 的容器是 Docker 的执行来源。容器中可以运行客户的一个或者多个进程。

Docker 2 之 Docker 基本概念与架构_第4张图片

2.启动和执行阶段
如果说镜像是 Docker 生命周期中的构建或打包阶段,那么容器则是启动和执行阶段。

容器怎样通过镜像来启动?
当一个容器启动时,Docker 会在该镜像的最顶层加载一个读写文件系统,也就是一个可写的文件层。在 Docker 中运行的程序,就是在这个层中执行的。当 Docker 第一次启动应用容器时,初始的读写层是空的。当文件系统发生变化时,这些变换都可以运用到这一层上。比如,如果想修改应用文件,这个文件首先会从该读写层下面的只读层复制到该读写层。该文件的只读版本依然存在,但是已经被读写层中的该文件副本所隐藏。这就是一个 Docker 中一个重要的技术。

3.写时复制(copy on write)

每个只读镜像层都是只读的,并且以后永远不会变化。当创建一个新容器时, Docker 会创建一个镜像栈,就像图中所表现的。在栈的最顶层添加可写层,这个读写层加上下面的镜像层以及一些配置数据就构成了一个容器。容器的这个种特点加上镜像分层的框架使我们可以快速地构建镜像并运行包含我们自己的应用程序和服务的容器。

4.仓库(Docker Registry)

仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

Docker 用仓库来保存用户构建的镜像,仓库分为 公有私有 两种,Docker 公司自己提供了一个公有的私有仓库,叫做 Docker Hub。我们可以在 Docker Hub上去注册账号,分享并保存自己的镜像。目前 Docker Hub 已经有了丰富的 Docker 镜像。所以,我们可以通过 Docker Hub 来查找我们需要的镜像,为我们节省了很多构建镜像的时间。当然我们也可以架设自己私有的仓库。

最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool 等,可以提供大陆用户更稳定快速的访问。当然,用户也可以在本地网络内创建一个私有仓库。当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。其实,Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。

Docker 2 之 Docker 基本概念与架构_第5张图片

这张图一目了然的介绍了 Docker 的各个组成部分的关系,通过客户端来访问 Docker 的服务端从而操作 Docker 容器。而容器是经过镜像来创建,而镜像又保存在仓库中。

Docker 2 之 Docker 基本概念与架构_第6张图片

这里有个 Docker 官方模拟器 可以在线演示 Docker

你可能感兴趣的:(Docker)