启用 IPv6 支持

在 Docker 容器中使用 IPv6 之前,您需要在 Docker 守护程序中启用 IPv6 支持。之后,您可以选择对任何容器或网络使用 IPv4 或 IPv6(或两者)。

IPv6 仅在 Linux 主机上运行的 Docker 守护程序上受支持。

笔记

使用 IPv6 时,我们建议您 在守护程序配置中启用实验参数。 ip6tables

创建 IPv6 网络

以下步骤向您展示如何创建使用 IPv6 的 Docker 网络。

  1. 编辑 Docker 守护进程配置文件,位于/etc/docker/daemon.json.配置以下参数:

    {
      "experimental": true,
      "ip6tables": true
    }

    ip6tables启用额外的 IPv6 数据包过滤规则,提供网络隔离和端口映射。该参数需要experimental设置为true

  2. 保存配置文件。

  3. 重新启动 Docker 守护进程以使更改生效。

    $ sudo systemctl restart docker
    
  4. 创建新的 IPv6 网络。

    • 使用docker network create

      $ docker network create --ipv6 --subnet 2001:0DB8::/112 ip6net
      
    • 使用 Docker Compose 文件:

       networks:
         ip6net:
           enable_ipv6: true
           ipam:
             config:
               - subnet: 2001:0DB8::/112

您现在可以运行连接到ip6net网络的容器。

$ docker run --rm --network ip6net -p 80:80 traefik/whoami

这会在 IPv6 和 IPv4 上发布端口 80。您可以通过运行curl来验证IPv6连接,连接到IPv6环回地址上的端口80:

$ curl http://[::1]:80
Hostname: ea1cfde18196
IP: 127.0.0.1
IP: ::1
IP: 172.17.0.2
IP: fe80::42:acff:fe11:2
RemoteAddr: [fe80::42:acff:fe11:2]:54890
GET / HTTP/1.1
Host: [::1]
User-Agent: curl/8.1.2
Accept: */*

使用 IPv6 作为默认桥接网络

以下步骤向您展示如何在默认桥接网络上使用 IPv6。

  1. 编辑 Docker 守护进程配置文件,位于/etc/docker/daemon.json.配置以下参数:

    {
      "ipv6": true,
      "fixed-cidr-v6": "2001:db8:1::/64",
      "experimental": true,
      "ip6tables": true
    }
    • ipv6在默认网络上启用 IPv6 网络。
    • fixed-cidr-v6将子网分配给默认桥接网络,从而实现动态 IPv6 地址分配。
    • ip6tables启用额外的 IPv6 数据包过滤规则,提供网络隔离和端口映射。该参数需要experimental设置为true
  2. 保存配置文件。

  3. 重新启动 Docker 守护进程以使更改生效。

    $ sudo systemctl restart docker
    

您现在可以在默认桥接网络上运行容器。

$ docker run --rm -p 80:80 traefik/whoami

这会在 IPv6 和 IPv4 上发布端口 80。您可以通过向 IPv6 环回地址上的端口 80 发出请求来验证 IPv6 连接:

$ curl http://[::1]:80
Hostname: ea1cfde18196
IP: 127.0.0.1
IP: ::1
IP: 172.17.0.2
IP: fe80::42:acff:fe11:2
RemoteAddr: [fe80::42:acff:fe11:2]:54890
GET / HTTP/1.1
Host: [::1]
User-Agent: curl/8.1.2
Accept: */*

动态 IPv6 子网分配

如果您没有使用 显式配置用户定义网络的子网,docker network create --subnet=<your-subnet>这些网络将使用守护程序的默认地址池作为后备。默认地址池均为IPv4地址池。这也适用于从 Docker Compose 文件创建的网络,并将其enable_ipv6设置为true.

要为用户定义的 IPv6 网络启用动态子网分配,您必须手动配置守护程序的地址池以包括:

  • 默认 IPv4 地址池
  • 一个或多个您自己的 IPv6 池

默认地址池配置为:

{
  "default-address-pools": [
    { "base": "172.17.0.0/16", "size": 16 },
    { "base": "172.18.0.0/16", "size": 16 },
    { "base": "172.19.0.0/16", "size": 16 },
    { "base": "172.20.0.0/14", "size": 16 },
    { "base": "172.24.0.0/14", "size": 16 },
    { "base": "172.28.0.0/14", "size": 16 },
    { "base": "192.168.0.0/16", "size": 20 }
  ]
}

以下示例显示了具有默认值和 IPv6 池的有效配置。示例中的 IPv6 池/112从前缀长度的 IPv6 池中提供最多 256 个大小的 IPv6 子网/104。每个/112大小的子网支持 65 536 个 IPv6 地址。

笔记

请注意,IPv6 池存在以下已知限制:

  • IPv6 的值base需要最小前缀长度为/64。这是由于 Docker 守护进程中的整数溢出造成的。参见 moby/moby#42801
  • 池长度和池大小之间的差值不能大于 24。定义过多的子网会导致守护程序消耗所有可用内存。请参阅 moby/moby#40275
{
  "default-address-pools": [
    { "base": "172.17.0.0/16", "size": 16 },
    { "base": "172.18.0.0/16", "size": 16 },
    { "base": "172.19.0.0/16", "size": 16 },
    { "base": "172.20.0.0/14", "size": 16 },
    { "base": "172.24.0.0/14", "size": 16 },
    { "base": "172.28.0.0/14", "size": 16 },
    { "base": "192.168.0.0/16", "size": 20 },
    { "base": "2001:db8::/104", "size": 112 }
  ]
}

笔记

2001:db8本示例中的 地址保留用于文档中。将其替换为有效的 IPv6 网络。默认 IPv4 池来自私有地址范围,等效的 IPv6 是 ULA 网络

下一步