主要目标是做一个真正的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和端口访问任何容器而无需任何绑定(无-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:端口访问所有容器,而无需Windows主机和Linux VM的任何端口映射。
答案 0 :(得分:4)
你有几个选择。一种是确定要映射的PORT范围,然后在泊坞窗运行中使用
docker run -p 192.168.33.101:80-200:80-200 <your image>
上方会将容器上80
的所有端口映射到200
。假设您的空闲IP为192.168.33.100
。但不幸的是,由于docker创建了多个iptables for来设置表并轰炸内存,因此无法映射更大的端口范围。它会引发如下错误
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
将删除规则。这样可以设置从IP
到DOCKER_IP
的完整流量。这只有在测试服务器上执行时才有用。不建议用于分期或生产。 Docker添加了更多规则来防止其他容器进入您的容器,但这无法提供任何保护
答案 1 :(得分:0)
我认为没有直接的方法来做你要求的事情。 如果对“docker run”使用“-P”选项,则在Dockerfile中使用“EXPOSE”公开的所有端口将自动暴露在主机中的随机端口。使用“-p”选项,唯一的方法是为多个端口多次指定选项。