docker端⼝映射及外部⽆法访问问题
docker容器内提供服务并监听8888端⼝,要使外部能够访问,需要做端⼝映射。
docker run -it --rm -p 8888:8888 server:v1
此时出现问题,在虚机A上部署后,在A内能够访问8888端⼝服务,但是在B却不能访问。
这应该是由于请求被拦截。
⼀、查看firewall-cmd --state
如果输出的是“not running”则FirewallD没有在运⾏,且所有的防护策略都没有启动,那么可以排除防⽕墙阻断连接的情况了。如果输出的是“running”,表⽰当前FirewallD正在运⾏,需要再输⼊下⾯的命令查看现在开放了哪些端⼝和服务:
firewall-cmd --list-ports
firewall-cmd --list-services
解决⽅案有两种:
1.关闭FirewallD服务:
如果您不需要防⽕墙,那直接关掉FirewallD服务就好了
systemctl stop firewalld.service
2.添加策略对外打开指定的端⼝:
⽐如我们现在要打开对外5000/tcp端⼝,可以使⽤下⾯的命令:
firewall-cmd --add-port=5000/tcp --permanent
firewall-cmd --reload
如果只是临时打开端⼝,去掉第⼀⾏命令中的“--permanent”参数,那么当再次重启FirewallD服务时,本策略将失效。
⼆、ip转发没有打开
sysctl net.ipv4.ip_forward
显⽰net.ipv4.ip_forward=0则表⽰未打开。
如何打开端口三、service iptables打开并拦截了
可关闭service iptables
service iptables stop
若docker run时出现错误:
iptables: No chain/target/match by that name.
则只需重启docker服务即可
service docker restart
或者:
#设置iptables防⽕墙为开机启动项
systemctl enable iptables.service
#启动防⽕墙使配置⽂件⽣效
systemctl start iptables.service
#停⽌防⽕墙
systemctl stop iptables.service
#重启防⽕墙使配置⽂件⽣效
systemctl restart iptables.service
最终版本:
启动docker并进⾏端⼝映射后,docker会在iptables中添加DNAT规则,将收到的对应端⼝的包转换ip并进⾏转发,同时添加规则将所有来⾃docker⽹域的ip进⾏转换。
但是在Centos7上出现docker可以正常访问外⽹,但是外⽹发出的请求在经过eth1接收转发后送达不到docker0,或者送到却出现(oui Unknown)的状况。暂时不清楚这到底是为什么经过DNAT后⽆法送达docker0.
最终解决办法是在启动docker后,重启iptables
service iptables restart
清空docker添加的所有规则,⽽后添加规则
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
将所有来⾃docker的包172.17.0.0/16的ip替换为本机ip并发送,以达到docker访问外⽹的⽬的。
到此这篇关于docker端⼝映射及外部⽆法访问问题的⽂章就介绍到这了,更多相关docker端⼝映射及外部访问内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论