Bridge driver数据结构如下所示:

type driver struct {
  config       *configuration
  network      *bridgeNetwork
  natChain     *iptables.ChainInfo
  filterChain    *iptables.ChainInfo
  isolationChain  *iptables.ChainInfo
  networks      map[string]*bridgeNetwork
  store        datastore.DataStore
  nlh         *netlink.Handle
  sync.Mutex
}

  

// driver/bridge/bridge.go

// Init registers a new instance of bridge driver

1、func Init(dc driverapi.DriverCallback, config map[string]interface{})

  1. 调用d := newDriver(),初始化driver数据结构
  2. 调用d.configure(config)对driver进行配置
  3. 创建c := driverapi.Capability{DataScope: datastore.LocalScope}
  4. 调用return dc.RegisterDriver(networkType, d, c)

configure数据结构如下所示:

// configuration info for the "bridge" driver
type configuration struct {
  EnableIPForwarding   bool
  EnableIPTables     bool
  EnableUserlandProxy  bool
  UserlandProxyPath   string
}

  

// driver/bridge/bridge.go

2、func (d *driver) configure(option map[string]interface{}) error

  1. 首先从option中解析出config
  2. 若config.EnableIPTables为真,则先调用removeIPChains(),再调用netChain, filterChain, isolationChain, err = setupIPChain(config)获取各个chain,最后,调用iptables.OnReloaded(func() {logrus.Debugf("Recreating iptables chains on firewall reloaded"); setupIPChain(config)})
  3. 若config.EnableIPForwarding为真,则调用setupIPForwarding(config.EnableIPTables)
  4. 接着对d.natChain,d.filterChain,d.isolationChain和d.config分别进行赋值
  5. 调用err = d.initStore(option)

--------------------------------------------------------- IPTables 配置 --------------------------------------------------------------------

// driver/bridge/setup_ip_tables.go

3、func setupIPChain(config *configuration) (*iptables.ChainInfo, *iptables.ChainInfo, *iptables.ChainInfo, error)

  1. 设置hairpinMode := !config.EnableUserlanProxy
  2. 调用netChain, err := iptables.NewChain(DockerChain, iptables.Nat, hairpinMode)
  3. 调用filterChain, err := iptables.NewChain(DockerChain, iptables.Filter, false),对于isolationChain的调用完全相同
  4. 调用err := addReturnRule(IsolationChain) ---->为该chain添加返回规则`iptables -I chain -j RETURN`

此函数只是创建了三个chain的实例,并将它们添加到主机中

// iptables/iptables.go

// NewChain adds a new chain to ip tables.

4、func NewChain(name string, table Table, hairpinMode bool) (*ChainInfo, error)

  1. 用参数填充c := &ChainInfo{},若table为空,则默认置为Filter
  2. 调用Raw("-t", string(c.Table), "-n", "-L", c.Name)和output, err := Raw("-t", string(c.Table), "-N", c.Name)添加chain,如果不存在的话,Raw函数直接调用iptables系统命令

ChainInfo数据结构如下所示:

// ChainInfo defines the iptables chain

type ChainInfo struct {
  Name       string
  Table       Table
  HairpinMode   bool
}

  

--------------------------------------------------- IP Forward 配置 ----------------------------------------------------

// driver/bridge/set_ip_forwarding.go

5、func setupIPForwarding(enableIPTables bool) error

  1. 首先调用ipv4ForwardData, err := ioutil.ReadFile(ipv4ForwardConf)获取当前IPv4 forward的状态,其中ipv4ForwardConf=/proc/sys/net/ipv4/ip_forward
  2. 若ipv4ForwardData[0]不为'1',则调用configureIPForwarding(true),其实就是将ipv4ForwardConf内容写为'1'
  3. 如果enableIPTables为假,则返回,否则调用iptables.SetDefaultPolicy(iptables.Filter, "FORWARDING", iptables.Drop),并且接着调用iptables.OnReloaded(..)

Docker Libnetwork Bridge插件实现代码分析----初始化部分的更多相关文章

  1. Docker Libnetwork Bridge插件实现代码分析----创建网络部分

    // drivers/bridge/bridge.go // Create a new network using bridge plugin 1.func (d *driver) CreateNet ...

  2. CNI bridge 插件实现代码分析

    对于每个CNI 插件在执行函数cmdAdd之前的操作是完全一样的,即从环境变量和标准输入内读取配置.这在http://www.cnblogs.com/YaoDD/p/6410725.html这篇博文里 ...

  3. 使用 Gradle 插件进行代码分析(转)

    代码分析在大多数项目中通常是作为最后一个步骤(如果做了的话)完成的.其通常难以配置及与现有代码整合. 本文旨在勾勒出使用 Gradle 整合 PMD 与 FindBugs 的步骤,并将其与一个现有的 ...

  4. Eclipse插件(导出UML图,打开文件资源管理器插件,静态代码分析工具PMD,在eclipse上安装插件)

    目录 能够导出UML图的Eclipse插件 打开文件资源管理器插件 Java静态代码分析工具PMD 如何在eclipse上安装插件 JProfiler性能分析工具 从更新站点安装EclEmma 能够导 ...

  5. jQuery File Upload 插件 php代码分析

    jquery file upload php代码分析首先进入构造方法 __construct() 再进入 initialize()因为我是post方式传的数据  在进入initialize()中的po ...

  6. 【DWM1000】 code 解密2一 工程初始化代码分析

    instance_init 函数追下去,绝大多数的代码都在初始化如下结构体 typedef struct { INST_MODE mode; instance_init -ANCHOR //insta ...

  7. 完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)

    构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化 ...

  8. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  9. lighttpd与fastcgi+cgilua原理、代码分析与安装

    原理 http://www.cnblogs.com/skynet/p/4173450.html 快速通用网关接口(Fast Common Gateway Interface/FastCGI)是通用网关 ...

随机推荐

  1. 171. Anagrams【medium】

    Given an array of strings, return all groups of strings that are anagrams. Notice All inputs will be ...

  2. 413. Reverse Integer【easy】

    Reverse digits of an integer. Returns 0 when the reversed integer overflows (signed 32-bit integer). ...

  3. nyoj 742 子串和再续 类似 HDU 1024

    子串和再续 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给你一个序列 S1, S2, S3, S4 ... Sx, ... Sn (1 ≤ x ≤ n ≤ 1,000 ...

  4. html-loldemo

    百度版lol百科小样 <!DOCTYPE html> <html lang="en"> <head> <title>英雄联盟百科&l ...

  5. Tuning 12 manage statistics

    这个 stattistics 对解析 sql 时的优化器有很重要的作用, 优化器是基于 statistics 来进行优化的. desc dbms_stats 包也可以 desc (早期使用 analy ...

  6. Dump 分析法

    云更新目前能够收集32位客户机系统(XP和win7 32位)产生的蓝屏DMP文件到服务端DUMP文件夹,我们可以通过分析蓝屏曰志来确定到底是什么导致了客户机蓝屏. 一.WinDbg是什么?它能做什么? ...

  7. 常用cms

    最近,朋友要建站让我帮着推荐个好的CMS(内容管理系统),个人认为其实选择哪个CMS并不重要,除了对搜索引擎的亲好外,个人的使用操作习惯和对所选CMS系统的熟悉程度有很大关系. 这里为需要建站但又徘徊 ...

  8. Cmake实现样例

    多目录工程的CmakeLists.txt编写(自动添加多目录下的文件) http://www.cnblogs.com/chengxuyuancc/p/5347646.html 实现类似于vs中工程的C ...

  9. Ajax.ActionLink用法

    必须要引用的JS库: <script type="text/javascript" src="@Url.StaticFile("/Assets/Conte ...

  10. 2014-04-17-网易有道-研发类-笔试题&amp;參考答案

    一套卷子,共10道小题,3道编程大题 一.填空&选择 1.选择:给了一个递归求Fibonacci的代码,问算法复杂度 指数复杂度 2.选择:忘记了,应该不难 3.选择:给你52张除掉大小王的扑 ...