From 101f982059589cac0c8891832ac3f8069291d63a Mon Sep 17 00:00:00 2001 From: Lei Jitang Date: Tue, 5 May 2015 19:21:01 +0800 Subject: [PATCH 1/2] Refactor the code of checking conflict option with netmode. Signed-off-by: Lei Jitang --- runconfig/parse.go | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/runconfig/parse.go b/runconfig/parse.go index 63eeecc5f6..82d0870cd4 100644 --- a/runconfig/parse.go +++ b/runconfig/parse.go @@ -15,9 +15,8 @@ import ( var ( ErrConflictContainerNetworkAndLinks = fmt.Errorf("Conflicting options: --net=container can't be used with links. This would result in undefined behavior.") - ErrConflictContainerNetworkAndDns = fmt.Errorf("Conflicting options: --net=container can't be used with --dns. This configuration is invalid.") + ErrConflictNetworkAndDns = fmt.Errorf("Conflicting options: --dns and the network mode (--net).") ErrConflictNetworkHostname = fmt.Errorf("Conflicting options: -h and the network mode (--net)") - ErrConflictHostNetworkAndDns = fmt.Errorf("Conflicting options: --net=host can't be used with --dns. This configuration is invalid.") ErrConflictHostNetworkAndLinks = fmt.Errorf("Conflicting options: --net=host can't be used with links. This would result in undefined behavior.") ) @@ -112,24 +111,25 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe attachStderr = flAttach.Get("stderr") ) - if *flNetMode != "bridge" && *flNetMode != "none" && *flHostname != "" { + netMode, err := parseNetMode(*flNetMode) + if err != nil { + return nil, nil, cmd, fmt.Errorf("--net: invalid net mode: %v", err) + } + + if (netMode.IsHost() || netMode.IsContainer()) && *flHostname != "" { return nil, nil, cmd, ErrConflictNetworkHostname } - if *flNetMode == "host" && flLinks.Len() > 0 { + if netMode.IsHost() && flLinks.Len() > 0 { return nil, nil, cmd, ErrConflictHostNetworkAndLinks } - if strings.HasPrefix(*flNetMode, "container") && flLinks.Len() > 0 { + if netMode.IsContainer() && flLinks.Len() > 0 { return nil, nil, cmd, ErrConflictContainerNetworkAndLinks } - if *flNetMode == "host" && flDns.Len() > 0 { - return nil, nil, cmd, ErrConflictHostNetworkAndDns - } - - if strings.HasPrefix(*flNetMode, "container") && flDns.Len() > 0 { - return nil, nil, cmd, ErrConflictContainerNetworkAndDns + if (netMode.IsHost() || netMode.IsContainer()) && flDns.Len() > 0 { + return nil, nil, cmd, ErrConflictNetworkAndDns } // If neither -d or -a are set, attach to everything by default @@ -266,11 +266,6 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe return nil, nil, cmd, fmt.Errorf("--pid: invalid PID mode") } - netMode, err := parseNetMode(*flNetMode) - if err != nil { - return nil, nil, cmd, fmt.Errorf("--net: invalid net mode: %v", err) - } - restartPolicy, err := ParseRestartPolicy(*flRestartPolicy) if err != nil { return nil, nil, cmd, err From 0e08e9aca14a4ca7142fa4649983302d93b55dab Mon Sep 17 00:00:00 2001 From: Lei Jitang Date: Tue, 5 May 2015 19:27:07 +0800 Subject: [PATCH 2/2] Add support --net=container with --mac-address,--add-host error out Signed-off-by: Lei Jitang --- daemon/container.go | 2 +- docs/sources/reference/run.md | 7 +++++-- integration-cli/docker_cli_run_test.go | 27 ++++++++++++++++++++++++++ runconfig/hostconfig.go | 4 ++++ runconfig/parse.go | 23 ++++++++++++++++------ 5 files changed, 54 insertions(+), 9 deletions(-) diff --git a/daemon/container.go b/daemon/container.go index 5c7d3a4e52..756ad9497b 100644 --- a/daemon/container.go +++ b/daemon/container.go @@ -1107,7 +1107,7 @@ func (container *Container) setupContainerDns() error { return err } - if config.NetworkMode != "host" { + if config.NetworkMode.IsBridge() || config.NetworkMode.IsNone() { // check configurations for any container/daemon dns settings if len(config.Dns) > 0 || len(daemon.config.Dns) > 0 || len(config.DnsSearch) > 0 || len(daemon.config.DnsSearch) > 0 { var ( diff --git a/docs/sources/reference/run.md b/docs/sources/reference/run.md index 60a180584f..43983f3d66 100644 --- a/docs/sources/reference/run.md +++ b/docs/sources/reference/run.md @@ -282,7 +282,8 @@ With the networking mode set to `host` a container will share the host's network stack and all interfaces from the host will be available to the container. The container's hostname will match the hostname on the host system. Publishing ports and linking to other containers will not work -when sharing the host's network stack. +when sharing the host's network stack. Note that `--add-host` `--hostname` +`--dns` `--dns-search` and `--mac-address` is invalid in `host` netmode. Compared to the default `bridge` mode, the `host` mode gives *significantly* better networking performance since it uses the host's native networking stack @@ -298,7 +299,9 @@ or a High Performance Web Server. With the networking mode set to `container` a container will share the network stack of another container. The other container's name must be -provided in the format of `--net container:`. +provided in the format of `--net container:`. Note that `--add-host` +`--hostname` `--dns` `--dns-search` and `--mac-address` is invalid +in `container` netmode. Example running a Redis container with Redis binding to `localhost` then running the `redis-cli` command and connecting to the Redis server over the diff --git a/integration-cli/docker_cli_run_test.go b/integration-cli/docker_cli_run_test.go index 0cf5c31eee..e828d0c507 100644 --- a/integration-cli/docker_cli_run_test.go +++ b/integration-cli/docker_cli_run_test.go @@ -371,6 +371,33 @@ func (s *DockerSuite) TestRunLinkToContainerNetMode(c *check.C) { } } +func (s *DockerSuite) TestRunContainerNetModeWithDnsMacHosts(c *check.C) { + cmd := exec.Command(dockerBinary, "run", "-d", "--name", "parent", "busybox", "top") + out, _, err := runCommandWithOutput(cmd) + if err != nil { + c.Fatalf("failed to run container: %v, output: %q", err, out) + } + + cmd = exec.Command(dockerBinary, "run", "--dns", "1.2.3.4", "--net=container:parent", "busybox") + out, _, err = runCommandWithOutput(cmd) + if err == nil || !strings.Contains(out, "Conflicting options: --dns and the network mode") { + c.Fatalf("run --net=container with --dns should error out") + } + + cmd = exec.Command(dockerBinary, "run", "--mac-address", "92:d0:c6:0a:29:33", "--net=container:parent", "busybox") + out, _, err = runCommandWithOutput(cmd) + if err == nil || !strings.Contains(out, "--mac-address and the network mode") { + c.Fatalf("run --net=container with --mac-address should error out") + } + + cmd = exec.Command(dockerBinary, "run", "--add-host", "test:192.168.2.109", "--net=container:parent", "busybox") + out, _, err = runCommandWithOutput(cmd) + if err == nil || !strings.Contains(out, "--add-host and the network mode") { + c.Fatalf("run --net=container with --add-host should error out") + } + +} + func (s *DockerSuite) TestRunModeNetContainerHostname(c *check.C) { testRequires(c, ExecSupport) cmd := exec.Command(dockerBinary, "run", "-i", "-d", "--name", "parent", "busybox", "top") diff --git a/runconfig/hostconfig.go b/runconfig/hostconfig.go index d634b1ffb9..3a91744af3 100644 --- a/runconfig/hostconfig.go +++ b/runconfig/hostconfig.go @@ -21,6 +21,10 @@ func (n NetworkMode) IsPrivate() bool { return !(n.IsHost() || n.IsContainer() || n.IsNone()) } +func (n NetworkMode) IsBridge() bool { + return n == "bridge" +} + func (n NetworkMode) IsHost() bool { return n == "host" } diff --git a/runconfig/parse.go b/runconfig/parse.go index 82d0870cd4..1fcf521ee3 100644 --- a/runconfig/parse.go +++ b/runconfig/parse.go @@ -18,6 +18,8 @@ var ( ErrConflictNetworkAndDns = fmt.Errorf("Conflicting options: --dns and the network mode (--net).") ErrConflictNetworkHostname = fmt.Errorf("Conflicting options: -h and the network mode (--net)") ErrConflictHostNetworkAndLinks = fmt.Errorf("Conflicting options: --net=host can't be used with links. This would result in undefined behavior.") + ErrConflictContainerNetworkAndMac = fmt.Errorf("Conflicting options: --mac-address and the network mode (--net).") + ErrConflictNetworkHosts = fmt.Errorf("Conflicting options: --add-host and the network mode (--net).") ) func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSet, error) { @@ -99,12 +101,6 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe return nil, nil, cmd, err } - // Validate input params starting with the input mac address - if *flMacAddress != "" { - if _, err := opts.ValidateMACAddress(*flMacAddress); err != nil { - return nil, nil, cmd, fmt.Errorf("%s is not a valid mac address", *flMacAddress) - } - } var ( attachStdin = flAttach.Get("stdin") attachStdout = flAttach.Get("stdout") @@ -132,6 +128,21 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe return nil, nil, cmd, ErrConflictNetworkAndDns } + if (netMode.IsContainer() || netMode.IsHost()) && flExtraHosts.Len() > 0 { + return nil, nil, cmd, ErrConflictNetworkHosts + } + + if (netMode.IsContainer() || netMode.IsHost()) && *flMacAddress != "" { + return nil, nil, cmd, ErrConflictContainerNetworkAndMac + } + + // Validate the input mac address + if *flMacAddress != "" { + if _, err := opts.ValidateMACAddress(*flMacAddress); err != nil { + return nil, nil, cmd, fmt.Errorf("%s is not a valid mac address", *flMacAddress) + } + } + // If neither -d or -a are set, attach to everything by default if flAttach.Len() == 0 { attachStdout = true