使用 IPv6 网络
IPv6 仅在 Linux 主机上运行的 Docker 守护程序上受支持。
创建 IPv6 网络
用:
docker network create
$ docker network create --ipv6 ip6net
使用 指定 IPv6 子网:
docker network create
$ docker network create --ipv6 --subnet 2001:db8::/64 ip6net
使用 Docker Compose 文件:
networks: ip6net: enable_ipv6: true ipam: config: - subnet: 2001:db8::/64
您现在可以运行连接到网络的容器。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: 2001:db8::2
IP: fe80::42:acff:fe11:2
RemoteAddr: [2001:db8::1]:37574
GET / HTTP/1.1
Host: [::1]
User-Agent: curl/8.1.2
Accept: */*
将 IPv6 用于默认桥接网络
以下步骤演示如何在默认桥接网络上使用 IPv6。
编辑 Docker 守护程序配置文件, 位于 。配置以下参数:
/etc/docker/daemon.json
{ "ipv6": true, "fixed-cidr-v6": "2001:db8:1::/64" }
ipv6
在默认网络上启用 IPv6 联网。fixed-cidr-v6
将子网分配给默认桥接网络, 启用动态 IPv6 地址分配。ip6tables
启用其他 IPv6 数据包过滤规则,提供网络 隔离和端口映射。默认情况下,它是启用的,但可以禁用。
保存配置文件。
重新启动 Docker 守护程序以使更改生效。
$ sudo systemctl restart docker
您现在可以在默认桥接网络上运行容器。
$ docker run --rm -p 80:80 traefik/whoami
这将在 IPv6 和 IPv4 上发布端口 80。 您可以通过发出请求来验证 IPv6 连接 到 IPv6 环回地址上的端口 80:
$ curl http://[::1]:80
Hostname: ea1cfde18196
IP: 127.0.0.1
IP: ::1
IP: 172.17.0.2
IP: 2001:db8:1::242:ac12:2
IP: fe80::42:acff:fe12:2
RemoteAddr: [2001:db8:1::1]:35558
GET / HTTP/1.1
Host: [::1]
User-Agent: curl/8.1.2
Accept: */*
动态 IPv6 子网分配
如果您没有为用户定义的网络显式配置子网,则
用
这些网络使用守护程序的默认地址池作为回退。
这也适用于从 Docker Compose 文件创建的网络。
设置为 。docker network create --subnet=<your-subnet>
enable_ipv6
true
如果 Docker Engine 的 IPv6 池中不包含 IPv6 池,则
并且没有给出任何选项,则启用 IPv6 时将使用唯一本地地址 (ULA)。这些子网包括 40 位
Global ID 来给出一个
唯一性的概率很高。default-address-pools
--subnet
/64
要使用不同的 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 池最多提供 256 个 IPv6 子网
size ,从前缀长度的 IPv6 池中。/64
/56
{
"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::/56", "size": 64 }
]
}
注意
此示例中的地址保留用于文档。 将其替换为有效的 IPv6 网络。
2001:db8::
默认 IPv4 池来自私有地址范围 类似于默认的 IPv6 ULA 网络。
Docker 中的 Docker
在使用 (legacy ) 而不是 kernel 的主机上
模块,然后才能创建 IPv6 Docker 网络,
它通常在 Docker 启动时自动加载。xtables
iptables
nftables
ip6_tables
但是,如果您在 Docker 中运行的 Docker 不是基于最近的
版本,则
可能需要在主机上运行。或者,使用 daemon
为容器化 Docker 禁用的选项
发动机。
modprobe ip6_tables
--ip6tables=false
ip6tables