Docker IPv6 配置

Docker 0 默认不开启 IPv6 配置, 但是在某些场景我们又需要 IPv6 网络的支持, 特别是随着 IPv6 的普及,以后使用 IPv6 的场景会越来越多。

注解

本教程假设您的服务器拥有公网 IPv6 地址段, 并且 IPv6 地址段为: 1111:1111:1111:1111::/64

Docker 启用 IPv6 支持 1

首先编辑 /etc/docker/daemon.json 文件,把如下配置添加到配置文件中:

注解

如果 /etc/docker/daemon.json 文件不存在,手动创建即可。

{
    "ipv6": true,
    "fixed-cidr-v6": "1111:1111:1111:1111::/64"
}

重启 docker 服务 systemctl restart docker

宿主服务器配置

如果我们的 Docker 容器需要使用 IPv6 公网地址, 我们还需要配置宿主机器的 路由/转发 规则,允许宿主机 路由/转发 Docker 容器的 IPv6 流量。

注解

这里我们这里假设宿主机的默认 IPv6 网卡名称为 eth0

/etc/sysctl.conf 配置

我们需要宿主机允许转发 IPv6 流量 & 邻居发现消息:

net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.proxy_ndp=1
net.ipv6.conf.default.proxy_ndp=1
# docker0 是 docker 默认的网桥 (bridge)
net.ipv6.conf.docker0.proxy_ndp=1
# eth0 是默认的网卡
net.ipv6.conf.eth0.proxy_ndp=1

使用 sysctl -f 重载系统配置。

ndppd 配置

因为 Linux IPv6 的 ndp 邻居发现配置仅允许单个 IP 配置(IPv6 /128), 因此我们使用 ndppd 守护进程来自动转发邻居发现消息。

注解

理论上我们也可以手工一条一条的配置所有 IPv6 邻居发现消息转发规则。

apt install ndppd

/etc/ndppd.conf 写入如下配置:

route-ttl 30000
address-ttl 30000
proxy eth0 {
   router yes
   timeout 500
   autowire no
   keepalive yes
   retries 3
   promiscuous no
   ttl 30000
   rule 1111:1111:1111:1111::/64 {
      static
      autovia no
   }
}

systemctl restart ndppd

docker-compose 启用 IPv6

docker-compose.yaml 可以使用类似如下的配置启用 IPv6 地址:

version: "2.4"

networks:
  ipv6_network:
    enable_ipv6: true
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: "172.16.238.0/24"
        - subnet: "1111:1111:1111:1111:1::/80"

小技巧

subnet 中的 IPv6 地址不要直接使用 1111:1111:1111:1111::/64, 否则可能会导致路由混乱(Docker 容器无法正常使用 IPv6 网络)。

使用 1111:1111:1111:1111::/64 的任意子网段都可以。

警告

docker-compose 文件 必须使用 version: 2, version: 3 不支持 enable_ipv6 配置 2

如果您已有旧的容器在运行(网络配置发生了变化),则需要先销毁容器 docker-compose down 然后再重新创建 docker-compose up

实现原理

Docker 启用 IPv6 功能的原理实际就是:

  1. 配置宿主机器启用 IPv6 路由/转发 功能

    这是必须的,否则宿主机器不会 路由/转发 Docker 的 IPv6 流量。

  2. Docker 底层网络实现就是在宿主机器创建网桥 (bridge 模式)

    所以一切关于网桥配置的原理都可以应用到这里。

  3. 给宿主机配置正确的 路由/转发 规则

参考资料

0

Docker

1

Docker 启用 IPv6 支持

2

Docker Compose enable_ipv6

Updated on 31 十二月 2021

autovia yes 配置可能会导致 ndppd CPU 使用率 100%, 应该使用 autovia no 配置