docker支持ipv6

2022-12-19,,

方法

方法一、Pv6地址

不为容器中的服务特别分配IPv6地址。

只要Docker把外部的IPv6地址端口映射到容器的IPv4端口上,随后访问主机的IPv6相应端口即可。

方法二、为Docker网络分配IPv6地址

(1)Docker daemon默认只支持IPv4地址,通过在运行Docker时增加--ipv6参数可以使其同时支持ipv4和ipv6地址。

(2)此时容器仅获得了本地ipv6地址,如果要获得全局ipv6地址,必须确保机器有至少/80的地址段,通过在运行Docker时增加--fixed-cidr-v6参数为其配置ipv6子网。

该参数会在路由表中添加一条路由,相当于执行了一下命令:

$ ip -6 route add 2001:db8:1::/64 dev docker0

$ sysctl net.ipv6.conf.default.forwarding=1

$ sysctl net.ipv6.conf.all.forwarding=1

随后,所有路由往2001:db8:1::/64的流量都会通过docker0接口路由

(3)除了在运行时添加参数,还可以直接编辑/etc/docker/daemon.json文件,加入以下内容:

{

"ipv6": true,

"fixed-cidr-v6": "2001:db8:1::/64"

}

其中2001:db8:1::/64是IPv6地址段。

systemctl reload docker

(4)使用systemctl restart docker命令重启Docker。

(5)使用ifconfig命令查看分配到Docker网络的IPv6地址段

(6)完成了上面的配置之后,无需特意配置,只需正常建立容器,即可为容器分配IPv6地址。可以使用“docker inspect容器名”查看容器的IP地址。

官网教程

启用ipv6

Edit /etc/docker/daemon.json, set the ipv6 key to true and the fixed-cidr-v6 key to your IPv6 subnet. In this example we are setting it to 2001:db8:1::/64.

{
"ipv6": true,
"fixed-cidr-v6": "2001:db8:1::/64"
} Save the file.
Reload the Docker configuration file. $ systemctl reload docker

启用外部转发

https://docs.docker.com/netwo...

Enable forwarding from Docker containers to the outside world

By default, traffic from containers connected to the default bridge network is not forwarded to the outside world. To enable forwarding, you need to change two settings. These are not Docker commands and they affect the Docker host’s kernel.

Configure the Linux kernel to allow IP forwarding.

$ sysctl net.ipv4.conf.all.forwarding=1

Change the policy for the iptables FORWARD policy from DROP to ACCEPT.

$ sudo iptables -P FORWARD ACCEPT

These settings do not persist across a reboot, so you may need to add them to a start-up script.

创建自己的 ip6 网卡

开启ip6网卡后,只有 bridge 网卡,会自动启用 ip6

创建 user ip6 网卡

docker network create -d bridge --subnet 172.30.20.0/24 mynet2  --ipv6

docker network create -d bridge --ipv6 --subnet "fd00:daad:beee:1::/64" --gateway="fd00:daad:beee::1" --subnet=172.18.0.0/16 --gateway=172.18.0.1 myNet

# 需要仿照 bridge 的信息进行配置
docker inspect 37da
{
"Subnet": "2001:db8:1::/64",
"Gateway": "2001:db8:1::1"
} docker network create -d bridge --ipv6 --subnet "2001:db8:2::/64" --gateway="2001:db8:2::1" --subnet=172.30.20.0/24 mynet2 绑定自己的容器到 自定义的网卡
docker run -d -p 30080:80 --net mynet2 nginx $ sysctl net.ipv6.bindv6only = 1
$ sysctl net.ipv6.conf.default.forwarding=1
$ sysctl net.ipv6.conf.all.forwarding=1 docker network create -d bridge --ipv6 --subnet "2001:db8:3::/64" --gateway="2001:db8:3::1" --subnet=172.30.30.0/24 mynet3
docker run -d -p 30080:80 --net mynet3 nginx

如果需要 直接根据 ip 访问容器 需要 增加 路由配置

ip -6 route 查看路由中转

# 定向 2001:db8:1::/64 ip6 到 docker0 网卡设备
ip -6 route add 2001:db8:1::/64 dev docker0

暂停 删除所有

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

docker支持ipv6的相关教程结束。