[TOC]
一般我们在创建容器的时候都可以 -p 指定多个端口或者 -P 指定随机端口,但是比较麻烦的是我们在创建了容器之后又想映射多一个或者多个端口,但是这时候docker 又没有支持的命令进行 *** 作。
那首先就需要先了解docker 端口映射是怎么一个工作原理了。
一般情况下,容器是可以访问外网,而外部网络是不能访问到容器的。
容器所有到外部网络的连接,源地址都会被NAT成本地系统的IP地址。这是使用 iptables 的源地址转换实现的。
查看宿主机的NAT表
可以看到上面的iptables的规则把所有源地址在 172.17.0.0/16 网段,目标地址为其他网段(外部网络)的流量都进行了转换(伪装)从宿主机的网卡发出。MASQUERADE 跟传统 SNAT 的好处是它能动态从网卡获取地址。
以上的端口转换是在创建容器时指定的:
使用 -p 命令来进行端口映射,在这里可以看出,当外部访问宿主机与容器所映射的端口时,iptables 的NAT表会对目的端口进行转换,转换为相应的容器的 ip:port
经过上面的分析我们知道了外部网络是如何访问带容器内部的。
因此我们需要添加 DNAT 规则以及允许访问宿主机的容器IP和端口。
测试
在容器中用 nc 监听一个端口
然后添加了上面两条防火墙规则后,再去测试能否连通宿主机的 123 端口
验证了是可以通的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)