前言
在一次生产环境中偶然发现Redis的连接数特别大,于是很好奇想知道为什么或者具体哪些服务连接了当前Redis。想必大家都会觉得这个问题还是比较简单的,会想起netstat
命令。但是因为当时的redis是docker容器部署的方式在宿主机执行netstat -lptn | grep 6379
怎么也查询不出来。于是开始各种搜索解决方案。实践存在两种方式:(本文推荐第二种方式)
- 第一种docker exec进容器操作
netstat -lptn | grep 6379
- 第二种使用
nsenter -t <pid> -n netstat
提示:以下是是第二种方式的操作过程
一、nsenter是什么?
nsenter
命令是一个可以在指定进程的命令空间(比如docker容器)下运行指定程序的命令。简单理解就是在宿主机上可以直接执行容器内部的shell命令,也可以在容器内部直接操作宿主机外部的shell命令。这里重点nsenter
具体怎么用就不多说了,想了解的可以网查查下很简单。
二、Redis连接情况分析
1、Redis容器进程ID
containerid容器ID
docker inspect -f '{{.State.Pid}}' <containerid>
- 查询结果
[hz_dev@node-12 ~]$ docker inspect -f '{{.State.Pid}}' d6fe0565449b
12599
12599为当前redis容器的进程ID
2、查询Redis tcp连接
pid为:12599
nsenter -t <pid> -n netstat -pn
- 查询结果
nsenter -t 12599 -n netstat -pn
从上图可知容器内部的6379Redis被容器内部51420客户端连接上了。
三、总结
nsenter -t 12599 -n netstat -pn
简单分析下这个命令结构:
红色部分:nsenter -t 12599 -n为nsenter的执行前缀。
黄色部分:netstat -pn为实际需要执行的命令。
如果说你想在宿主机执行容器内部的ifconfig命令:nsenter -t 12599 -n ifconfig
这个就是查看到了容器内部网卡的数据了。