使用ipv6访问群晖下的docker一点经验与疑问
本文最后更新于 2023年9月18日 上午
使用ipv6访问群晖下的docker一点经验与疑问
最近,我在搭建我的新 NAS 时遇到了一个问题:由于我没有 IPv 4 公网地址,但是我的网络环境支持 IPv 6,所以我希望能够通过 IPv 6 直接访问我的 Docker 上的服务。虽然最终我找到了解决方案,但整个过程并不太顺利。在这篇文章中,我想分享一下我的经验,并探讨是否有更好的解决方法。
折腾过程与测试结果
我首先获取了一个支持 IPv 6 的 Docker 容器。在我的测试中,我创建了两个容器,一个使用 host
网络模式并开放了 66 端口,另一个放在 bridge
网络模式并将容器内的 80 端口映射到宿主机的 668 端口。
在我的内网中,通过 IPv 4 可以正常访问这些端口。需要注意的是容器记录的 IP 地址:
但是在 IPv6 网络下,我无法直接访问处于 bridge
模式下的容器,而访问宿主机是没有问题的:
为了解决这个问题,我尝试了在 Docker 宿主机上设置反向代理。我让宿主机将接收到的来自 IPv6 的 666 端口请求转发到 bridge
模式下容器的 668 端口:
这样,现在我可以通过 IPv6 访问位于 bridge
模式下的容器了!
解决方案思路
通过我的实验和思考,我得出了一些结论,尽管这些解决办法不太完美,但目前可供选择的方案是:
- 将容器设置为使用 Docker 的
host
网络模式。这样,我们不需要进行端口映射,因为容器可以直接使用主机网络。但是,需要在容器创建时确定容器的环境端口,因为在容器创建后更改环境端口是无效的。 - 将容器设置为使用 Docker 的
bridge
网络模式,并在宿主机上使用反向代理来实现端口转发。这种方法占用了两个端口,但是端口可以随时更改。需要注意的是反向代理可能会对网络性能产生一定的影响。
更好的解决方案?
然而,我仍然希望找到一种更好的解决方案,可以让处于 bridge
模式下的容器直接通过外部的 IPv 6 访问而无需使用反向代理。
如果你有任何关于这个问题的思路或解决方案,请不要犹豫,分享给我,我会非常感激!