Skip to content

Commit 5b0183e

Browse files
committed
Merge pull request moby#19683 from calavera/network_config_file
Allow network configuration via daemon config file.
2 parents 58c2488 + c539be8 commit 5b0183e

File tree

9 files changed

+116
-60
lines changed

9 files changed

+116
-60
lines changed

daemon/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ type CommonTLSOptions struct {
4545
type CommonConfig struct {
4646
AuthorizationPlugins []string `json:"authorization-plugins,omitempty"` // AuthorizationPlugins holds list of authorization plugins
4747
AutoRestart bool `json:"-"`
48-
Bridge bridgeConfig `json:"-"` // Bridge holds bridge network specific configuration.
4948
Context map[string][]string `json:"-"`
5049
DisableBridge bool `json:"-"`
5150
DNS []string `json:"dns,omitempty"`
@@ -85,6 +84,7 @@ type CommonConfig struct {
8584
// deserialization without the full struct.
8685
CommonTLSOptions
8786
LogConfig
87+
bridgeConfig // bridgeConfig holds bridge network specific configuration.
8888

8989
reloadLock sync.Mutex
9090
valuesSet map[string]interface{}

daemon/config_unix.go

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,19 @@ type Config struct {
3737
// bridgeConfig stores all the bridge driver specific
3838
// configuration.
3939
type bridgeConfig struct {
40-
EnableIPv6 bool
41-
EnableIPTables bool
42-
EnableIPForward bool
43-
EnableIPMasq bool
44-
EnableUserlandProxy bool
45-
DefaultIP net.IP
46-
Iface string
47-
IP string
48-
FixedCIDR string
49-
FixedCIDRv6 string
50-
DefaultGatewayIPv4 net.IP
51-
DefaultGatewayIPv6 net.IP
52-
InterContainerCommunication bool
40+
EnableIPv6 bool `json:"ipv6,omitempty"`
41+
EnableIPTables bool `json:"iptables,omitempty"`
42+
EnableIPForward bool `json:"ip-forward,omitempty"`
43+
EnableIPMasq bool `json:"ip-mask,omitempty"`
44+
EnableUserlandProxy bool `json:"userland-proxy,omitempty"`
45+
DefaultIP net.IP `json:"ip,omitempty"`
46+
Iface string `json:"bridge,omitempty"`
47+
IP string `json:"bip,omitempty"`
48+
FixedCIDR string `json:"fixed-cidr,omitempty"`
49+
FixedCIDRv6 string `json:"fixed-cidr-v6,omitempty"`
50+
DefaultGatewayIPv4 net.IP `json:"default-gateway,omitempty"`
51+
DefaultGatewayIPv6 net.IP `json:"default-gateway-v6,omitempty"`
52+
InterContainerCommunication bool `json:"icc,omitempty"`
5353
}
5454

5555
// InstallFlags adds command-line options to the top-level flag parser for
@@ -65,19 +65,19 @@ func (config *Config) InstallFlags(cmd *flag.FlagSet, usageFn func(string) strin
6565
cmd.StringVar(&config.SocketGroup, []string{"G", "-group"}, "docker", usageFn("Group for the unix socket"))
6666
config.Ulimits = make(map[string]*units.Ulimit)
6767
cmd.Var(runconfigopts.NewUlimitOpt(&config.Ulimits), []string{"-default-ulimit"}, usageFn("Set default ulimits for containers"))
68-
cmd.BoolVar(&config.Bridge.EnableIPTables, []string{"#iptables", "-iptables"}, true, usageFn("Enable addition of iptables rules"))
69-
cmd.BoolVar(&config.Bridge.EnableIPForward, []string{"#ip-forward", "-ip-forward"}, true, usageFn("Enable net.ipv4.ip_forward"))
70-
cmd.BoolVar(&config.Bridge.EnableIPMasq, []string{"-ip-masq"}, true, usageFn("Enable IP masquerading"))
71-
cmd.BoolVar(&config.Bridge.EnableIPv6, []string{"-ipv6"}, false, usageFn("Enable IPv6 networking"))
72-
cmd.StringVar(&config.Bridge.IP, []string{"#bip", "-bip"}, "", usageFn("Specify network bridge IP"))
73-
cmd.StringVar(&config.Bridge.Iface, []string{"b", "-bridge"}, "", usageFn("Attach containers to a network bridge"))
74-
cmd.StringVar(&config.Bridge.FixedCIDR, []string{"-fixed-cidr"}, "", usageFn("IPv4 subnet for fixed IPs"))
75-
cmd.StringVar(&config.Bridge.FixedCIDRv6, []string{"-fixed-cidr-v6"}, "", usageFn("IPv6 subnet for fixed IPs"))
76-
cmd.Var(opts.NewIPOpt(&config.Bridge.DefaultGatewayIPv4, ""), []string{"-default-gateway"}, usageFn("Container default gateway IPv4 address"))
77-
cmd.Var(opts.NewIPOpt(&config.Bridge.DefaultGatewayIPv6, ""), []string{"-default-gateway-v6"}, usageFn("Container default gateway IPv6 address"))
78-
cmd.BoolVar(&config.Bridge.InterContainerCommunication, []string{"#icc", "-icc"}, true, usageFn("Enable inter-container communication"))
79-
cmd.Var(opts.NewIPOpt(&config.Bridge.DefaultIP, "0.0.0.0"), []string{"#ip", "-ip"}, usageFn("Default IP when binding container ports"))
80-
cmd.BoolVar(&config.Bridge.EnableUserlandProxy, []string{"-userland-proxy"}, true, usageFn("Use userland proxy for loopback traffic"))
68+
cmd.BoolVar(&config.bridgeConfig.EnableIPTables, []string{"#iptables", "-iptables"}, true, usageFn("Enable addition of iptables rules"))
69+
cmd.BoolVar(&config.bridgeConfig.EnableIPForward, []string{"#ip-forward", "-ip-forward"}, true, usageFn("Enable net.ipv4.ip_forward"))
70+
cmd.BoolVar(&config.bridgeConfig.EnableIPMasq, []string{"-ip-masq"}, true, usageFn("Enable IP masquerading"))
71+
cmd.BoolVar(&config.bridgeConfig.EnableIPv6, []string{"-ipv6"}, false, usageFn("Enable IPv6 networking"))
72+
cmd.StringVar(&config.bridgeConfig.IP, []string{"#bip", "-bip"}, "", usageFn("Specify network bridge IP"))
73+
cmd.StringVar(&config.bridgeConfig.Iface, []string{"b", "-bridge"}, "", usageFn("Attach containers to a network bridge"))
74+
cmd.StringVar(&config.bridgeConfig.FixedCIDR, []string{"-fixed-cidr"}, "", usageFn("IPv4 subnet for fixed IPs"))
75+
cmd.StringVar(&config.bridgeConfig.FixedCIDRv6, []string{"-fixed-cidr-v6"}, "", usageFn("IPv6 subnet for fixed IPs"))
76+
cmd.Var(opts.NewIPOpt(&config.bridgeConfig.DefaultGatewayIPv4, ""), []string{"-default-gateway"}, usageFn("Container default gateway IPv4 address"))
77+
cmd.Var(opts.NewIPOpt(&config.bridgeConfig.DefaultGatewayIPv6, ""), []string{"-default-gateway-v6"}, usageFn("Container default gateway IPv6 address"))
78+
cmd.BoolVar(&config.bridgeConfig.InterContainerCommunication, []string{"#icc", "-icc"}, true, usageFn("Enable inter-container communication"))
79+
cmd.Var(opts.NewIPOpt(&config.bridgeConfig.DefaultIP, "0.0.0.0"), []string{"#ip", "-ip"}, usageFn("Default IP when binding container ports"))
80+
cmd.BoolVar(&config.bridgeConfig.EnableUserlandProxy, []string{"-userland-proxy"}, true, usageFn("Use userland proxy for loopback traffic"))
8181
cmd.BoolVar(&config.EnableCors, []string{"#api-enable-cors", "#-api-enable-cors"}, false, usageFn("Enable CORS headers in the remote API, this is deprecated by --api-cors-header"))
8282
cmd.StringVar(&config.CorsHeaders, []string{"-api-cors-header"}, "", usageFn("Set CORS headers in the remote API"))
8383
cmd.StringVar(&config.CgroupParent, []string{"-cgroup-parent"}, "", usageFn("Set parent cgroup for all containers"))

daemon/config_windows.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ var (
1515
// bridgeConfig stores all the bridge driver specific
1616
// configuration.
1717
type bridgeConfig struct {
18-
VirtualSwitchName string
18+
VirtualSwitchName string `json:"bridge,omitempty"`
1919
}
2020

2121
// Config defines the configuration of a docker daemon.
@@ -37,5 +37,5 @@ func (config *Config) InstallFlags(cmd *flag.FlagSet, usageFn func(string) strin
3737
config.InstallCommonFlags(cmd, usageFn)
3838

3939
// Then platform-specific install flags.
40-
cmd.StringVar(&config.Bridge.VirtualSwitchName, []string{"b", "-bridge"}, "", "Attach containers to a virtual switch")
40+
cmd.StringVar(&config.bridgeConfig.VirtualSwitchName, []string{"b", "-bridge"}, "", "Attach containers to a virtual switch")
4141
}

daemon/container_operations_unix.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,7 @@ func (daemon *Daemon) updateEndpointNetworkSettings(container *container.Contain
513513
}
514514

515515
if container.HostConfig.NetworkMode == containertypes.NetworkMode("bridge") {
516-
container.NetworkSettings.Bridge = daemon.configStore.Bridge.Iface
516+
container.NetworkSettings.Bridge = daemon.configStore.bridgeConfig.Iface
517517
}
518518

519519
return nil

daemon/container_operations_windows.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func (daemon *Daemon) populateCommand(c *container.Container, env []string) erro
5454
if !c.Config.NetworkDisabled {
5555
en.Interface = &execdriver.NetworkInterface{
5656
MacAddress: c.Config.MacAddress,
57-
Bridge: daemon.configStore.Bridge.VirtualSwitchName,
57+
Bridge: daemon.configStore.bridgeConfig.VirtualSwitchName,
5858
PortBindings: c.HostConfig.PortBindings,
5959

6060
// TODO Windows. Include IPAddress. There already is a

daemon/daemon_unix.go

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -412,14 +412,14 @@ func verifyPlatformContainerSettings(daemon *Daemon, hostConfig *containertypes.
412412
// checkConfigOptions checks for mutually incompatible config options
413413
func checkConfigOptions(config *Config) error {
414414
// Check for mutually incompatible config options
415-
if config.Bridge.Iface != "" && config.Bridge.IP != "" {
415+
if config.bridgeConfig.Iface != "" && config.bridgeConfig.IP != "" {
416416
return fmt.Errorf("You specified -b & --bip, mutually exclusive options. Please specify only one.")
417417
}
418-
if !config.Bridge.EnableIPTables && !config.Bridge.InterContainerCommunication {
418+
if !config.bridgeConfig.EnableIPTables && !config.bridgeConfig.InterContainerCommunication {
419419
return fmt.Errorf("You specified --iptables=false with --icc=false. ICC=false uses iptables to function. Please set --icc or --iptables to true.")
420420
}
421-
if !config.Bridge.EnableIPTables && config.Bridge.EnableIPMasq {
422-
config.Bridge.EnableIPMasq = false
421+
if !config.bridgeConfig.EnableIPTables && config.bridgeConfig.EnableIPMasq {
422+
config.bridgeConfig.EnableIPMasq = false
423423
}
424424
return nil
425425
}
@@ -451,7 +451,7 @@ func configureKernelSecuritySupport(config *Config, driverName string) error {
451451
}
452452

453453
func isBridgeNetworkDisabled(config *Config) bool {
454-
return config.Bridge.Iface == disableNetworkBridge
454+
return config.bridgeConfig.Iface == disableNetworkBridge
455455
}
456456

457457
func (daemon *Daemon) networkOptions(dconfig *Config) ([]nwconfig.Option, error) {
@@ -525,9 +525,9 @@ func (daemon *Daemon) initNetworkController(config *Config) (libnetwork.NetworkC
525525

526526
func driverOptions(config *Config) []nwconfig.Option {
527527
bridgeConfig := options.Generic{
528-
"EnableIPForwarding": config.Bridge.EnableIPForward,
529-
"EnableIPTables": config.Bridge.EnableIPTables,
530-
"EnableUserlandProxy": config.Bridge.EnableUserlandProxy}
528+
"EnableIPForwarding": config.bridgeConfig.EnableIPForward,
529+
"EnableIPTables": config.bridgeConfig.EnableIPTables,
530+
"EnableUserlandProxy": config.bridgeConfig.EnableUserlandProxy}
531531
bridgeOption := options.Generic{netlabel.GenericData: bridgeConfig}
532532

533533
dOptions := []nwconfig.Option{}
@@ -543,20 +543,20 @@ func initBridgeDriver(controller libnetwork.NetworkController, config *Config) e
543543
}
544544

545545
bridgeName := bridge.DefaultBridgeName
546-
if config.Bridge.Iface != "" {
547-
bridgeName = config.Bridge.Iface
546+
if config.bridgeConfig.Iface != "" {
547+
bridgeName = config.bridgeConfig.Iface
548548
}
549549
netOption := map[string]string{
550550
bridge.BridgeName: bridgeName,
551551
bridge.DefaultBridge: strconv.FormatBool(true),
552552
netlabel.DriverMTU: strconv.Itoa(config.Mtu),
553-
bridge.EnableIPMasquerade: strconv.FormatBool(config.Bridge.EnableIPMasq),
554-
bridge.EnableICC: strconv.FormatBool(config.Bridge.InterContainerCommunication),
553+
bridge.EnableIPMasquerade: strconv.FormatBool(config.bridgeConfig.EnableIPMasq),
554+
bridge.EnableICC: strconv.FormatBool(config.bridgeConfig.InterContainerCommunication),
555555
}
556556

557557
// --ip processing
558-
if config.Bridge.DefaultIP != nil {
559-
netOption[bridge.DefaultBindingIP] = config.Bridge.DefaultIP.String()
558+
if config.bridgeConfig.DefaultIP != nil {
559+
netOption[bridge.DefaultBindingIP] = config.bridgeConfig.DefaultIP.String()
560560
}
561561

562562
var (
@@ -575,9 +575,9 @@ func initBridgeDriver(controller libnetwork.NetworkController, config *Config) e
575575
}
576576
}
577577

578-
if config.Bridge.IP != "" {
579-
ipamV4Conf.PreferredPool = config.Bridge.IP
580-
ip, _, err := net.ParseCIDR(config.Bridge.IP)
578+
if config.bridgeConfig.IP != "" {
579+
ipamV4Conf.PreferredPool = config.bridgeConfig.IP
580+
ip, _, err := net.ParseCIDR(config.bridgeConfig.IP)
581581
if err != nil {
582582
return err
583583
}
@@ -586,22 +586,22 @@ func initBridgeDriver(controller libnetwork.NetworkController, config *Config) e
586586
logrus.Infof("Default bridge (%s) is assigned with an IP address %s. Daemon option --bip can be used to set a preferred IP address", bridgeName, ipamV4Conf.PreferredPool)
587587
}
588588

589-
if config.Bridge.FixedCIDR != "" {
590-
_, fCIDR, err := net.ParseCIDR(config.Bridge.FixedCIDR)
589+
if config.bridgeConfig.FixedCIDR != "" {
590+
_, fCIDR, err := net.ParseCIDR(config.bridgeConfig.FixedCIDR)
591591
if err != nil {
592592
return err
593593
}
594594

595595
ipamV4Conf.SubPool = fCIDR.String()
596596
}
597597

598-
if config.Bridge.DefaultGatewayIPv4 != nil {
599-
ipamV4Conf.AuxAddresses["DefaultGatewayIPv4"] = config.Bridge.DefaultGatewayIPv4.String()
598+
if config.bridgeConfig.DefaultGatewayIPv4 != nil {
599+
ipamV4Conf.AuxAddresses["DefaultGatewayIPv4"] = config.bridgeConfig.DefaultGatewayIPv4.String()
600600
}
601601

602602
var deferIPv6Alloc bool
603-
if config.Bridge.FixedCIDRv6 != "" {
604-
_, fCIDRv6, err := net.ParseCIDR(config.Bridge.FixedCIDRv6)
603+
if config.bridgeConfig.FixedCIDRv6 != "" {
604+
_, fCIDRv6, err := net.ParseCIDR(config.bridgeConfig.FixedCIDRv6)
605605
if err != nil {
606606
return err
607607
}
@@ -631,11 +631,11 @@ func initBridgeDriver(controller libnetwork.NetworkController, config *Config) e
631631
}
632632
}
633633

634-
if config.Bridge.DefaultGatewayIPv6 != nil {
634+
if config.bridgeConfig.DefaultGatewayIPv6 != nil {
635635
if ipamV6Conf == nil {
636636
ipamV6Conf = &libnetwork.IpamConf{AuxAddresses: make(map[string]string)}
637637
}
638-
ipamV6Conf.AuxAddresses["DefaultGatewayIPv6"] = config.Bridge.DefaultGatewayIPv6.String()
638+
ipamV6Conf.AuxAddresses["DefaultGatewayIPv6"] = config.bridgeConfig.DefaultGatewayIPv6.String()
639639
}
640640

641641
v4Conf := []*libnetwork.IpamConf{ipamV4Conf}
@@ -647,7 +647,7 @@ func initBridgeDriver(controller libnetwork.NetworkController, config *Config) e
647647
_, err = controller.NewNetwork("bridge", "bridge",
648648
libnetwork.NetworkOptionGeneric(options.Generic{
649649
netlabel.GenericData: netOption,
650-
netlabel.EnableIPv6: config.Bridge.EnableIPv6,
650+
netlabel.EnableIPv6: config.bridgeConfig.EnableIPv6,
651651
}),
652652
libnetwork.NetworkOptionIpam("default", "", v4Conf, v6Conf, nil),
653653
libnetwork.NetworkOptionDeferIPv6Alloc(deferIPv6Alloc))

daemon/daemon_windows.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,8 @@ func isBridgeNetworkDisabled(config *Config) bool {
121121

122122
func (daemon *Daemon) initNetworkController(config *Config) (libnetwork.NetworkController, error) {
123123
// Set the name of the virtual switch if not specified by -b on daemon start
124-
if config.Bridge.VirtualSwitchName == "" {
125-
config.Bridge.VirtualSwitchName = defaultVirtualSwitch
124+
if config.bridgeConfig.VirtualSwitchName == "" {
125+
config.bridgeConfig.VirtualSwitchName = defaultVirtualSwitch
126126
}
127127
return nil, nil
128128
}

docker/daemon_unix_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// +build daemon,!windows
2+
3+
package main
4+
5+
import (
6+
"io/ioutil"
7+
"testing"
8+
9+
"github.com/docker/docker/cli"
10+
"github.com/docker/docker/daemon"
11+
"github.com/docker/docker/pkg/mflag"
12+
)
13+
14+
func TestLoadDaemonConfigWithNetwork(t *testing.T) {
15+
c := &daemon.Config{}
16+
common := &cli.CommonFlags{}
17+
flags := mflag.NewFlagSet("test", mflag.ContinueOnError)
18+
flags.String([]string{"-bip"}, "", "")
19+
flags.String([]string{"-ip"}, "", "")
20+
21+
f, err := ioutil.TempFile("", "docker-config-")
22+
if err != nil {
23+
t.Fatal(err)
24+
}
25+
26+
configFile := f.Name()
27+
f.Write([]byte(`{"bip": "127.0.0.2", "ip": "127.0.0.1"}`))
28+
f.Close()
29+
30+
loadedConfig, err := loadDaemonCliConfig(c, flags, common, configFile)
31+
if err != nil {
32+
t.Fatal(err)
33+
}
34+
if loadedConfig == nil {
35+
t.Fatalf("expected configuration %v, got nil", c)
36+
}
37+
if loadedConfig.IP != "127.0.0.2" {
38+
t.Fatalf("expected IP 127.0.0.2, got %v", loadedConfig.IP)
39+
}
40+
if loadedConfig.DefaultIP.String() != "127.0.0.1" {
41+
t.Fatalf("expected DefaultIP 127.0.0.1, got %s", loadedConfig.DefaultIP)
42+
}
43+
}

docs/reference/commandline/daemon.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,20 @@ This is a full example of the allowed configuration options in the file:
859859
"userns-remap": "",
860860
"group": "",
861861
"cgroup-parent": "",
862-
"default-ulimits": {}
862+
"default-ulimits": {},
863+
"ipv6": false,
864+
"iptables": false,
865+
"ip-forward": false,
866+
"ip-mask": false,
867+
"userland-proxy": false,
868+
"ip": "0.0.0.0",
869+
"bridge": "",
870+
"bip": "",
871+
"fixed-cidr": "",
872+
"fixed-cidr-v6": "",
873+
"default-gateway": "",
874+
"default-gateway-v6": "",
875+
"icc": false
863876
}
864877
```
865878

0 commit comments

Comments
 (0)