《容器技术系列》一1.4 Docker运行案例分析

本节书摘来华章计算机《容器技术系列》一书中的第1章 ,第1.4节,孙宏亮 著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.4 Docker运行案例分析

1.3节着重介绍了Docker架构中各个模块的功能,学完后我们可以对Docker的架构有一个宏观的认识。熟悉一款软件,研究一个系统,从静态的角度认识架构的各个模块,仅仅是第一步;从动态的角度,掌握软件或者系统的运行原理,即熟知架构中模块间的通信逻辑,无疑会让自己对软件或系统的理解更上一层楼。本节将从实际的Docker运行案例出发,串联Docker各模块,从而学习Docker的运行流程。分析原型为Docker中的docker pull与docker run两个命令。

1.4.1 docker pull

1.3节中我们提到,用户可以为容器指定镜像,作为容器运行时的rootfs,既然如此,镜像从何而来则成为一个关键。答案很简单,一切都归功于docker pull命令。
docker pull命令的作用是:Docker Daemon从Docker Registry下载指定的容器镜像,并将镜像存储在本地的Graph中,以备后续创建Docker容器时使用。docker pull命令的执行流程如图1-10所示。
图1-10中有编号的箭头表示docker pull命令在发起后,Docker架构中相应模块所做的一系列运行操作。下面我们逐一分析这些步骤。
1)Docker Client处理用户发起的docker pull命令,解析完请求以及参数之后,发送一个HTTP请求给Docker Server,HTTP请求方法为POST,请求URL为"/images/create?"+"xxx",实际意义为下载相应的镜像。
2)Docker Server接收以上HTTP请求,并交给mux.Router,mux.Router通过URL以及请求方法类型来确定执行该请求的具体handler。
3)mux.Router将请求路由分发至相应的handler,具体为PostImagesCreate。
4)在PostImageCreate这个handler之中,创建并初始化一个名为"pull"的Job,之后触发执行该Job。
5)名为"pull"的Job在执行过程中执行pullRepository操作,即从Docker Registry中下载相应的一个或者多个Docker镜像。
6)名为"pull"的Job将下载的Docker镜像交给graphdriver管理。
7)graphdriver负责存储Docker镜像,一方面将实际镜像存储至本地文件系统中,另一方面为镜像创建对象,由Docker Daemon统一管理。

image

1.4.2 docker run

docker run命令的作用是创建一个全新的Docker容器,并在容器内部运行指定命令。Docker Daemon处理用户发起的这条命令时,所做工作可以分为两部分:第一,创建Docker容器对象,并为容器准备所需的rootfs;第二,创建容器的运行环境,如网络环境、资源限制等,最终真正运行用户指令。因此,在dockerrun命令的完整执行流程中,Docker Client给Docker Server发送了两次HTTP请求,第二次请求的发起取决于第一次请求的返回状态。docker run命令执行流程如图1-11所示。


image

图1-11中有编号的箭头表示dockerrun命令在发起后,Docker架构中相应模块所做的一系列运行。下面我们逐一分析这些步骤:
1)Docker Client处理用户发起的docker run命令,解析完请求与参数之后,向Docker Server发送一个HTTP请求,HTTP请求方法为POST,请求URL为"/containers/create?"+"xxx",实际意义为创建一个容器对象,即Docker Daemon程序逻辑中的容器对象,并非实际运行的容器。
2)Docker Server接收以上HTTP请求,并交给mux.Router,mux.Router通过URL以及请求方法来确定执行该请求的具体handler。
3)mux.Router将请求路由分发至相应的handler,具体为PostContainersCreate。
4)在PostContainersCreate这个handler之中,创建并初始化一个名为"create"的Job,之后触发执行该Job。
5)名为"create"的Job在运行过程中执行Container.Create操作,该操作需要获取容器镜像来为Docker容器准备rootfs,通过graphdriver完成。
6)graphdriver从Graph中获取创建Docker容器rootfs所需要的所有镜像。
7)graphdriver将rootfs的所有镜像通过某种联合文件系统的方式加载至Docker容器指定的文件目录下。
8)若以上操作全部正常执行,没有返回错误或异常,则Docker Client收到Docker Server返回状态之后,发起第二次HTTP请求。请求方法为"POST",请求URL为"/containers/"+container_ID+"/start",实际意义为启动时才创建完毕的容器对象,实现物理容器的真正运行。
9)Docker Server接收以上HTTP请求,并交给mux.Router,mux.Router通过URL以及请求方法来确定执行该请求的具体handler。
10)mux.Router将请求路由分发至相应的handler,具体为PostContainersStart。
11)在PostContainersStart这个handler之中,创建并初始化名为"start"的Job,之后触发执行该Job。
12)名为"start"的Job执行需要完成一系列与Docker容器相关的配置工作,其中之一是为Docker容器网络环境分配网络资源,如IP资源等,通过调用networkdriver完成。
13)networkdriver为指定的Docker容器分配网络资源,其中有IP、port等,另外为容器设置防火墙规则。
14)返回名为"start"的Job,执行完一些辅助性操作后,Job开始执行用户指令,调用execdriver。
15)execdriver被调用,开始初始化Docker容器内部的运行环境,如命名空间、资源控制与隔离,以及用户命令的执行,相应的操作转交至libcontainer来完成。
16)libcontainer被调用,完成Docker容器内部的运行环境初始化,并最终执行用户要求启动的命令。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456182.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3月22日AM

看了思维章节精讲视频课,并且总结了部分思维章节内容转载于:https://www.cnblogs.com/bgd140206102/p/6601440.html

阿里巴巴Dubbo实现的源码分析

Dubbo概述Dubbo是阿里巴巴开源出来的一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及作为SOA服务治理的方案。它的核心功能包括: remoting:远程通讯基础,提供对多种NIO框架抽象封装,包括“同步…

H264 CAVLC 研究

目录 1 CAVLC概念 2 CAVLC原理 3 CAVLC编码流程 4 CAVLC解码流程 展开全部 1 CAVLC概念 2 CAVLC原理 3 CAVLC编码流程 4 CAVLC解码流程 收起 摘要纠错编辑摘要 CAVLC即基于上下文的自适应变长编码。H.264标准中使用CAVLC对4*4模块的亮度和色度残差数据进行编码。 CAVLC-CAVLC…

instanceof 的运用

2019独角兽企业重金招聘Python工程师标准>>> Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。 用法: result object i…

R 脚本读取汇总 Excel 表格数据

主要用到了 xlsx 和 rJava 包,打开 Excel 文件,读取各表格数据,再写入到汇总表。 下图为处理前的原始数据表格: 下图为处理后的数据: 代码实现 安装&加载包的函数实现。installed.packages() 函数获取所有已安装…

【大数据】最新大数据学习路线(完整详细版,含整套教程)

大数据学习路线 java(Java se,javaweb) Linux(shell,高并发架构,lucene,solr) Hadoop(Hadoop,HDFS,Mapreduce,yarn,hive,hbase,sqoop,zookeeper,flume) 机器学习(R,mahout) Storm(Storm,kafka,redis) Spark(scala,spark,spark core,spark sql,spark streaming,spark mllib,spa…

谷歌浏览器开发调试工具中Sources面板 js调试等 完全介绍

这次分享的是Chrome开发工具中最有用的面板Sources。 Sources面板几乎是我最常用到的Chrome功能面板,也是在我看来决解一般问题的主要功能面板。通常只要是开发遇到了js报错或者其他代码问题,在审视一遍自己的代码而一无所获之后,我首先就会打…

【Python】最新Python学习路线(完整详细版,含整套教程)

python目前应用最广的三个岗位:全栈开发、数据分析、运维开发,今天我们就以这三个重点的岗位来做一下自学Python的规划,希望你在学之前就能有明确的学习方向。 最近开始整理python的资料,博主建立了一个qq群,希望给大家…

程序员,软件测试知多少?

送给初级程序员的测试认知文作为开发同学,一些基本的测试岗位相关知识还是很有必要了解一下,免的某些同学在工作中和测试同学斗嘴、打架、群殴等以及被测试鄙视....。 我们常常听说的一些测试专业术语,比如白盒、黑盒、单元测试,相…

vue 入门环境搭建

公司项目要用vue.js来开发,要使用vue来开发前端框架,首先要有环境,所以给大家介绍一下如何搭建vue环境。其实很简单: 1.首先下载安装node.js。 去官网https://nodejs.org/zh-cn/下载安装包。 2.安装webpack 打开cmd命令界面&#…

【解决】Win10修改host没有权限问题

Step1:右键文件选择属性,选择安全,点击编辑: Step2:在弹窗中点击添加,在弹窗中点击高级: Step3:在弹窗中点击立即查找,选中当前用户,点击确定: …

[已授权] 互联网定位技术小谈

​ 诚邀阿里云先知社区邀请,不胜感激!今日小编在此为大家介绍一下互联网中所应用的定位技术。互联网的发展日新月异,技术迭代很快,各行各业的智慧在互联网这片蓝天下碰撞结晶,造福大众。今天要讲述的集中定位方式&…

Python的DataFrame切片大全(包含多重索引)

码字不易,喜欢请点赞!!! 摘要 这篇主要讲解如何对pandas的DataFrame进行切片,包括取某行、某列、某几行、某几列、以及多重索引的取数方法。 • 选取行名、列名、值 • 以标签(行、列的名字)…

什么是数据分析的关键指标?

什么是核心关键指标呢? 这是一个好问题,不过没有标准的答案。企业性质不同,所处行业、发展阶段不同,关注点当然不同。不过大体可以这样来划分。 1、发展阶段不同,需求不同 对于一个想要做数据化管理的企业来说&#xf…

加密函数

MD5:密码为web页面做准备,建议使用MD5 PASSWORD() :修改当前用户或其他用户密码 mysql> SELECT MD5(admin); #对admin进行MD5的加密(32位)----------------------------------| MD5(admin) |--------------------------------…

如何使用notepad运行python程序

关于使用notepad运行python程序 首先要确保python解释器已经安装成功,查看方法,windows可以在命令提示符中查看,通过按下winR键,调出运行窗口,在输入框中输入cmd回车,然后在命令行中输入python,若出现版本信息,例如Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC…

插入排序:表折半插入

在前一篇插入排序:表插入中。我们用静态链表的存储方式。直接插入的策略,构建了一种新的插入排序算法:表插入。有人可能会想到:相同是静态链表的形式,为什么不使用更高效的折半插入策略呢?这样的想法真的非…

【机器学习】sklearn实现---归类为5大类

sklearn实现---归类为5大类 sklearn.preprocessing.scale()(最常用,易受异常值影响)sklearn.preprocessing.StandardScaler()sklearn.preprocessing.minmax_scale()(一般缩放到[0,1]之间,若新数据集最大最小值范围有变…

Kafka官方文档翻译——实现

IMPLEMENTATION 1. API Design Producer APIs Producer API封装了底层两个Producer: kafka.producer.SyncProducerkafka.producer.async.AsyncProducerclass Producer {/* Sends the data, partitioned by key to the topic using either the *//* synchronous or t…

【机器学习】熵、决策树、随机森林 总结

一、熵 公式: −∑i1np(xi)∗log2p(xi)-\sum_{i 1}^{n}{p(xi)*log_2p(xi)}−i1∑n​p(xi)∗log2​p(xi) ∑i1np(xi)∗log21p(xi)\sum_{i1}^{n}p(xi)*log_2\frac{1}{p(xi)}i1∑n​p(xi)∗log2​p(xi)1​ import numpy as np# 账号是否真实:3no&#xff…