我想用 Docker 构建 IPv6 就绪服务,这些服务可以访问外部网络上的 v6 主机,也可以从外部 v6 网络访问。我现在真的很困惑,所以我想听听使用 Docker 的 IPv6 的最佳实践。以下是我现在想到的:
默认情况下,Docker 配置禁用 IPv6,并且创建的所有容器仅使用 IPv4。对于 v4 地址,我们假设:
所有容器都经过 NAT,并具有来自私有子网的随机 IP 地址。没有来自外部的流量进入容器。
如果我们需要某些服务在外部网络上可用,我们可以通过
-p
标志进行端口映射。要从外部访问服务,我们需要连接到外部 Docker 服务器地址。
那么,v6 呢?好吧,对于 v6,我们假设每个 IP 地址都是可公开路由的。这意味着容器不再经过 NAT,而是直接暴露在外部网络中。一切都应该如此。但我对此有越来越多的疑问……
- 如果我们谈论具有固定 IPv6 地址的服务器,我们可以分配一些 v6 块用于容器。就我而言,我有一个 /64,我已将其分配给 docker。它有效,容器可以到达 IPv6 目标,可以直接从外部访问容器。但是我在笔记本电脑上实际开发这些服务并将其部署到服务器上该怎么办呢?这台笔记本电脑从一个网络移动到另一个网络,从一个 v6 子网移动到另一个,最重要的是移动到 v6 无法访问的地方。我是否应该为此使用 ULA 块并以某种方式进行类似 NAT 的配置以使它们到达外部 IPv6 目标?当然,在这种情况下,我只关心容器到外部的通信,我不需要它们在我的笔记本电脑之外可访问。
- 最终用户是否应该通过 IPv6 地址直接访问容器?如果是这样,我必须在docker-compose.yml并调整 ip6tables FORWARD 链以向外部开放所需的容器端口。在这种情况下我应该保持不同的docker-compose.yml服务器和笔记本电脑使用不同的静态地址?如果我决定与一个不太关心 v6 并且使用默认 docker 设置的人共享我的服务,我应该在没有 v6 的情况下维护第三个组合配置吗?v4 不存在这样的问题,因为我们只需映射所需的端口,然后让 Docker 发挥它的魔力。
- 如果我使用静态 v6 地址,那么我假设我应该使用预定义网络?就像是:
networks:
app_net:
external:
name: appnet
也许我应该研究 IP 自动配置和动态 DNS,比如如果内部 IP 地址改变则让 DNS 更新?例如 nsupdate。
或者我是否应该放弃使用直接 IPv6 通信的所有想法并继续进行端口映射?
你对此有何经验?