Docker 容器中启用 IPv6 网络

status
Published
type
Post
slug
docker-enable-ipv6
date
Jun 24, 2021
tags
Docker
Linux
Config
summary
为 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。具体配置步骤可以参考上述文中的详细说明。
之前使用 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 地址了
notion image
同样我们还可以用命令创建支持 IPv6 的网络,此处 2001:db8:1::/64 是用于文档或源码演示的 IPv6 保留地址
docker network create --ipv6 --subnet="2001:db8:1::/64" --gateway="2001:db8:1::1" ipv6_net_1
notion image
虽然现代操作系统在 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
      notion image
 
 
  1. 使用 2 版本的 docker-compose.yml
    1. 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
      notion image
 
 
 
 

参考