问题描述

  • 本人最近在做一个的项目,使用VMware新装了Centos7虚拟机,在虚拟机里面用docker部署了MySQL、Redis、MQ等等容器以及各种微服务。

  • 第一天成功把这些东西部署,然后全部测试完也没什么问题,想着微服务开的比较多,然后工作结束后直接把虚拟机挂起(省得第二天要把其他微服务全部再Run一遍),结果第二天用Navicat连接Mysql死活连不上,想着不会Redis也连不上叭(没错也连不上了),但是其他微服务能正常使用,于是便开始排查问题!

    image-20240616135350074

    image-20240616135532981

问题排查

  1. 查了MySQL和Redis的日志,发现日志正常没什么问题。

  2. 重启MySQL容器,重试连接,同样连不上。

  3. 重启docker后,就能连上了。

  4. 重启虚拟机也能连上。

!!!(但我重启docker后,我其他的微服务就要再Run一遍,非常麻烦!)

解决办法

  • 开始在网上搜寻查阅资料,解决办法如下:

关闭防火墙

  • 由于我在做练手项目(学习模式),所以直接关闭防火墙了,这样就不用每次部署容器时一个个去开放端口,这一步根据自己需要来
1
2
3
4
# 关闭防火墙
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld

修改虚拟机ipv4转发状态

  1. 从虚拟机本机配置文件入手

    1
    vi /usr/lib/sysctl.d/00-system.conf 

    进入后文本如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # Kernel sysctl configuration file
    #
    # For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and
    # sysctl.conf(5) for more details.

    # Disable netfilter on bridges.
    net.bridge.bridge-nf-call-ip6tables = 0
    net.bridge.bridge-nf-call-iptables = 0
    net.bridge.bridge-nf-call-arptables = 0
  2. 在后面添加如下内容

    1
    net.ipv4.ip_forward = 1
  3. 保存退出,接着重启网络服务

    1
    systemctl restart network
  4. 重启以后,输入以下命令,查看IPv4转发状态

    1
    sysctl net.ipv4.ip_forward

    显示如下,则转发成功:

    1
    net.ipv4.ip_forward=1
  5. 正常情况下,做到这一步就可以解决问题了,挂起虚拟机并尝试重新连接docker容器,若还未能解决问题,继续下一步骤。

将docker的网络接口设置为不被NetworkManager管理

  1. 新建一个配置文件

    1
    vi /etc/NetworkManager/conf.d/10-unmanage-docker-interfaces.conf
  2. 在文件中添加如下内容

    1
    2
    [keyfile]
    unmanaged-devices=interface-name:docker*;interface-name:veth*;interface-name:br-*;interface-name:vmnet*;interface-name:vboxnet*
  3. 保存退出后,重启NetworkManager

    1
    systemctl restart NetworkManager
  • 完成以上三步操作,再次挂起VMware,重试连接mysql和redis,就已经没问题了。

记录下这个问题,之后遇到相似问题方便查找!