1、Docker架构

a、Docker客户端和服务端

  Docker是客户-服务器(C/S)架构的程序。Docker客户端只需向Docker服务器或守护进程发出请求,服务器或守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具docker以及一整套RESTful APICD。你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。下图描绘了Docker的架构:

b、Docker架构图  

c、Docker run 运行流程图

2、Docker三要素

2.1、Docker镜像

  镜像是容器构建的基石,是基于联合文件系统的一种层式结构。由一系列指令构建,是一种轻量级、可执行的独立软件包,用于打包软件运行环境和基于运行环境开发的软件(代码、运行时、库、环境变量和配置文件)。

  联合文件系统(UnionFS)是一种分层、轻量级、高性能的文件系统。它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一虚拟文件系统下。Union文件系统是Docker镜像的基础。

  典型的Linux文件系统由bootfs和rootfs两部分组成,bootfs(boot file system)主要包含 bootloader和kernel,bootloader主要是引导加载kernel,当kernel被加载到内存中后 bootfs就被umount了。 rootfs (root file system) 包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc等标准目录和文件,rootfs就是不同操作系统的发行版。

  Docker容器的文件系统类似于Linux虚拟化栈。Docker镜像是由文件系统叠加而成。最底端是一个引导文件系统,即bootfs, 很像典型的Linux/Unix的引导文件系统。当一个容器启动时,首先加载bootfs用于引导重要文件,当容器启动后,bootfs引导文件系统会被卸载(unmount)。

  传统的Linux引导过程中,root文件系统会最先以只读的方式加载,当引导结束并完成了完整性检查之后,rootfs将会从read-only改为read-write。
Docker的镜像加载时,在bootfs自检完毕之后并不会把rootfs的read-only改为read-write。而是利用联合加载union mount(UnionFS的一种挂载机制)将一个或多个read-only的rootfs加载到之前的read-only的rootfs层之上。在加载了这么多层的rootfs之后,仍然让它看起来只像是一个文件系统,在Docker的体系里把union mount的这些read-only的rootfs叫做Docker的镜像。

  一个镜像可以放到另一个镜像的顶部。位于下面的镜像称为父镜像(parent image), 依次类推,直到镜像栈的最底部,最底部的镜像称为基础镜像( base image)。最后,当从一个镜像启动容器时,Docker会在该镜像的最顶层加载一个读写文件系统。镜像可以通过分层来进行继承,基于基础镜像可以制作各种具体的应用镜像。
  此时的每一层rootfs都是read-only的,在镜像启动容器的最后阶段,Docker会在该镜像的最顶层加载一个读写read-write的rootfs文件系统,我们想在Docker中运行的程序就是在这个读写层中执行的。

  当Docker第一次启动一个容器时,初始的读写层是空的。当文件系统发生变化时,这些变化都会应用到这一层上。比如,如果想修改一个文件,这个文件首先会从该读写层下面的只读层复制到该读写层。该文件的只读版本依然存在,但是已经被读写层中的该文件副本所隐藏。
这种机制被称为写时复制C copy on write), 这也是使Docker如此强大的技术之一。 每个只读镜像层都是只读的,以后永远不会变化。当创建一个新容器时,Docker会构建出一个镜像栈,并在栈的最顶端添加一个读写层。这个读写层再加上其下面的镜像层以及一些配置数据,就构成了一个容器。容器的这种特点加上镜像分层框架( image-layering framework), 使我们可以快速构建镜像并运行包我们自己的应用程序和服务的容器。
docker本地镜像保存在 /var/lib/docker ,容器保存在 /var/lib/docker/containers 。
  总结:Docker镜像(image)就是一个只读的模板。 镜像可以用来创建Docker容器,一个镜像可以创建很多容器。

镜像分层优势

  共享资源:通过引入分层技术,可以增加镜像复用度,减少磁盘占用;同时可以实现差分上传下载,加快镜像pull、push性能。

2.2、Docker容器

  Docker利用容器(container)独立运行的一个或者一组应用。容器是利用镜像创建的运行实例(相对于Java中的类和对象的概念)。容器可以被启动、开始、停止、删除。每个容器都是互相隔离的,保证安全的平台。可以把容器看做是一个简易版的Linux环境 (包括root用户名权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
  容器的定义和镜像几乎是一模一样的,也是一堆层的统一视角, 唯一区别的是容器的最上面那一层是可读可写的。
  容器是镜像启动或执行阶段。Docker中的每个容器都包含了一个软件镜像,该镜像可以被创建、启动、关闭、重启和销毁。

2.3、Docker仓库Registry

  仓库(repository)是集中存放镜像文件的场所 。最大的公开仓库是docker hub( https://hub.docker.com/), 存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云、网易云等。
  Docker Hub中有两种类型的仓库:用户仓库(user repository)和顶层仓库(top-level repository)。用户仓库的镜像都是由Docker用户创建的,而顶层仓库则是由Docker内部的人来管理的。
用户仓库的命名由用户名和仓库名两部分组成,如:jamtur01/puppet。用户名:jamtur01,仓库名:puppet。
顶层仓库只包含仓库名部分,如ubuntu仓库。顶层仓库由Docker公司和由选定的能提供优质基础镜像的厂商(如Fedora团队提供了fedora镜像)管理,用户可以基于这些基础镜像构建自己的镜像。
  仓库(repository)和仓库注册服务器(registry)是有区别的。仓库注册服务器上往往放着很多个仓库,每个仓库中又包含了很多个镜像,每个镜像有不同的标签(tag)。使用示例:仓库名:TAG号。

总结:

  Docker本身是一个容器运行载体或者称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就叫image镜像文件。 只有通过这个镜像文件才能生成docker容器。image文件可以看做是容器的模板。 Docker根据image文件生成容器的实例。 同一个image文件,可以生成多个同时运行的容器实例。
  a)image文件生成的容器实例,本身也是一个文件,称为镜像文件;
  b)一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器;
  c)至于仓库,就是放了一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候从仓库中拉下来就可以了。

  • 作者:
    DeepInThought


    出处:
    https://www.cnblogs.com/DeepInThought


    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • Docker架构及其三要素的更多相关文章

    1. Docker Note1——架构和三要素

      Docker官方文档: https://docs.docker.com/ 一.docker架构 C/S架构,主要由 client / daemon / containers / images 组成. ...

    2. Docker 架构详解 - 每天5分钟玩转容器技术(7)

      Docker 的核心组件包括: Docker 客户端 - Client Docker 服务器 - Docker daemon Docker 镜像 - Image Registry Docker 容器 ...

    3. 每天学一点Docker(5)——了解Docker架构

      Docker的核心组件: 1.Docker客户端 - Client 2.Docker服务器 - Docker deamon 3.Docker镜像 - Image 4.仓库 - Registry 5.D ...

    4. 007、Docker 架构详解(2018-12-24 周一)

      参考https://www.cnblogs.com/CloudMan6/p/6763789.html     Docker核心组件包括:       Docker 客户端   Docker Clien ...

    5. 第 2 章 容器架构 - 007 - Docker 架构详解

      Docker 的核心组件包括: Docker 客户端 - Client Docker 服务器 - Docker daemon Docker 镜像 - Image Registry Docker 容器 ...

    6. Docker源码分析(一):Docker架构

      1 背景 1.1 Docker简介 Docker是Docker公司开源的一个基于轻量级虚拟化技术的容器引擎项目,整个项目基于Go语言开发,并遵从Apache 2.0协议.目前,Docker可以在容器内 ...

    7. 1、Docker 架构详解

      本文来自clouldman ,有增删. Docker 的核心组件包括: Docker 客户端 - Client Docker 服务器 - Docker daemon Docker 镜像 - Image ...

    8. Docker 架构详解

      Docker 的核心组件包括: Docker 客户端 - Client Docker 服务器 - Docker daemon Docker 镜像 - Image Registry Docker 容器 ...

    9. Docker 架构原理及简单使用

      提示:文中有些内容为大神的博客内容,就不统一标注那里引用,只是再最下面标注参考连接谢谢 一.简介 1.了解docker的前生LXC LXC为Linux Container的简写.可以提供轻量级的虚拟化 ...

    随机推荐

    1. LC 966. Vowel Spellchecker

      Given a wordlist, we want to implement a spellchecker that converts a query word into a correct word ...

    2. git分支名大小写问题导致分支push到远程失败

      windows系统不识别文件夹大小写导致 本地分支master, 在master上面新建一个分支Hotfix/aa 由于Hotfix首字母大写,所以windows系统会在 项目.git\refs\he ...

    3. 在发布ASP.NET网站的时候,出现state server错误

      错误信息如下: 在发布ASP.NET网站的时候,出现state server错误: Server Error in '/' Application. ------------------------- ...

    4. HAproxy负载均衡-ACL篇(转) blog.csdn.net/tantexian

      ACL定制法则: 开放策略:拒绝所有,只开放已知 拒绝策略:允许所有,只拒绝某些 事实上实现安全策略,无非也就是以上两种方法 redirect 参考:http://cbonte.github.io/h ...

    5. 关于bootstrap按钮的偏移

      <body> <div id="divForm" class="addView"> <div class="form-h ...

    6. dokcer部署code-server web版vscode

      #dokcer部署code-server web版vscode codercom/code-server:latest不支持插件在线安装 codercom/code-server:v2目前为最新版1. ...

    7. Django中间件梳理

      Django之中间件   中间件简介 什么是中间件 中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间 ...

    8. redis外网无法连接问题

      1.外网无法连接redis 解决方法: 把redis.conf里的bind 127.0.0.1注释掉,不行的话把127.0.0.1修改成0.0.0.0 2.make的时候显示没有gcc 解决方法: 安 ...

    9. 将json文件转化为可视化

      利用python转化为可视化: python -mjson.tool

    10. 查看自身公网ip的命令

      curl ifconfig.me curl cip.cc curl ipinfo.io