关于Vmware虚拟机挂起后恢复主机无法访问docker的container服务

问题展示

最近每次挂起虚拟机后恢复,主机总是无法正常访问虚拟机中docker的container。
在这里插入图片描述

问题原因

Vmware 网桥配置没有开启转发功能

知识点拓展

Docker 和 iptables 的关系。

Docker 能为我们提供很强大和灵活的网络能力,很大程度上要归功于与 iptables 的结合。Docker 在启动的时候已经帮我们自动完成了相关的配置。

[root@zbx-agent01 ~]# dockerd --help |grep iptables
      --iptables                                Enable addition of iptables rules (default true)
[root@zbx-agent01 ~]#

docker daemon 的 --iptables 就是用来控制是否要自动启用 iptables 规则的,默认已经设置成了开启(true)。
当我们运行容器时(STATUS:up),docker 会在 iptables 自定义链 DOCKER 中定义转发规则,如果此时系统的 net.ipv4.ip_forward 为0,主机将无法正常访问服务。

Linux系统数据包转发

出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功

  1. 通过访问sysctl的内核ipv4.ip_forward来判断转发是否开启。
    说明:现在有些网络已经普及ipv6的,所以下面的命令可以从ipv4改为ipv6即可
# 使用sysctl:
[root@zbx-agent01 ~]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
# 检查/proc下的文件:
[root@zbx-agent01 ~]# cat /proc/sys/net/ipv4/ip_forward
1
[root@zbx-agent01 ~]#
# ipv4转发没有开启 (值为 0)
  1. 启动IP转发
####################    临时    ################################

# 通过sysctl可以开启ipv4的转发功能 (无需重启):
[root@zbx-agent01 ~]# sysctl -w net.ipv4.ip_forward=1
# 或者
[root@zbx-agent01 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

####################    永久    ################################
# 通过在/etc/sysctl.conf设置参数,增加一条net.ipv4.ip_forward = 1
[root@zbx-agent01 ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
[root@zbx-agent01 ~]# systemctl restart network

解决方法

治标不治本之重启Docker服务大法

Docker 在重启的时候,会进行 iptables 相关规则的清理和重建。
[root@zbx-agent01 ~]# systemctl restart docker \
> docker start $(docker ps -qa)

临时开启ipv4的转发功能

# 通过sysctl可以开启ipv4的转发功能 (无需重启):
[root@zbx-agent01 ~]# sysctl -w net.ipv4.ip_forward=1
# 或者
[root@zbx-agent01 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
上述方法对于经常挂起需求的很麻烦。

永久开启ipv4的转发功能

# 通过在/etc/sysctl.conf设置参数,增加一条net.ipv4.ip_forward = 1
[root@zbx-agent01 ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
[root@zbx-agent01 ~]# systemctl restart network

探索过程

以下为探索过程
主机ping虚拟机
在这里插入图片描述
重启虚拟机相关

# 重启虚拟机网络 (无效)
[root@zbx-agent01 ~]# systemctl restart network

# 重启container (无效)
[root@zbx-agent01 ~]# docker restart $(docker ps | awk '/prometheus/ {print $1}')
23c24acd8961
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值