docker源码分析(4)---execdriver

说明:此文章为腾讯云机器自动从本人csdn博客搬迁过来。是本人授权操作。

申明:无本人授权,不可转载本文。如有转载,本人保留追究其法律责任的权利。

龚浩华,QQ 29185807,月牙寂 道长

第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang

execdriver通过lxc或者libcontainer来实现资源隔离。本文就来简单分析下execdriver。

1、上层初始化

代码在docker\daemon\daemon.go

在函数NewDaemonFromDirectory中

初始化了execdriver,并将其赋值到daemon的成员变量中。

这里就是execdriver的开启地方。

2、execdriver插件

目前execdriver支持两种模式

代码在docker\daemon\execdriver\execdrivers\execdrivers.go

这里面有lxc模式,还有native模式(这个模式其实就是对libcontainer的封装)

2.1、Driver接口

然后我们看看Driver的接口

代码在docker\daemon\execdriver\driver.go

看到这里,我们就应该很兴奋了,这里就封装了容器的运行。

里面的参数都需要一个Command

我们看看这个结构体

封装了容器运行所需要的参数

其中command里面有几个成员是比较值得注意的。

上面两个是Network的信息,这个就需要用到networkdriver了

还有ipc、pid、resources、mount等就不贴图出来了。

3、native

下面就简单看下native的driver

代码在docker\daemon\execdriver\native\driver.go

先看结构体

里面有一个activeContainers用于保存container

接着是初始化函数

里面封装了libcontainer的东西

下面我们看看其提供的一些操作

3.1、createContainer

在看createContainer之前我们先看看InitContainer

代码在docker\daemon\execdriver\driver.go

做了一些参数的设置

下面我们进入createContainer

代码在docker\daemon\execdriver\native\create.go

先初始化Container,然后创建ipc、pid、network

设置了capabilities和groups

设置mount,labels,还有limit,最后返回了libContainer中的对象Container

3.2、 Run

代码在docker\daemon\execdriver\native\driver.go

先创建了Container,然后初始化了一个process

接着设置tty

然后又封装了一层,由libcontaer的Factory生成了cont

最后将cont添加到了activeContainers(这个就是driver结构体中用来保存的Container的一个map)

下面就是启动了

3.3、Exec

我们看源码

代码在docker\daemon\execdriver\native\exec.go

exec流程和Run流程基本是一样的,不同的地方就是Run是新创建Container,而exec则是从activeContainer中去查找已经创建过的Container

查找到了之后,流程就是一样的了

3.4 Kill

代码在docker\daemon\execdriver\native\driver.go

kill很简单,就是查找到相对于的Container,然后发送一个信号给他

3.5 小结

还有很多的操作,这里就不一一贴图出来了。大致的流程应该是比较清晰了。如果还需要继续深入的话,那就需要去分析libContainer的代码了

4、总结

execdriver依旧采用的插件方式。代码还是很清晰的。只是底层涉及到lxc和libContainer,如果还需要继续深入的话,就需要对这两个东西做一些分析。

文中如果有哪里讲解的不对的地方,还请见谅,望指正。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏芋道源码1024

消息队列中间件 RocketMQ 源码分析 —— Message 存储

1、概述 2、CommitLog 结构 3、CommitLog 存储消息 MappedFile#落盘 FlushRealTimeService CommitR...

38113
来自专栏Java Edge

Jedis总览Jedis简介源码赏析

Jedis简介 作为Redis官方推荐的三个Java Client之一,Jedis推出时间最早,使用最为广泛(Spring默认使用的Redis Client就是...

3247
来自专栏Java后端技术

详解web.xml中元素的加载顺序

  最近在项目中遇到了启动时出现加载service注解注入失败的问题,后来经过不懈努力发现了是因为web.xml配置文件中的元素加载顺序导致的,那么就抽空研究了...

862
来自专栏IMWeb前端团队

Ques前端组件化体系(一)

Ques是一套组件化系统,解决如何定义、嵌套、扩展、使用组件。 项目地址:https://github.com/miniflycn/Ques 传统开发模式的痛点...

21010
来自专栏全华班

java招聘面试

过完年了,好多学习JAVA的同学在忙着找工作,大家先预习下这些基础知识 ,说不定能面试的时候考到。 基础篇 1 什么是Java、Java2、JDK?JDK后面...

3455
来自专栏JarvanMo的IT专栏

Dart In Action -Dart快速入门(-)

本文基本上是将dart官网部分内容进行翻译,没兴趣的请出门左转至Dart的官网,有兴趣的同志请继续阅读本文。 Flutter教程在这里

602
来自专栏那些年遇到的坑

前端性能优化(一)

前端是庞大的,包括 HTML、 CSS、 Javascript、Image 、Flash等等各种各样的资源。前端优化是复杂的,针对方方面面的资源都有不同的方式。...

1242
来自专栏应兆康的专栏

Python Web - Flask笔记4

这个方法用来添加url与视图函数的映射。如果没有填写endpoint,那么默认会使用view_func的名字作为endpoint。以后在使用url_for的时候...

512
来自专栏java技术学习之道

2分钟带你理解IOC

1244
来自专栏更流畅、简洁的软件开发方式

我的网站的结构说明

不知道大家有没有看懂这个图。这个是我的网站(不包括后台管理)的结构图。基本上和三层架构有些相似,但是有三个不同的地方:    一、 数据访问层。 1、数据访问层...

1708

扫描关注云+社区