将Docker容器里的端口映射出来的方法【20220415】

发表于 2022-04-12
阅读 20

介绍

介绍

福哥的Docker环境有一些服务是只能针对一些特定的IP地址开放的,而docker的端口映射要不就是针对全部网络设备放开,要不就是针对某一个网络设备放开,无法满足福哥的需要。

没有办法了,既然Docker无法解决福哥的问题,福哥只能自己iptables解决了~~

默认网络与自定义网络

网络列表

查看网络列表的方法如下:

docker network ls

home/topic/2022/0414/16/ed37aa9023421591118f5705de437e32.png

默认网络

默认网络包含一堆的默认规则,这些规则支持了更多的功能。

docker-compose的默认网络就是配置文件所在目录的目录名称+default,目录名称全部取小写,例如:目录名称是Tongfunet,则默认网络名称就是tongfunet_default。

自定义网络

自定义网络比较清爽,没有默认网络的一堆的默认规则。当然支持的功能也没有默认网络的多,基本上都需要自己编写实现功能的规则。

福哥这里的自定义网络就是bridge2这个网络。

组合网络

如果容器包括默认网络和自定义网络的话,一定要以自定义网络为主进行端口映射。

端口映射

正常情况

默认网络映射端口需要设置如下三条规则,包括两条nat规则和一条主表规则。

iptables -A DOCKER -p tcp -m tcp ! -i bridge2 -o bridge2 -d 10.16.0.8 --dport 80 -j ACCEPT
iptables -t nat -A DOCKER -p tcp -m tcp ! -i bridge2 --dport 80 -j DNAT --to-destination 10.16.0.8:80
iptables -t nat -A POSTROUTING -p tcp -s 10.16.0.8 -d 10.16.0.8 --dport 80 -j MASQUERADE

超长网络名称

如果自定义网络的名称长度超过15个字符,就不能直接用于iptables命令了。

需要获得网络的NETWORK ID,这个NETWORK ID可以在查看网络列表的时候看到。
home/topic/2022/0414/16/ed37aa9023421591118f5705de437e32.png然后用NETWORK ID拼凑一个网络名称,格式为:

br-[NETWORK ID]

home/topic/2022/0414/17/ca01982b3c01bb6665860b9685458bb5.png

端口映射还是三条规则,唯一的区别就是网络设备不一样。

iptables -A DOCKER -p tcp -m tcp ! -i br-7b57e1d23c71 -o br-7b57e1d23c71 -d 172.18.0.8 --dport 80 -j ACCEPT
iptables -t nat -A DOCKER -p tcp -m tcp ! -i br-7b57e1d23c71 --dport 80 -j DNAT --to-destination 172.18.0.8:80
iptables -t nat -A POSTROUTING -p tcp -s 172.18.0.8 -d 172.18.0.8 --dport 80 -j MASQUERADE

注意:如果网络名称没有超过15个字符,一定不能用br-[NETWORK ID]作为网络设备名称!

总结

今天福哥带着大家学习了如何给Docker容器的端口映射出来的方法,通过这种技术可以随心所欲的将Docker容器里面的端口开放给我们想要开放的IP地址。



鬼谷子叔叔

跟福哥学编程吧~~
日志
212
浏览
1626