Docker 使用 IPv6

最近发现运营商 IPv6 覆盖的已经很全面了,手机和家庭宽带实测都可以互访。刚好手头闲置一个小服务器,配置一下,专门用作IPv6线路的服务给自己使用。

Docker 默认只支持 IPv4,所以需要修改一下配置文件(/etc/docker/daemon.json)才能实现 IPv6 的支持:

{
  "ipv6": true,
  "fixed-cidr-v6": "fd00::/80",
  "registry-mirrors": ["https://ustc-edu-cn.mirror.aliyuncs.com", "https://ghcr.io"]
}

虽然 IPv6 公网IP非常丰富,给每个容器都分配公网IP也没问题,但出于安全考虑,容器还是应该用内网IP,所以配置文件中的前缀使用"fc00::/80"至"fd00::/80"之间的私有网段。

设置以后重启一下服务:

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

查看一下 docker0 的接口信息,可以看到 inet6 fd00::1/80 scope global

$ ip addr show docker0
6: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:02:23:0e:e3:6e brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fd00::1/80 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::42:34cc:fe00:e36e/64 scope link
       valid_lft forever preferred_lft forever
    inet6 fe80::1/64 scope link
       valid_lft forever preferred_lft forever

然后部署容器,就可以用主机的IPv6加端口号访问了。

注意

有些镜像自身没有对 IPv6 做支持,所以不论怎么部署都没法用 IPv6 访问,比如我此前常用的 dehy/adminer 就存在这个问题,而 Docker 官方维护的 adminer 镜像就可以正常使用。

IPv6 基础

地址组成 x:x:x:x:x:x:x:x 共8组x,每个x是16位,共计128位。

2409:8e1a:3dd2:c8a0:12a0:c9cc:fde2:324/64 最后的 /64 表示地址中前 64 位是前缀,即 2409:8e1a:3dd2:c8a0 是固定的前缀。

Reference