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. .net SQL分页

    1.分页SQL declare @pagesize integer,@cpage integer; --变量定义 ; --页码大小 ; --当前页 ---@cpage 为 第一页的时候 --selec ...

  2. 【Objective-C】01-Objective-C概述

    前言 目前来说,Objective-C(简称OC)是iOS开发的核心语言,在开发过程中也会配合着使用C语言.C++,OC主要负责UI界面,C语言.C++可用于图形处理.近来,流传Ruby.C#也可以开 ...

  3. post请求与get请求

    $.post('/manage.aa', function (response) { agentList = response.data; }, 'json'); var categoryId; $. ...

  4. CSS学习笔记(1)--浮动

    总结:浮动只能在脱离文档流的当前位置向上浮动,不能像定位一样到处乱跑. 清除浮动,设置一个类.clear{clear:both;} 1.没有浮动,都独占一行: <!DOCTYPE html> ...

  5. dubbo入门使用

    主要参考dubbo官网demo 此处采用zookeeper注册中心进行服务协调管理 真个项目结构如下所示: dcommon : 主要用于定义服务接口, 为dconsumer,dprovider所依赖 ...

  6. 元器件封装标准IPC-7351

    IPC-7351依赖久经考验的数学算法,综合考虑制造.组装和元件容差,从而精确计算焊盘图形.该标准以IPC-SM-782研发概念为基础进一步提高,对每一个元件都建立了三个焊盘图形几何形状,对每一系列元 ...

  7. go 语言学习笔计之结构体

    go 语言中的结构体方法 结构体名称的大小写有着不同的意义: 小写表示不能被别的包访问 package main import "fmt" type Rect struct { w ...

  8. 【批量加入】-拼接sql字符串

    如今做的一个项目须要用到批量加入,可是封装的底层没有这种方法,所以自食其力,自己来写.我们用的是拼接sql字符串的方法来实现功能. 详细实现流程:首先将须要的数据存储到实体的list中,然后将这个li ...

  9. datagrid 溢出文本显示省略号

    .datagrid-cell, .datagrid-cell-group, .datagrid-header-rownumber, .datagrid-cell-rownumber{ -o-text- ...

  10. win10执行shell脚本

    我们在win10如何执行以.sh文件的脚本呢? 开发步骤:1.写脚本b2q_goods.sh #!/bin/bashsql="select * from b2q.goods where go ...