Linux系统中给Docker开启IPv6

鉴于网上的教程太多,而且很多是旧资料,并且官网的资料也是既不清晰又不准确,因此这里记录一个简单可行(2024年2月)的操作步骤。

本教程前置条件

  1. Linux系统
  2. 服务器有固定IPv6地址,而且进行了正确配置。
  3. 单节点

一、查询服务器的IP段

使用ip addrifconfig命令查询一下服务器的IPv6地址段:

# ip addr 
...
2:  eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether f2:3c:92:24:24:c2 brd ff:ff:ff:ff:ff:ff
    inet ***.***.***.***/24 brd ***.***.***.*** scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2400:1234::bbbb:cccc:dddd:eeee:ffff/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 5117sec preferred_lft 1517sec
    inet6 fe80:1234:aaaa:bbbb:cccc:dddd:eeee:ffff/64 scope link
       valid_lft forever preferred_lft forever
...

从上面可知,服务器的IP地址是2400:1234::bbbb:cccc:dddd:eeee:ffff,掩码64位,所以IP段就应该是2400:1234:0:bbbb::/64

二、配置Docker开启IPv6

编辑/etc/docker/deamon.json文件:

{
    "ipv6": true,
    "fixed-cidr-v6": "2400:1234:0:bbbb::/64",
    "experimental": true,
    "ip6tables": true
}

fixed-cidr-v6部分替换成你的服务器的IP段。

重启Docker,重启完成后输入docker network inspect bridge,在输出内容中找到EnableIPv6,如果它的值是true,说明Docker已开启IPv6。

三、使容器启用IPv6

docker run模式

创建一个支持IPv6的网络:

docker network create --ipv6 --subnet="fc00:0:0:1::/64" mynet

其中fc00:0:0:1::/64也可以换成其他内网网段。

删掉现有容器,然后重新创建容器,并使用--network参数指定网络,例如

docker run -d -v xxxx -p xxxx --network mynet xxxx/xxxx

容器启动成功后,使用docker inspect查看容器信息,如果其中的GlobalIPv6Address出现IPv6地址说明启用成功。

docker-compose模式

修改docker-compose.yaml配置文件,在最后面增加(如果已有类似内容,请根据实际情况调整):

networks:
  default:
    enable_ipv6: true
    ipam:
      config:
        - subnet: fc00:0:0:1::/64

删除现有容器,然后使用docker network lsdocker network rm xxx删除compose创建的网络。容器和网络删除完成后,使用docker compose up -d来重新创建容器。

如果在docker compose up -d时报错,提示pool overlaps with other one on this address space,说明你忘记删除network了,手工删掉即可。

容器启动成功后,使用docker inspect查看容器信息,如果其中的GlobalIPv6Address出现IPv6地址说明启用成功。