【发布时间】:2017-08-05 03:03:07
【问题描述】:
主要目标是做一个真正的 NAT 而不是 NAPT。注意正常的docker run -p ip:port2:port1 命令实际上是在做 NAPT(地址+端口转换)而不是 NAT(地址转换)。是否可以只映射地址,但保持所有暴露端口与容器相同,例如docker run -p=ip1:*:* ... ,而不是一个一个或一个范围?
ps.1。我的端口范围相当大(22-50070,ssh-hdfs),所以端口范围方法不起作用。
ps.2。也许我需要一组虚拟机并将主机加入到集群中。
ps.3 我提出了an feature request on github。不确定他们是否会接受它,但目前有 2000 多个未解决的问题(它非常受欢迎)。
解决方案
在 linux 上,你可以通过 ip 和 port 访问任何容器,无需任何绑定(没有-p)ootb。 Docker 版本:CE 17+
如果您的主机是 windows,并且 docker 运行在像我这样的 linux VM 上,要访问容器,唯一需要做的就是在 windows route add -p 172.16.0.0 mask 255.240.0.0 ip_of_your_vm 上添加路由。现在您可以通过 IP:port 访问所有容器,而无需从 windows 主机和 linux 虚拟机进行任何端口映射。
【问题讨论】:
-
这意味着丢失主机上的每个端口,甚至是 SSH 端口。那么为什么要遵循这种方法呢?
-
你可以使用空闲的ip地址。它不影响任何主机端口。这比默认的端口映射方法要好得多。
-
所以你确实有一个空闲的 IP 可用。基于 IPTables 的解决方案适合您吗?
-
你可以为你的 eth0 添加多个 IP。我还没有尝试过 iptables。我在win10上运行docker。