Docker容器端口映射后突然无法连接的排查过程容器端口映射后突然无法连接的排查过程
主要给大家介绍了关于Docker容器端口映射后突然无法连接的排查过程,文中通过示例代码介绍的非常详细,
对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
一、背景一、背景
一般需要对外提供服务的Docker容器,我们在启动时后使用-p命令将对外访问端口暴露给外部,例如启动Docker Registry,
我们将5000端口映射出来供外部访问:
docker run -d -p 5000:5000 registry
但最近碰到一个非常奇怪的情况:研发组里一个CentOS 7测试环境里部署有Docker Registry,并对外暴露了端口。启动容器
后一段时间内都是可以正常工作的,但在不定时间间隔后,外部主机就会出现无法从仓库中拉取镜像的情况,提示TimeOut:
然而在Docker宿主机上访问仓库则可以正常访问:
至于这个问题,只有手动重启出问题的Docker daemon服务后,外部才可以重新访问,但只要再过一段时间又会出现这样的
问题。
二、问题排查二、问题排查
碰到这个问题我第一反应就是问组里的人,是不是有人重启过CentOS 7 自己的firewallD了。
因为这台服务器是我配置的,防火墙虽然开着但我已经开启端口访问了,所以肯定不是因为防火墙阻断连接的缘故。但由于这
篇文章是篇踩坑排查文档,所以还是把这种情况写出来了
情况一:开着防火墙但没有开放端口情况一:开着防火墙但没有开放端口
CentOS 7自带并启用了防火墙FirewallD,我们可以通过下面的命令检查FirewallD的状态:
firewall-cmd --state
如果输出的是“not running”则FirewallD没有在运行,且所有的防护策略都没有启动,那么可以排除防火墙阻断连接的情况了。
如果输出的是“running”,表示当前FirewallD正在运行,需要再输入下面的命令查看现在开放了哪些端口和服务:
firewall-cmd --list-ports
firewall-cmd --list-services
可以看到当前防火墙只开放了80/tcp端口、ssh服务(22/tcp)和dhcpv6-client服务,并没有打开Docker容器映射的5000/tcp端
口。
解决方案有两种:解决方案有两种:
1.关闭关闭FirewallD服务:服务:
如果您不需要防火墙,那直接关掉FirewallD服务就好了
systemctl stop firewalld.service
2.添加策略对外打开指定的端口:添加策略对外打开指定的端口:
比如我们现在要打开对外5000/tcp端口,可以使用下面的命令:
firewall-cmd --add-port=5000/tcp --permanent
firewall-cmd --reload
如果只是临时打开端口,去掉第一行命令中的“--permanent”参数,那么当再次重启FirewallD服务时,本策略将失效。
情况二:人为重启情况二:人为重启CentOS 7的的FirewallD服务服务
FirewallD是CentOS系统在7版本引入的新组件,简单的说就是iptables的包装,用于简化防火墙相关的设置。
然而FirewallD和Docker相处的并不是特别好,当FirewallD启动(或重新启动)时,会从iptables中删除DOCKER链,造成
Docker不能正常工作:
评论0