如何将docker container ip映射到主机ip(NAT代替NAPT)?

主要目标是做一个真正的NAT而不是NAPT。 注意正常的docker run -p ip:port2:port1命令正在执行NAPT(地址+端口转换)而不是NAT(地址转换)。 是否有可能只映射地址,但保持所有暴露端口相同的容器,如docker run -p=ip1:*:* ... ,而不是一个接一个或一个范围?

ps.1。 我的端口范围是相当大的(22-50070,ssh-hdfs),所以端口范围的方法将无法正常工作。
ps.2。 也许我需要一群虚拟机,并将主机join群中。

ps.3我在github上提出了一个function请求 。 不知道他们是否会接受,但目前有2000多个开放的问题(这是如此受欢迎)。

在linux上,你可以通过ip和port来访问任何容器,而不需要绑定(no -p )ootb。 docker版本:CE 17+

如果你的主机是windows,并且docker运行在像我这样的linux虚拟机上,要访问容器,唯一需要做的就是在windows route add -p 172.16.0.0 mask 255.240.0.0 ip_of_your_vm上添加路由。 现在,您可以通过IP:端口访问所有容器,而无需从主机和Linux VM进行任何端口映射。

你有几个选项。 一个是决定你想映射哪个PORT范围,然后在docker run中使用它

 docker run -p 192.168.33.101:80-200:80-200 <your image> 

以上将映射在您的容器上从80200所有端口。 假设你的空闲IP是192.168.33.100 。 但不幸的是,由于docker创build多个iptables分支来设置表和炸弹的内存,所以不能映射更大的端口范围。 这会引发如下的错误

 docker: Error response from daemon: driver failed programming external connectivity on endpoint zen_goodall (0ae6cec360831b46fe3668d6aad9f5f72b6dac5d26cc6c817452d1402d12f02c): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8513 -j DNAT --to-destination 172.17.0.3:8513 ! -i docker0: (fork/exec /sbin/iptables: resource temporarily unavailable)). 

这不是docker映射它的正确方法。 但是这不是他们会同意的用例,所以不能解决上述问题。 下一个选项是在没有任何端口发布的情况下运行docker容器,并在iptables规则下使用

 DOCKER_IP=172.17.0.2 ACTION=A IP=192.168.33.101 sudo iptables -t nat -$ACTION DOCKER -d $IP -j DNAT --to-destination $DOCKER_IP ! -i docker0 sudo iptables -t filter -$ACTION DOCKER ! -i docker0 -o docker0 -p tcp -d $DOCKER_IP -j ACCEPT sudo iptables -t nat -$ACTION POSTROUTING -p tcp -s $DOCKER_IP -d $DOCKER_IP -j MASQUERADE 

ACTION=A将添加规则, ACTION=D将删除规则。 这将设置完整的stream量从您的IPDOCKER_IP 。 如果您在testing服务器上进行此操作,那么这种做法就很好。 不build议在舞台或生产。 Docker增加了更多的规则,以防止其他容器戳入你的容器,但这不提供任何保护

我不认为有直接的方式来做你所问的。 如果在“docker run”中使用“-P”选项,那么在Dockerfile中使用“EXPOSE”暴露的所有端口将自动暴露于主机中的随机端口。 使用“-p”选项,唯一的方法是多个端口多次指定选项。