由于Dokcer的默认配置安装后IPv6是默认关闭状态,如果主机有IPv6的Subnet,希望容器能够支持IPv6的网络通信,则可以通过手动配置来开启Docker的IPv6网络支持。
但是按照 Docker官方文档 中的描述来启用IPv6会出现一些问题。
由于默认没有配置IPv6的网络转发,当划分的IPv6子网为局域网段时,发现容器IPv6无法正常使用,包括网络通信、容器端口转发等。
(如果Docker版本小于20.10.2,则可能需要依赖于第三方的工具来实现IPv6-NAT:docker-ipv6nat)
本文将以Bridge类型的容器网络和 RFC 4193 中描述的局域网IPv6网段(fd00::/8)为例来启用IPv6的容器支持
划分一块要使用的局域网子段,这里使用的是 fd00:aa88::/64
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
使用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网络,你需要自己指定对应的Subnet,但是配置Gateway是可选项(默认是::1为网关地址)
docker network create --ipv6 \
--subnet "fd00:aa88:1::/64" \
--gateway "fd00:aa88:1::1" stardust
$ 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