docker容器启动后外部浏览器无法访问的问题
作者:zy158194
本文主要介绍了docker容器启动后外部浏览器无法访问的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
问题描述:
- docker nginx容器启动后外部使用浏览器无法访问,直接在服务器上可以访问
- 停掉nginx容器,用相同的端口启动自己的应用,外部使用浏览器能直接访问
排查:
- 端口问题?既然使用自己的应用启动后,外部是能访问的通的,说明端口是开放的;排除
- 容器内应用只监听了 127.0.0.1?我使用的官方nginx容器,只做了端口映射,默认配置的是0.0.0.0,而且我在服务器上使用服务器IP访问也是通的;这个也排除
- iptables针对 Docker 网桥的限制
使用下面命令查看
sudo iptables -L FORWARD -n
结果如下:
[root@localhost bin]# sudo iptables -L FORWARD -n Chain FORWARD (policy DROP) target prot opt source destination
问题分析
Chain FORWARD的意思是转发链,policy DROP的意思是如果没有明确的规则允许当前请求通过,那么防火墙将直接丢弃该数据包;
外部访问docker容器默认情况下是先请求宿主机的端口,然后宿主机再转发到docker容器的对应端口,也就是说走的是FORWARD链,而防火墙刚好禁止了FORWARD链,所有请求docker容器无法请求;而应用是直接占用服务器端口对外服务的,也即是走的INPUT链,防火墙没有禁止INPUT链,所以应用能访问。
解决办法
第一种:关闭iptables,不建议
第二种:重启docker即可,Docker守护进程在启动时会自动检测 iptables 并添加必要的转发规则
sudo systemctl restart docker
重启后查看FORWARD规则
[root@localhost bin]# sudo iptables -L FORWARD -n Chain FORWARD (policy DROP) target prot opt source destination DOCKER-USER all -- 0.0.0.0/0 0.0.0.0/0 DOCKER-ISOLATION-STAGE-1 all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
可以看到docker自动添加了允许访问的规则
启动docker容器后,使用浏览器也能正常访问了,问题解决

到此这篇关于docker容器启动后外部浏览器无法访问的问题的文章就介绍到这了,更多相关docker启动外部浏览器无法访问内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
