前言

由于Dokcer的默认配置安装后IPv6是默认关闭状态,如果主机有IPv6的Subnet,希望容器能够支持IPv6的网络通信,则可以通过手动配置来开启Docker的IPv6网络支持。

但是按照 Docker官方文档 中的描述来启用IPv6会出现一些问题。

由于默认没有配置IPv6的网络转发,当划分的IPv6子网为局域网段时,发现容器IPv6无法正常使用,包括网络通信、容器端口转发等。

环境要求

  • 确保你的主机有IPv6的子网(宿主机支持IPv6)
  • 已安装的Docker Engine 的版本需要>=20.10.2,因为在这个版本才启用了ip6tables的试验性支持

(如果Docker版本小于20.10.2,则可能需要依赖于第三方的工具来实现IPv6-NAT:docker-ipv6nat

配置步骤

本文将以Bridge类型的容器网络和 RFC 4193 中描述的局域网IPv6网段(fd00::/8)为例来启用IPv6的容器支持

划分默认容器的IPv6网段

划分一块要使用的局域网子段,这里使用的是 fd00:aa88::/64

Docker将会使用这个网段作为默认网络的IPv6网段

修改Docker的配置文件,启用IPv6支持

配置 /etc/docker/daemon.json

{
    "ipv6": true,
    "fixed-cidr-v6": "fd00:aa88::/64",
    "experimental": true,
    "ip6tables": true
}

和Docker的文档中不同的是,我们开启了实验特性ip6tables,这样Docker将会像配置IPv4的iptables一样来添加ip6tables的转发规则

然后重启Docker服务,应用更改

systemctl restart docker

查看Docker默认网络的配置

使用inspect查看Docker默认网络的配置,发现已经自动配置了IPv6的Subnet和Gateway,证明IPv6已经启用成功

$ docker network inspect bridge

[
    {
        "Name": "bridge",
        "Id": "5a2b81221f69b0c83cd7948725972ff1670575cc9c0abb29d6322b8c7f188392",
        "Created": "2023-01-13T19:28:32.384666768+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": true,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                },
                {
                    "Subnet": "fd00:aa88::/64",
                    "Gateway": "fd00:aa88::1"
                }
            ]
        },
...

创建支持IPv6的容器网络

你也可以通过如下命令创建支持IPv6的容器网络,不同的是,对于IPv6网络,你需要自己指定对应的Subnet,但是配置Gateway是可选项(默认是::1为网关地址)

docker network create --ipv6 \
--subnet "fd00:aa88:1::/64" \
--gateway "fd00:aa88:1::1" stardust

在容器中测试IPv6是否成功连通

$ docker run --rm -it alpine /bin/sh -c "ping6 dns.google"

$ docker run --rm -it alpine /bin/sh -c "ping6 dns.google"
PING dns.google (2001:4860:4860::8844): 56 data bytes
64 bytes from 2001:4860:4860::8844: seq=0 ttl=118 time=0.980 ms
64 bytes from 2001:4860:4860::8844: seq=1 ttl=118 time=1.056 ms
64 bytes from 2001:4860:4860::8844: seq=2 ttl=118 time=1.048 ms
64 bytes from 2001:4860:4860::8844: seq=3 ttl=118 time=1.059 ms
^C
--- dns.google ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.980/1.035/1.059 ms

参考文档

  1. Docker开启IPv6:https://docs.docker.com/config/daemon/ipv6/
  2. Docker Bridge网络配置:https://docs.docker.com/network/bridge/
  3. RFC-4193:https://www.rfc-editor.org/rfc/rfc4193