热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

dockerserver(moby)源码窥探

docker服务端的代码,已经被单独划分为一个仓库:moby。此文将分析dockerd在启动过程中的重要步骤。为了节省篇幅,突出显示重要部


docker 服务端的代码,已经被单独划分为一个仓库:moby。此文将分析dockerd在启动过程中的重要步骤。为了节省篇幅,突出显示重要部分,在源码的截图中将以…代替次要的逻辑,仅保留重要的信息。

入口函数main()

入口函数在/root/go/src/github.com/docker/docker/cmd/dockerd/docker.go中。

在main() 函数中,除基本的设置外,包含两个重要的函数,分别为newDaemonCommand()和Execute()。newDaemonCommand()返回一个dockerd命令,Execute()则负责执行这个命令。

在这里插入图片描述

newDaemonCommand()

newDaemonCommand() 与 docker-cli中设置命令的方法类似,其中最主要的还是runE字段的对应的函数,后面在执行的过程中,会调用该函数。

除了runE字段外,还包括一些flag参数设置,这些都不涉及重要的流程。

在这里插入图片描述

Execute()

Execute() 内部直接调用了ExecuteC()

在这里插入图片描述

ExecuteC()

ExecuteC()中先通过Find() 获取解析出实际的命令,此处如果是没有子命令的场景,其实c 和 cmd变量是同样的内容。相当于没有变化。具体的Find()执行过程,与docker-cli项目中的Find()是一样的,详情可以移步至:https://zhh0427.blog.csdn.net/article/details/127796562

获取到cmd之后,通过execute(), 执行该命令,

在这里插入图片描述

execute()

execute()中主要的就是RunE()的调用,当然还包括一些其他的前置和后置处理,这里就不赘述了。

在这里插入图片描述

此处调用的RunE,即是在newDaemonCommand()中设置的RunE字段,可以发现RunE中的runDaemon()其实才是真正开始运行服务,之前的都是为dockerd这个命令做的配置,都是铺垫此处的。

在这里插入图片描述

runDaemon()

runDaemon()的整体逻辑也比较简单,就是先实例化一个DaemonCli(), 接着开启该Cli。

在这里插入图片描述

start()

start()包含对DaemonCli的配置、初始化、以及对操作系统的适配、基础环境的创建、swarm、集群模式的配置等等一系列的操作,这里很难一一讲清楚。不过,其中与日常单机使用最相关的,当属apiServer部分的逻辑。

这部分逻辑中,主要分为三个步骤:1. 先创建apiServerConfig 配置 2. 根据配置初始化路由,即各个api对应函数 3.路由初始化完成后,通过开启协程开始监听客户端的发来的请求。其中配置部分的逻辑比较简单,更重要的是initRouter()和cli.api.Wait()。

在这里插入图片描述

initRouter()

在initRouter()中,可以发现通过NewRouter()各个模块的实例化路由的动作,包括 容器相关、镜像相关、挂载卷相关的等等。

在实例化完成后,最终调用InitRouter()对所有的路由作进一步处理。

在这里插入图片描述

NewRouter()

这里仅对container.NewRouter()做分析,其他的模块都是相似的逻辑。NewRouter()中直接调用了initRoutes()。而initRoutes()中包含了大量的url注册,其中值得注意的是/containers/json, 不知道是否还记得,docker ps -a 最终发起的http请求的路径,没错就是该路由(如果不清楚,请移步至:https://zhh0427.blog.csdn.net/article/details/127796562)。

由此可见,执行docker ps -a 获得的数据,其实是通过此处返回的,getContainersByName()具体的执行逻辑,这里就不赘述了,请自行查阅。
在这里插入图片描述

在这里插入图片描述

InitRouter()

在InitRouter()中,似乎是仅仅将各个路由赋值给了s.routers,其他啥也没干,其实不然,请记住这里的s.routers。

在这里插入图片描述

Wait()

在Wait()中,通过serverAPI()开启对各个路由的监听。

在这里插入图片描述

serveAPI()

在serverAPI()中,通过createMux() 初始化服务器使用的各个路由,然后通过Server开启监听。

在这里插入图片描述

createMux()

在createMux()中,可以发现前面被赋值的s.routers 在这里发挥了作用。通过遍历每一个routers中的所有route,并为其注册路由。

在这里插入图片描述

Serve()

最终在Server() 中,监听路由,等待客户端发来的请求,并分发到对应的处理器中。

在这里插入图片描述

至此,整个docker-server的启动主要过程就结束了。除了上述这些我认为重要的步骤,还有很多很多其他的步骤。很难在短时间内完全搞清楚,也很难一一讲清楚,具体的实现细节,还需要读者自行去查阅源代码。这里提供一个搭建docker源码阅读环境的教程:https://zhh0427.blog.csdn.net/article/details/127797712。

如果上述有错误的地方,还请评论区指正,谢谢!






推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • 解决Sharepoint 2013运行状况分析出现的“一个或多个服务器未响应”问题的方法
    本文介绍了解决Sharepoint 2013运行状况分析中出现的“一个或多个服务器未响应”问题的方法。对于有高要求的客户来说,系统检测问题的存在是不可接受的。文章详细描述了解决该问题的步骤,包括删除服务器、处理分布式缓存留下的记录以及使用代码等方法。同时还提供了相关关键词和错误提示信息,以帮助读者更好地理解和解决该问题。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
author-avatar
智勇双全882602900857_984
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有