docker 容器开启 ipv6 支持

发布于 2023-03-21  6 次阅读


前言

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
bridge 网络已支持 ipv6 了

当然,我们可以自定义一个网络,方便对以后某些容器的集中化管理及容器之间的互相访问:

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
能返回结果,说明 ipv6 配置 ok!