Docker 容器中启用 IPv6 网络

✨ 为 Docker 容器启用 IPv6 支持,需要在 Docker 守护进程中进行配置。在 /etc/docker/daemon.json 文件中添加以下内容:experimental 设置为 true,ipv6 设置为 true,ip6tables 设置为 true,fixed-cidr-v6 设置为一个子网。然后重启 Docker 服务。可以使用命令或 Docker Compose 创建支持 IPv6 的网络。在使用 IPv6 时需要注意修改 /etc/gai.conf 以使其优先级高于 IPv4。具体配置步骤可以参考上述文中的详细说明。

TOC

之前使用 Docker 时,默认是没有开启 IPv6 的。这几天自己的服务器升配有了 IPv6 地址,于是整理一下为 Docker 启用 IPv6 支持。

根据官网文档

在 Docker 容器中使用 IPv6 之前,需要在 Docker 守护进程中启用 IPv6 支持。只有在 Linux 主机上运行的 Docker 守护进程才支持 IPv6。

Docker 配置 IPv6 支持

修改/etc/docker/daemon.json,加入以下内容

{	
  "experimental": true,
	"ipv6": true,
	"ip6tables": true,
	"fixed-cidr-v6": "fd00:db8:1::/64"
}
💡

说明

  • fixed-cidr-v6 为默认桥接网络分配一个子网,启用动态 IPv6 地址分配。
  • ip6tables 启用额外的 IPv6 数据包过滤规则,提供网络隔离和端口映射。该参数要求 experimental 设置为 true 。
  • ipv6 在默认网络上启用 IPv6 网络。

上面我们为容器分配的是 IPv6 中的本地地址 (Unique Local Address),因为如果直接分配公共的IPv6 地址,会给我们管控 Docker 端口映射带来麻烦,服务直接暴露于公网也会带来一定安全隐患。并且当前测试的服务器只分配了一个 /128 的 IPv6 地址,也没有多余的可以分给容器了。

故我们通过 Docker 对 IPv6 NAT 的实验性支持,为其分配”内部“ IPv6 地址。

上面文件修改完成后,重启以应用配置。

sudo systemctl daemon-reload

sudo systemctl restart docker

此时再启动容器已经可以看到有 IPv6 地址了

同样我们还可以用命令创建支持 IPv6 的网络,此处 2001:db8:1::/64 是用于文档或源码演示的 IPv6 保留地址

docker network create --ipv6 --subnet="2001:db8:1::/64" --gateway="2001:db8:1::1" ipv6_net_1

虽然现代操作系统在 IPv4 和 IPv6 双栈网络环境下都是优先 IPv6 的,但如果地址是 ULA 的 IPv6,其优先级是低于 IPv4 的,若要使得 IPv6 依然优先,需修改 /etc/gai.conf。

Docker Compose 开启 IPv6

根据搜索到的信息,因较新版本的 Docker Swarm 不支持 IPv6 ,所以 版本号 3 下 Docker Compose 不支持创建使用 IPv6 。 下面我们通过两种方式来使用 IPv6 网络。

  1. 使用已经创建好的 IPv6 网络

    • 手动创建一个 Docker 网络,就类似上面👆那样。
    • 编辑 docker-compose.yml
    version: "3"
    services:
      nginx:
        image: nginx:alpine
        networks:
          - ipv6_net_1
    
    networks:
      ipv6_net_1:
        external: true

  1. 使用 2 版本的 docker-compose.yml

    version: "2.4"
    services:
      nginx:
        image: nginx:alpine
        networks:
          - ipv6_net_2
    
    networks:
      ipv6_net_2:
        enable_ipv6: true
        ipam:
          config:
            - subnet: 2001:db8:2::/64
              gateway: 2001:db8:2::1 

参考