前言
docker 安装后创建的容器默认只有 ipv4 而没有 ipv6 的(至少对于目前版本 Docker version 23.0.1),但我希望创建的容器能自动分配 ipv4 和 ipv6,查阅了 docker 官方文档,里面开启 ipv6 首先需要一串网络运营商分配给你的固定 ipv6 地址,而给容器分配的每一个 ipv6 地址都单独可以对外访问(一个没有 NAT 层的世界😄),这种做法更像是目前对服务器而言,而家宽每次拨号 ipv6 前缀都是固定的,所以此方案就有点不可行了。
不过退一步讲,我并不需要给每台容器分配一个可以直接对外的 ipv6 地址,而只需要可以连上 ipv6 网络对外访问就行,这样相当于所有容器组成一个 ipv6 的局域网,然后通过拨号 ipv6 对外访问(一个和 ipv4 一样有 NAT 层的世界🐶)就可以了!
创建配置
首先,创建/编辑 daemon.json 文件:
nano /etc/docker/daemon.json
然后输入以下内容:
{
"ipv6": true, # 开启 ipv6 支持
"experimental": true, # 此项为 false 的话,ip6tables 项设置无效
"ip6tables": true, # 自动设置防火墙
"fixed-cidr-v6": "fd00::/80", # 设置 ipv6 前缀
# 分配默认地址池
# "default-address-pools": [
# {"base": "172.17.0.0/24", "size": 24},
# {"base": "fd00::/80", "size": 80}
# ]
}
default-address-pools
项可开可不在,意义在于如果设置了,对一个未指定 ip 地址范围的网络,如 bridge 而言,那么分配的地址就会默认从这里取用。同样 Ctrl+O
保存,Ctrl+X
退出。
然后重启一下 docker 让配置生效:
systemctl reload docker
创建自定义网络
到此时,其实 docker 已经完成了对 ipv6 的支持,可以查看下默认的 bridge 网络:
docker network inspect bridge
当然,我们可以自定义一个网络,方便对以后某些容器的集中化管理及容器之间的互相访问:
docker network create -d bridge --ipv6 --subnet "fd01::/80" --gateway="fd01::1" --subnet=172.17.1.0/24 --gateway=172.17.1.1 mynet
注意,
--subnet
中创建的 ip 段不要与上面 default-address-pools
中的 ip 段冲突!如上,就创建了一个叫 mynet 的网络,后续可以在 docker 或用 docker compose 把容器加入到这个网络方便统一管理!
验证网络
当然,最后再来验证下网络配置是否无误:
docker run --network=mynet --rm -it busybox ping -6 -c4 bing.com
Comments NOTHING