Original link: https://imciel.com/2021/03/31/config-docker-ipv6/

IPv6 有了,运营商用 PD 协议下发了 240e:3b7:xxx:xxx::/60 这个前缀,理论上,就可以随便分配 IP 给下游设备了,虚机机之类的如果可以桥接,也是没有问题的,那 Docker 可以吗?Docker 支持 IPv6 大概有两种情况

  • 每个容器都有 IPv6 地址
  • 每个容器能访问 IPv6 网络,但是没有公网 IPv6 地址

官方对 IPv6 的支持不太积极,macOS 上的一些问题一直挂着没有解决,可能 macOS 比较特殊吧,官方文档中提到 IPv6 的支持很简单,需要修改 /etc/docker/daemon.json,加入两个选项

{
  "ipv6": true,
  "fixed-cidr-v6": "fd00::/80"
}
docker network inspect bridge

可以看到 bridge 网络已经有了正确的 IPv6 配置,用以下命令测试一下

docker run --network=bridge --rm -it busybox ping -6 -c4 google.com

发现 ping 不通

修改配置文件,加入以下内容

{
  "ipv6": true,
  "fixed-cidr-v6": "fd00::/80",
  "ip6tables": true,
  "experimental": true
}

重启 Docker,再次测试,发现可以 ping 通了

新加的配置项 ip6tables 是用来开启 IPv6 NAT 的,experimental 是用来开启 IPv6 NAT 的前提,不加这个配置项,ip6tables 会被忽略

如果是 docker-compose,先创建一个网络,并在 docker-compose.yml 中指定网络

docker network create --subnet=fd01::/80 --gateway=fd01::1  --ipv6 imciel-com
version: '3.7'
services:
  image: busybox
  command: ping -6 -c4 google.com
  networks:
    - imciel-com

networks:
  imciel-com:
    name: imciel-com

该方案同样适用于购买服务器时提供商给了一个 /128 的 IPv6 地址的情况,通过该方案,容器可以有一个 fd00::/80 范围的地址,并通过 NAT 到服务商给的 /128 地址访问 IPv6 网络

在一些不支持 IPv6 NAT 的环境(如 DSM 6.1)中,可以尝试通过 macvlan 来配置 IPv6 网络

通过 macvlan 创建 IPv6 网络

前提,该设备处在一个通过 SLAAC 配置 IPv6 的网络中,如家庭网络,企业网络等

macvlan 基于物理网卡创建一个虚拟网卡,可以通过给虚拟网卡配置 IPv6 地址来实现容器的 IPv6 访问

version: "3.5"
services:
  qbittorrent:
    image: linuxserver/qbittorrent:latest
    container_name: qbittorrent
    mac_address: 68:67:43:3b:de:fd
    networks:
      app_net:
        ipv4_address: 192.168.33.11

networks:
  app_net:
    name: app_net
    enable_ipv6: true
    driver: macvlan
    driver_opts:
      parent: eth0
    ipam:
      driver: default
      config:
        - subnet: 192.168.33.0/24
          gateway: 192.168.33.1
        - subnet: fd0d:7eb5:2afd::/64
          gateway: fd0d:7eb5:2afd::1

通过上面配置创建的容器其可以自动获得 IPv6 地址,注意需要根据自己的网络环境修改配置,如 parent 网卡,subnet 等

其原理是通过 macvlan 创建的虚拟网卡,可以接收 RA 消息并得到一个 IPv6 地址