摘要:本文重点关注进入目标进程的“网络ns”视角,即站在「容器中的进程视角」看待容器里面的网络世界,并在那个视角中执行命令。

本文分享自华为云社区《《跟唐老师学习云网络》 - nsenter魔法棒》,作者:tsjsdbd 。

有时候Docker容器中缺少需要的软件。比如 curl,wget,ifconfig,ip,tcpdump 等基础软件包,什么都干不了,很是让人抓狂。

[root@tsjsdbd home]# docker exec -it 8402 /bin/bash
root@8402d89fe04a:/# ifconfig
bash: ifconfig: command not found
root@8402d89fe04a:/# ip
bash: ip: command not found
root@8402d89fe04a:/# tcpdump
bash: tcpdump: command not found
root@8402d89fe04a:/# curl
bash: curl: command not found
root@8402d89fe04a:/# nslookup
bash: nslookup: command not found
root@8402d89fe04a:/# wget
wget: missing URL
Usage: wget [OPTION]... [URL]...

面对这种容器镜像,定位问题就会很困难,因为你进入容器后,想执行命令还得重新安装各种基础软件,非常麻烦。

这个时候,我们要拿起“nsenter”这个根魔法棒,在主机上上面挥舞起来。

ns-enter,顾名思义,就是「进入各种namespace」,即nsenter命令可以进入到指定目标进程的ns视角。

所以nsenter可以站在指定进程的“视角”看世界,本文重点关注进入目标进程的“网络ns”视角,即站在「容器中的进程视角」看待容器里面的网络世界,并在那个视角中执行命令。

首先,我们要找到,要进入的「目标ns」的目标进程ID。即:容器里面的根进程

[root@tsjsdbd ubuntu]# docker inspect 8402d89fe04a
[
{
"Id": "8402d89fe04a7e161faf8a01a86c47f8402d4c8d7207b6897d8e6d661d670df4",
"State": {
"Status": "running",
"Pid": 18751,
"ExitCode": 0,
"Error": "",
"StartedAt": "2023-05-10T03:12:19.221460059Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},

容器里的“老大”是进程18751号。

所以我们直接在Host主机上,跟踪这个进程,并进入它的“视角”,我们就可以看到容器里面的世界了。而且由于我们这个时候,作为控制者,还是处在Host主机上的,因此可以执行Host主机上的各种命令行。

如下:

[root@tsjsdbd ubuntu]# nsenter -t 18751 -n ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 1688355 bytes 194318903 (185.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 138826 bytes 146246172 (139.4 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 0 (Local Loopback)
RX packets 13939 bytes 13140220 (12.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13939 bytes 13140220 (12.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

其他命令,照搬都可以执行。

比如,容器里面没有nslookup命令,但是只有Host主机上有,咱就可在容器中执行它:

[root@tsjsdbd ubuntu]# nsenter -t 18751 -n nslookup www.baidu.com
Server: 10.129.2.34
Address: 10.129.2.34#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 14.119.104.254
Name: www.a.shifen.com
Address: 14.119.104.189

所以原本在容器里面,无法执行的调试行为,就这么可以完成调试。

更直接的,如果不带最后的执行命令参数,可以直接进到“目标视角”里面去,进行交互式执行cli:

[root@tsjsdbd ubuntu]# nsenter -t 18751 -n
#这里就进入交互模式,相当于没有填写cli时,默认执行[当前bash]
[root@tsjsdbd ubuntu]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
4261: eth0@if4262: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
[root@tsjsdbd ubuntu]# curl
curl: try 'curl --help' or 'curl --manual' for more information
[root@tsjsdbd ubuntu]# tcpdump
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C
0 packets captured
0 packets received by filter
0 packets dropped by kernel
[root@tsjsdbd ubuntu]# exit
#执行exit,可退出“目标视角”

可以看到,所有的网络相关的cli命令行都可以执行。

并且,这些命令,都是站在容器内的“视角”执行的,所以效果与在容器中是一样的(虽然它们本身在Host中发起的)。

类似电影《源代码》《骇客帝国》中那样,用外面世界中的“人”,去控制“里面世界”中的行为。希望可以理解这种上帝视角的逻辑:-)

总结用法:

(1) 找到目标进程PID

docker inspect xxx

(2)直接执行特定的cli命令

nsenter -n -t 822647 ifconfig

(3)进入容器视角,进行交互式cli

nsenter -n -t 822647
exit

点击关注,第一时间了解华为云新鲜技术~

实例讲解看nsenter带你“上帝视角”看网络的更多相关文章

  1. 【JVM】上帝视角看JVM内存模型,分而治之论各模块详情

    1. 上帝视角 [树看JVM] [图看JVM] 2. 分而治之 2.1 堆区 构成:堆区由新生代和老年代组成,新生代中包含伊甸区(Eden).幸存者区(survivor from .survivor ...

  2. 《奥威Power-BI案例应用:带着漫画看报告》腾讯课程开课啦

    元旦小假期过去了,不管是每天只给自己两次下床机会的你,还是唱K看电影逛街样样都嗨的你,是时候重振旗鼓,重新上路了!毕竟为了不给国家的平均工资水平拖后腿,还是要努力工作的.话说2016年已经过去了,什么 ...

  3. 带着问题看redux源码

    前言 作为前端状态管理器,这个比较跨时代的工具库redux有很多实现和思想值得我们思考.在深入源码之前,我们可以相关注下一些常见问题,这样带着问题去看实现,也能更加清晰的了解. 常见问题 大概看了下主 ...

  4. float实例讲解

    float实例讲解 float是个强大的属性,在实际前端开发过程中,人们经常拿它来进行布局,但有时,使用的不好,也麻烦多多啊. 比如,现在我们要实现一个两列布局,左边的列,宽度固定:右边的列,宽度自动 ...

  5. 【MySQL】分页查询实例讲解

    MySQL分页查询实例讲解 1. 前言 本文描述了团队在工作中遇到的一个MySQL分页查询问题,顺带讲解相关知识点,为后来者鉴.本文的重点不是"怎样"优化表结构和SQL语句,而是探 ...

  6. 这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解)(转)

    前言 在Andrroid开发中,网络请求十分常用 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库 今天,我将献上一份非常详细Retrofit v2.0的使用教程,希望你们会 ...

  7. 这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解)

    前言 在Andrroid开发中,网络请求十分常用 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库 今天,我将献上一份非常详细Retrofit v2.0的使用教程,希望你们会 ...

  8. [转帖]linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习)

    linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习) https://www.cnblogs.com/caozy/p/9261224.html 总结的挺好的 ...

  9. Python装饰器实例讲解(二)

    Python装饰器实例讲解(二) Python装饰器实例讲解(一) 你最好去看下第一篇,虽然也不是紧密的链接在一起 参考B站码农高天的视频,大家喜欢看视频可以跳转忽略本文:https://www.bi ...

  10. Python装饰器实例讲解(三)

    Python装饰器实例讲解(三) 本文多参考<流畅的python>,在此基础上增加了一些实例便于理解 姊妹篇 Python装饰器实例讲解(一),让你简单的会用 Python装饰器实例讲解( ...

随机推荐

  1. Semantic Kernel 入门系列:🥑突破提示词的限制

    无尽的上下文 LLM的语言理解和掌握能力在知识内容的解读和总结方面提供了强大的能力. 但是由于训练数据本身来自于公共领域,也就注定了无法在一些小众或者私有的领域能够足够的好的应答. 因此如何给LLM ...

  2. 【SSM项目】尚筹网(三)基于Servlet3.0项目搭建:异常映射和拦截器机制

    1 异常映射 1.1 目标 使用异常映射对项目的异常和错误提示进行统一管理. 1.2 思路 对于普通的页面请求,异常映射机制捕获到handler方法抛出的异常后会响应为一个错误页面,对于处理ajax请 ...

  3. ubutn在线服务器python Package安装到离线服务器

    1.在线服务器导出requirement.txt pip freeze > requirement.txt 该文件生成完毕后,需要做些修改,去掉不需要的库,否则下载的时候会出错. 2.下载whl ...

  4. [Pytorch框架] 1.7 数据并行

    数据并行(选读) Authors: Sung Kim and Jenny Kang 在这个教程里,我们将学习如何使用 DataParallel 来使用多GPU. PyTorch非常容易就可以使用多GP ...

  5. Win Airtest + 夜神模拟器 实现APP自动化

    前言: Airtest 是一个跨平台的UI自动化测试框架,适用于游戏和App.目前支持Windows.Android平台和 iOS 平台. 一.下载Airtest 下载地址:https://airte ...

  6. 【C#】图片上传并根据长宽大小进行正方形、长方形及等比缩放。

    #region 正方型裁剪并缩放 /// <summary> /// 正方型裁剪 /// 以图片中心为轴心,截取正方型,然后等比缩放 /// 用于头像处理 /// </summary ...

  7. pycharm-professional-2023 下载安装

    PyCharm Professional 是一款针对 Python 编程的集成开发环境 (IDE),由 JetBrains 公司开发和维护.它是 PyCharm 社区版的升级版,提供了更多的功能和工具 ...

  8. 7-2 Broken Pad (20 分)

    1.题目描述: The party began, the greasy uncle was playing cards, the fat otaku was eating, and the littl ...

  9. 2014年蓝桥杯C/C++大学B组省赛真题(蚂蚁感冒)

    题目描述: 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒.当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行.这些蚂蚁中,有1只蚂蚁 ...

  10. Vue+Element中Table懒加载,新增、删除操作后手动更新

    Vue+Element中Table懒加载,新增.删除操作后手动更新 今天开发一个自动分类管理系统中行业类型管理,使用table tree 进行节点懒加载,遇到的问题是:使用load 进行懒加载后在ta ...