使用nsenter排查没有相关命令的容器网络问题

     nsenter, 进入各种namespace,通过上帝视角进入指定目标进程从它的角度来观察。
   

   【问题】我常常遇到某个容器中没有PING和NSLOOKUP等等命令,但又需要从容器内部排查与网络边界的的网络状态,这时就可以使用nsenter命令。

   【举例】在Openresty容器中Ping目标域名,解决思路如下:


         1. 在容器内检查一下Ping命令 , 系统反馈我们没有这个命令或路径:

$ docker exec openresty ping www.baiinfo.com
OCI runtime exec failed: exec failed: unable to start container process: exec: "ping": executable file not found in $PATH: unknown


         2. 使用命令查找到容器的主进程号,即Pid:

$ docker inspect openresty | grep Pid           
            "Pid": 162225,
            "PidMode": "",
            "PidsLimit": null,

              返回结果,即Pid主进程为162225。


         3.利用nsenter命令可以使用Host上的各种命令行以容器的视角来运行:

$ nsenter -t 162225 -n ping www.baiinfo.com    
PING www.baiinfo.com (117.122.241.232) 56(84) bytes of data.
64 bytes from 117.122.241.232 (117.122.241.232): icmp_seq=1 ttl=51 time=4.03 ms
64 bytes from 117.122.241.232 (117.122.241.232): icmp_seq=2 ttl=51 time=3.85 ms
64 bytes from 117.122.241.232 (117.122.241.232): icmp_seq=3 ttl=51 time=3.90 ms
^C
--- www.baiinfo.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 6382ms
rtt min/avg/max/mdev = 3.850/3.924/4.026/0.074 ms


        【技巧】 直接进入Bash-Shell命令界面,可随意运行所有Host主机的命令,但是要注意目录还是Host的目录,只有网络环境是Pid进程视角下环境的

$ nsenter -t 162225 -n bash
# 通过bash进入162225进程的视角,还可以运行Host宿主机的所有命令
[root@baiinfo-centos8 ~]# nslookup -version
nslookup 9.11.26-RedHat-9.11.26-6.el8

 

posted @   天海沙  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示