Docker服务正常运行一段时间后突然无法访问问题排查

服务器重启后Docker服务访问失败

问题描述:

Docker运行的web服务正常运行,配置服务器重启自启动Docker和容器。但是机房断电重启后,web服务无法正常访问。telnet服务器的端口不通。

环境:

ApplicationVersion
OScentos7
Docker19.03.1
docker-compose1.24.0

一、 检查服务容器是否启动

$ docker-compose ps

在这里插入图片描述

发现web服务器与php容器都已正常启动

如果有容器未启动就启动容器
$ docker-composer up -d 

重启后,访问web服务是否正常,服务启动可能会需要一些时间,一般能telnet通端口基本就不会有什么问题。

二、检查是否被防火墙屏蔽

服务容器正常启动依然无法访问,就需要检查一下防火墙了,先查看防火墙状态

$ firewall-cmd --state

在这里插入图片描述
not running发现防火墙未运行,可以排除防火墙的影响

如果是running则需要进一步排查,端口是否开放

firewall-cmd --list-ports
firewall-cmd --list-services
如果端口未开放,有两种情况:
1. 不需要防火墙,直接关掉防火墙服务
$ sudo systemctl stop firewalld.service
2. 需要防火墙,添加需要开放的端口
$ sudo firewall-cmd --add-port=80/tcp --permanent
$ firewall-cmd --reload

完成后访问web服务看是否正常

三、检查路由IP转发是否开启

前两步的影响排出后,最后检查IP转发是否开启,一般问题出在这里

$ sysctl net.ipv4.ip_forward

在这里插入图片描述

发现IP转发未开启,解决方案:
开启IP转发,在配置文件添加策略
$ echo 'net.ipv4.ip_forward = 1' | sudo tee -a /usr/lib/sysctl.d/50-default.conf

重新加载配置文件(也可以重启network服务)

$ sudo sysctl -p /usr/lib/sysctl.d/50-default.conf

查看IP转发是否开启
在这里插入图片描述
IP转发已开启,访问web服务看是否正常了。

问题解析:

Docker与宿主机的端口映射是通过iptables实现的,容器启动时会在iptables中添加DOCKER链和nDNAT规则

简单来了解一下,查看一下nat表的DOCKER

$ sudo iptables -t nat -nvL DOCKER

在这里插入图片描述

从图中可以看到有两条DNAT规则,这两条规则分别将宿主机44380端口的报文转发到172.17.3.244380端口上,而172.17.3.2是分配给nginx容器的ip(可以通过docker inspect 容器ID命令查看)

而这个DNAT规则需要宿主机开启内核IP转发功能,所以IP转发未开启会导致服务访问失败。

问题的根源找到了,但是产生的原因还没找到。

为什么之前没有手动开启IP转发时DOCKER服务依然能正常运行?

这是因为Docker daemon启动时会检查IP_FORWARD是否开启,如果未开启则临时开启,因为是临时开启所以在network服务重启后就会失效。服务器断电重启后network服务自然会重启,就有可能导致IP_FORWARD失效。一般docker服务正常运行一段时间后却突然访问不了,大不多是因此引起的,可以从这里开始排查。

当然不妨自己来做个试验

  1. 关闭IP转发功能,此时访问web服务失败
  2. 重启docker
$ sudo systemctl restart docker

访问web服务成功,查看IP转发功能是已开启状态。所以docker服务访问失败时往往能够通过重启docker解决,但是不推荐这么做,因为既没真正解决问题容器重启还比较费时。

  1. 重启network
$ sudo systemctl restart network

访问web服务成功,查看IP转发功能是已关闭状态

最后记得将IP转发功能恢复

  • 11
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Docker容器的端口映射突然无法连接时,可以按照以下步骤进行排查: 1. 确认容器是否正在运行:使用`docker ps`命令检查容器的运行状态,确保容器正在运行。如果容器已停止,可以使用`docker start`命令重新启动容器。 2. 检查端口映射配置:使用`docker port <容器名称或ID>`命令检查容器的端口映射配置是否正确。确保容器的端口映射配置与所需的访问端口一致。 3. 检查主机防火墙规则:如果主机上存在防火墙,需检查防火墙规则是否允许流量通过容器映射的端口。可以临时关闭防火墙进行测试,如果能够连接则说明防火墙规则可能导致连接问题,需要配置允许通过容器映射的端口。 4. 检查网络连接:使用`ping`命令测试主机与容器之间的网络连通性。如果无法ping通容器IP,则可能是网络配置问题。可以尝试重启网络服务或重新配置网络。 5. 检查容器日志:使用`docker logs <容器名称或ID>`命令查看容器的日志信息,检查是否存在错误或异常提示。日志中可能会显示容器启动过程中的错误信息,从而指导我们排查问题。 6. 检查容器内部服务状态:如果容器中运行着特定的服务,可以登录到容器内部进行检查。使用`docker exec -it <容器名称或ID> bash`命令可以进入容器的命令行界面,查看容器内部相关的服务是否正常运行。 以上是排查容器端口映射无法连接的一般过程,根据具体情况可能需要更深入的排查。如果无法解决问题,可以参考Docker官方文档、技术论坛或向相关社区求助,以获取更多帮助。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值