用过docker的都知道,容器创建运行后是无法动态的为容器添加端口映射的。端口映射本质上还是用NAT的功能来实现的,所以我们可以使用防火墙来实现对docker端口的动态映射。

iptables -t nat -nvL    # 查看容器的映射情况,找到容器使用的ip地址

# 单IP单容器增加端口映射:
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j -DNAT --to-destination 172.17.0.2:80    # 将服务器80端口映射到容器的80端口

# 多IP多容器增加端口映射:
iptables -t nat -A PREROUTING -d 10.13.13.2 -p tcp -m tcp --dport 10050 -j DNAT --to-destination 172.17.0.3:10050    # 将指定的外网ip的10050端口映射到指定容器的10050端口

    容器如果被手动关闭后,重新启动后的容器IP地址会变,之前设置的端口映射就会无效,甚至因为端口占用而无法启动容器,此时需要删除容器的端口映射。

iptables -t nat -nvL --line-number    # 找到容器端口映射的规则编号  
iptables -t nat -D PREROUTING 1    # 删除对应的规则编号,1为找到的规则编号