明月青山 發表於 2026-1-13 09:14:38

查看docker容器内部Redis的TCP连接问题

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">前言</a></li><li><a href="#_label1">一、nsenter是什么?</a></li><li><a href="#_label2">二、Redis连接情况分析</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_0">1、Redis容器进程ID</a></li><li><a href="#_lab2_2_1">2、查询Redis tcp连接</a></li></ul><li><a href="#_label3">三、总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>前言</h2>
<p>在一次生产环境中偶然发现Redis的连接数特别大,于是很好奇想知道为什么或者具体哪些服务连接了当前Redis。想必大家都会觉得这个问题还是比较简单的,会想起<code>netstat</code>命令。但是因为当时的redis是docker容器部署的方式在宿主机执行<code>netstat -lptn | grep 6379 </code>怎么也查询不出来。于是开始各种搜索解决方案。实践存在两种方式:(本文推荐第二种方式)</p>
<ul><li>第一种docker exec进容器操作<code>netstat -lptn | grep 6379</code></li><li>第二种使用<code>nsenter -t &lt;pid&gt; -n netstat</code></li></ul>
<p>提示:以下是是第二种方式的操作过程</p>
<p class="maodian"><a name="_label1"></a></p><h2>一、nsenter是什么?</h2>
<p><code>nsenter</code>命令是一个可以在指定进程的命令空间(比如docker容器)下运行指定程序的命令。</p>
<p>简单理解就是在宿主机上可以直接执行容器内部的shell命令,也可以在容器内部直接操作宿主机外部的shell命令。</p>
<p>这里重点<code>nsenter</code>具体怎么用就不多说了,想了解的可以网查查下很简单。</p>
<p class="maodian"><a name="_label2"></a></p><h2>二、Redis连接情况分析</h2>
<p class="maodian"><a name="_lab2_2_0"></a></p><h3>1、Redis容器进程ID</h3>
<p>containerid容器ID</p>
<div class="jb51code"><pre class="brush:bash;">docker inspect -f '{{.State.Pid}}' &lt;containerid&gt;
</pre></div>
<ul><li>查询结果</li></ul>
<div class="jb51code"><pre class="brush:bash;">$ docker inspect -f '{{.State.Pid}}' d6fe0565449b
12599
</pre></div>
<p>12599为当前redis容器的进程ID</p>
<p class="maodian"><a name="_lab2_2_1"></a></p><h3>2、查询Redis tcp连接</h3>
<p>pid为:12599</p>
<div class="jb51code"><pre class="brush:bash;">nsenter -t &lt;pid&gt; -n netstat -pn
</pre></div>
<ul><li>查询结果</li></ul>
<div class="jb51code"><pre class="brush:bash;">nsenter -t 12599 -n netstat -pn
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026011309103199.jpg" /></p>
<p>从上图可知容器内部的6379Redis被容器内部51420客户端连接上了。</p>
<p class="maodian"><a name="_label3"></a></p><h2>三、总结</h2>
<div class="jb51code"><pre class="brush:bash;">nsenter -t 12599 -n netstat -pn</pre></div>
<p>简单分析下这个命令结构:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026011309103140.jpg" /></p>
<ul><li>红色部分:nsenter -t 12599 -n为nsenter的执行前缀。</li><li>黄色部分:netstat -pn为实际需要执行的命令。</li></ul>
<p>如果说你想在宿主机执行容器内部的ifconfig命令:nsenter -t 12599 -n ifconfig</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026011309103177.jpg" /></p>
<p>这个就是查看到了容器内部网卡的数据了。</p>
<p>以上为个人经验,希望能给大家一个参考,也希望大家多多支持琼殿技术社区。</p>
頁: [1]
查看完整版本: 查看docker容器内部Redis的TCP连接问题