Featured image of post 一个简单开启 Docker IPv6 的方法

一个简单开启 Docker IPv6 的方法

配图: rows of yellow lounge chairs photo – Free Image on Unsplash

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

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

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

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

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

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

发现 ping 不通

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

1
2
3
4
5
6
{
  "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 中指定网络

1
docker network create --subnet=fd01::/80 --gateway=fd01::1  --ipv6 imciel-com
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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 访问

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
---
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 地址

以上

Built with Hugo
主题 StackJimmy 设计