虚拟机挂起后无法连接Docker容器的问题
问题描述
-
本人最近在做一个的项目,使用VMware新装了Centos7虚拟机,在虚拟机里面用docker部署了MySQL、Redis、MQ等等容器以及各种微服务。
-
第一天成功把这些东西部署,然后全部测试完也没什么问题,想着微服务开的比较多,然后工作结束后直接把虚拟机挂起(省得第二天要把其他微服务全部再Run一遍),结果第二天用Navicat连接Mysql死活连不上,想着不会Redis也连不上叭(没错也连不上了),但是其他微服务能正常使用,于是便开始排查问题!
问题排查
-
查了MySQL和Redis的日志,发现日志正常没什么问题。
-
重启MySQL容器,重试连接,同样连不上。
-
重启docker后,就能连上了。
-
重启虚拟机也能连上。
!!!(但我重启docker后,我其他的微服务就要再Run一遍,非常麻烦!)
解决办法
- 开始在网上搜寻查阅资料,解决办法如下:
关闭防火墙
- 由于我在做练手项目(学习模式),所以直接关闭防火墙了,这样就不用每次部署容器时一个个去开放端口,这一步根据自己需要来
1 | # 关闭防火墙 |
修改虚拟机ipv4转发状态
-
从虚拟机本机配置文件入手
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 -
在后面添加如下内容
1
net.ipv4.ip_forward = 1
-
保存退出,接着重启网络服务
1
systemctl restart network
-
重启以后,输入以下命令,查看IPv4转发状态
1
sysctl net.ipv4.ip_forward
显示如下,则转发成功:
1
net.ipv4.ip_forward=1
-
正常情况下,做到这一步就可以解决问题了,挂起虚拟机并尝试重新连接docker容器,若还未能解决问题,继续下一步骤。
将docker的网络接口设置为不被NetworkManager管理
- 这一步参考了StackOverflow上的一篇帖子:https://stackoverflow.com/questions/57874055/cant-connect-to-docker-after-resuming-vm
-
新建一个配置文件
1
vi /etc/NetworkManager/conf.d/10-unmanage-docker-interfaces.conf
-
在文件中添加如下内容
1
2[keyfile]
unmanaged-devices=interface-name:docker*;interface-name:veth*;interface-name:br-*;interface-name:vmnet*;interface-name:vboxnet* -
保存退出后,重启NetworkManager
1
systemctl restart NetworkManager
- 完成以上三步操作,再次挂起VMware,重试连接mysql和redis,就已经没问题了。
记录下这个问题,之后遇到相似问题方便查找!
评论