使用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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库