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所需要的配置信息均声明并初始化完毕。