使用IPv6网络
IPv6 仅在运行于 Linux 主机上的 Docker 守护程序上受支持。
创建一个IPv6网络
使用
docker network create:$ docker network create --ipv6 ip6net使用
docker network create,指定一个IPv6子网:$ 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" }ipv6enables IPv6 networking on the default network.fixed-cidr-v6assigns a subnet to the default bridge network, enabling dynamic IPv6 address allocation.ip6tablesenables additional IPv6 packet filter rules, providing network isolation and port mapping. It is enabled by-default, but can be disabled.
保存配置文件。
重新启动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: 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 network create --subnet=,
这些网络将使用守护进程的默认地址池作为后备。
这也适用于从Docker Compose文件创建的网络,
其中enable_ipv6设置为true。
如果Docker Engine的default-address-pools中没有包含IPv6池,
并且没有给出--subnet选项,
唯一本地地址(ULAs)
将在启用IPv6时使用。这些/64子网包含一个基于Docker Engine随机生成的ID的40位全局ID,以确保高概率的唯一性。
要为动态地址分配使用不同的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个大小为/64的IPv6子网,这些子网来自前缀长度为/56的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 },
{ "base": "2001:db8::/56", "size": 64 }
]
}注意
在这个例子中,地址
2001:db8::是 保留用于文档。 请用一个有效的IPv6网络替换它。默认的IPv4池来自私有地址范围, 类似于默认的IPv6 ULA 网络。
Docker中的Docker
在使用xtables(传统的iptables)而不是nftables的主机上,必须在创建IPv6 Docker网络之前加载内核模块ip6_tables,通常在Docker启动时会自动加载。
然而,如果您在基于非最新版本的官方docker镜像的Docker中运行Docker,您可能需要在主机上运行modprobe ip6_tables。或者,使用守护进程选项--ip6tables=false来为容器化的Docker引擎禁用ip6tables。