环境

  • 操作系统:CentOS 7
  • 数据库:Msql 8.0
  • Docker版本:20.10

问题

生产环境、预发环境、所有验证码都裂开

分析及解决

发现请求验证码的接口状态一直在pending,想到验证码是要往数据库中写入存储,使用navicat连接数据库发现,正常连接,XShell连接服务器,由于数据库使用docker运行 查看在运行容器及大小

docker ps -s

在正常运行,心想重启一下dokcer中数据库容器,于是重启容器

docker restart 容器名称

重启之后发现navicat都连接不上了,本来还能连接,使用telnet命令ping一下服务器数据库端口,发现ping通,回到服务器,尝试重启docker

systemctl restart docker

docker重启之后,由于创建容器时设置了docker重启会自动启动,查看发现数据库容器正常启动,再次ping端口,发现仍然ping不通,有点着急了,自己观察发现在运行容器的PORTS列为空!也就是说docker启动容器之后并没有映射端口,于是去网上搜索,查看docker 容器的网络配置

docker inspect  容器名或容器idgrep IPAddress

输出结果中:IPAddress 为空!果然docker网络配置出现了问题 查看docker的虚拟网络

docker network ls

输出结果正常

重置docker网络

停止docker服务

systemctl stop docker

关闭docker相关网卡设备

ip link set docker0 down

删除 docker0桥接设备

brctl delbr docker0

如果提示:brctl command not fount 安装brctl

yum install bridge-utils -y

最后再次启动docker服务,然后启动你的容器

systemctl start docker

访问发现,数据库正常连接,验证码正常出来,但是!没过两分钟,前端就告知验证码又没了,想了想不应啊,查看服务器磁盘内存发现磁盘内存使用率100%!应该是磁盘内存不够写不进去吧, 查看服务器磁盘内存

df -h

查看当前路径下大文件

du -sh *

查看指定路径下文件大小

du -h /root

找到几个无用的大文件,删除之后发现验证码恢复正常,后续改进可以把验证码缓存到Redis中。