From 52df1d63fe6ecc42206f02519627469b8b9eaf67 Mon Sep 17 00:00:00 2001 From: Tom Moulard Date: Thu, 8 Sep 2022 11:20:09 +0200 Subject: [PATCH] Use IPv6 address --- docs/content/providers/docker.md | 7 +++++++ pkg/provider/docker/builder_test.go | 6 ++++++ pkg/provider/docker/config_test.go | 16 ++++++++++++++++ pkg/provider/docker/docker.go | 7 ++++++- 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/docs/content/providers/docker.md b/docs/content/providers/docker.md index 95603a7b4..bb6feecef 100644 --- a/docs/content/providers/docker.md +++ b/docs/content/providers/docker.md @@ -140,6 +140,13 @@ On Linux, for versions of Docker older than 20.10.0, for `host.docker.internal` as an `extra_host` to the Traefik container, using the `--add-host` flag. For example, to set it to the IP address of the bridge interface (`docker0` by default): `--add-host=host.docker.internal:172.17.0.1` +### IPv4 && IPv6 + +When using a docker stack that uses IPv6, +Traefik will use the IPv4 container IP before its IPv6 counterpart. +Therefore, on an IPv6 Docker stack, +Traefik will use the IPv6 container IP. + ### Docker API Access Traefik requires access to the docker socket to get its dynamic configuration. diff --git a/pkg/provider/docker/builder_test.go b/pkg/provider/docker/builder_test.go index 28b8d225c..424dc7a3e 100644 --- a/pkg/provider/docker/builder_test.go +++ b/pkg/provider/docker/builder_test.go @@ -77,6 +77,12 @@ func ipv4(ip string) func(*network.EndpointSettings) { } } +func ipv6(ip string) func(*network.EndpointSettings) { + return func(s *network.EndpointSettings) { + s.GlobalIPv6Address = ip + } +} + func swarmTask(id string, ops ...func(*swarm.Task)) swarm.Task { task := &swarm.Task{ ID: id, diff --git a/pkg/provider/docker/config_test.go b/pkg/provider/docker/config_test.go index f58999459..ed8b58b7c 100644 --- a/pkg/provider/docker/config_test.go +++ b/pkg/provider/docker/config_test.go @@ -3511,6 +3511,22 @@ func TestDockerGetIPAddress(t *testing.T) { network: "testnet", expected: "10.11.12.13", }, + { + desc: "one ipv6 network, network label", + container: containerJSON( + withNetwork("testnet", ipv6("fd00:1:2:3:4::")), + ), + network: "testnet", + expected: "fd00:1:2:3:4::", + }, + { + desc: "two network ipv4 + ipv6, network label", + container: containerJSON( + withNetwork("testnet", ipv4("10.11.12.13"), ipv6("fd00:1:2:3:4::")), + ), + network: "testnet", + expected: "10.11.12.13", + }, { desc: "two networks, network label", container: containerJSON( diff --git a/pkg/provider/docker/docker.go b/pkg/provider/docker/docker.go index 192fc4999..ab094b16b 100644 --- a/pkg/provider/docker/docker.go +++ b/pkg/provider/docker/docker.go @@ -411,10 +411,15 @@ func parseContainer(container dockertypes.ContainerJSON) dockerData { if container.NetworkSettings.Networks != nil { dData.NetworkSettings.Networks = make(map[string]*networkData) for name, containerNetwork := range container.NetworkSettings.Networks { + addr := containerNetwork.IPAddress + if addr == "" { + addr = containerNetwork.GlobalIPv6Address + } + dData.NetworkSettings.Networks[name] = &networkData{ ID: containerNetwork.NetworkID, Name: name, - Addr: containerNetwork.IPAddress, + Addr: addr, } } }