Docker源码分析
上QQ阅读APP看书,第一时间看更新

3.3.1 配置初始化

mainDaemon()的运行位于./docker/docker/docker/daemon.go,深入分析mainDaemon()的实现之前,我们回到Go语言的特性,即变量与init函数的执行顺序。在daemon.go中,Docker定义了变量daemonCfg,以及init函数,通过Go语言的特性,变量的定义与init函数均会在mainDaemon()之前运行。两者的定义如下:

var (
     daemonCfg = &daemon.Config{}
)
func init() {
     daemonCfg.InstallFlags()
}

首先,Docker声明一个名为daemonCfg的变量,代表整个Docker Daemon的配置信息。定义完毕之后,init函数的存在,使得daemonCfg变量能获取相应的属性值。在Docker Daemon启动时,daemonCfg变量被传递至Docker Daemon并被使用。

Config对象的定义如下(含部分属性的解释),该对象位于./docker/docker/daemon/config.go:

type Config struct {
     Pidfile                      string  //Docker Daemon所属进程的PID文件
     Root                        string  //Docker运行时所使用的root路径
     AutoRestart                 bool    //是否一直支持创建容器的重启
     Dns                         []string//DockerDaemon为容器准备的DNS Server地址
     DnsSearch                   []string//Docker使用的指定的DNS查找地址
     Mirrors                     []string//指定的Docker Registry镜像地址
     EnableIptables              bool    //是否启用Docker的iptables功能
     EnableIpForward             bool    //是否启用net.ipv4.ip_forward功能
     EnableIpMasq                bool    //启用IP伪装技术
     DefaultIp                   net.IP  //绑定容器端口时使用的默认IP
     BridgeIface                 string  //添加容器网络至已有的网桥接口名
     BridgeIP                    string  //创建网桥的IP地址
     FixedCIDR                   string  //指定IP的IPv4子网,必须被网桥子网包含
     InterContainerCommunication bool    //是否允许宿主机上Docker容器间的通信
     GraphDriver                 string  //Docker Daemon运行时使用的特定存储驱动
     GraphOptions                []string//可设置的存储驱动选项
     ExecDriver                  string  //Docker运行时使用的特定exec驱动
     Mtu                         int     //设置容器网络接口的MTU
     DisableNetwork              bool    //是否支持Docker容器的网络模式
     EnableSelinuxSupport        bool    //是否启用对SELinux功能的支持
     Context                     map[string][]string
}

Docker声明daemonCfg之后,init函数实现了daemonCfg变量中各属性的赋值,具体的实现为:daemonCfg.InstallFlags(),位于./docker/docker/daemon/config.go,代码如下:

func (config *Config) InstallFlags() {
          flag.StringVar(&config.Pidfile, []string{"p", "-pidfile"}, "/var/run/docker.pid", "Path to use for daemon PID file")
          flag.StringVar(&config.Root, []string{"g", "-graph"}, "/var/lib/docker", "Path to use as the root of the Docker runtime")
          flag.BoolVar(&config.AutoRestart, []string{"#r", "#-restart"}, true, "--restart on the daemon has been deprecated infavor of --restart policies on docker run")
          flag.BoolVar(&config.EnableIptables, []string{"#iptables", "-iptables"}, true, "Enable Docker's addition of iptables rules")
          flag.BoolVar(&config.EnableIpForward, []string{"#ip-forward", "-ip-forward"}, true, "Enable net.ipv4.ip_forward")
          flag.StringVar(&config.BridgeIP, []string{"#bip", "-bip"}, "", "Use this CIDR notation address for the network bridge's IP, not compatible with -b")
          flag.StringVar(&config.BridgeIface, []string{"b", "-bridge"}, "", "Attach containers to a pre-existing network bridge\nuse 'none' to disable container networking")
          flag.BoolVar(&config.InterContainerCommunication, []string{"#icc", "-icc"}, true, "Enable inter-container communication")
          flag.StringVar(&config.GraphDriver, []string{"s", "-storage-driver"}, "", "Force the Docker runtime to use a specific storage driver")
          flag.StringVar(&config.ExecDriver, []string{"e", "-exec-driver"}, "native", "Force the Docker runtime to use a specific exec driver")
          flag.BoolVar(&config.EnableSelinuxSupport, []string{"-selinux-enabled"}, false, "Enable selinux support. SELinux does not presently support the BTRFS storage driver")
          flag.IntVar(&config.Mtu, []string{"#mtu", "-mtu"}, 0, "Set the containers network MTU\nif no value is provided: default to the default route MTU or 1500 if no default route is available")
          opts.IPVar(&config.DefaultIp, []string{"#ip", "-ip"}, "0.0.0.0", "Default IP address to use when binding container ports")
          opts.ListVar(&config.GraphOptions, []string{"-storage-opt"}, "Set storage driver options")
     // FIXME: why the inconsistency between "hosts" and "sockets"?
          opts.IPListVar(&config.Dns, []string{"#dns", "-dns"}, "Force Docker to use specific DNS servers")
          opts.DnsSearchListVar(&config.DnsSearch, []string{"-dns-search"}, "Force Docker to use specific DNS search domains")
}

在函数InstallFlags()的实现过程中,Docker主要定义了众多类型不一的flag参数,并将该参数的值绑定在daemonCfg变量的指定属性上,如:

flag.StringVar(&config.Pidfile, []string{"p", "-pidfile"}, "/var/run/docker.pid", "Path to use for daemon PID file")

以上语句的含义为:

□ 定义一个String类型的flag参数。

□ 该flag的名称为"p"或者"-pidfile"。

□ 该flag的默认值为"/var/run/docker.pid",并将该值绑定在变量config.Pidfile上。

□ 该flag的描述信息为"Path to use for daemon PID file"。

至此,关于Docker Daemon所需要的配置信息均声明并初始化完毕。