Docker nsenter 命令使用以及lsns命令(需要安装utrace包)

news/2024/9/23 10:38:27

查看容器对应宿主机上面的pid,容器技术的实质是进程,并没有完整的操作系统,就相当于在主机上面fork了一个子进程,通过docker daemon去fork一个子进程,这个子进程是可以在主机上面看到其pid的。 

$ docker inspect -f {{.State.Pid}} 容器名或者容器id 
 
如下:
$ docker inspect -f {{.State.Pid}}  7b7af641a02d
20560
$ docker inspect -f {{.State.Pid}}  consul_client
20560
输入该命令便进入到容器中

$ nsenter --target 上面查到的进程id --mount --uts --ipc --net --pid 

 

解释nsenter指令中进程id之后的参数的含义: 
* –mount参数是进去到mount namespace中  (文件系统)
* –uts参数是进入到uts namespace中  (主机名与域名)
* –ipc参数是进入到System V IPC namaspace中  (信号量、消息队列和共享内容)
* –net参数是进入到network namespace中   (网络设备、网络栈、端口)
* –pid参数是进入到pid namespace中    (进程编号)
* –user参数是进入到user namespace中 (用户和用户组)

PID=$(docker inspect --format "{{ .State.Pid }}" <container>)
$ nsenter --target $PID --mount --uts --ipc --net --pid#查看容器对应宿主机上面的pid,容器技术的实质是进程,并没有完整的操作系统,就相当于在主机上面fork了一个子进程,通过docker daemon去fork一个子进程,这个子进程是可以在主机上面看到其pid的。
[root@docker ~]# docker inspect 37d084d8e21b | grep -i  pid"Pid": 18496,"PidMode": "","PidsLimit": null,
[root@docker ~]# ps -ef | grep 18496
root     18496 18476  0 15:34 pts/0    00:00:00 sh

-p 是pid namesapce    -n是network namespace,在主机上面通过nsenter去敲ip a,ps命令和在容器内部敲的命令返回结果是一样的。 

[root@docker ~]# nsenter -t 18496  -n ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
44: eth0@if45: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever[root@docker ~]# nsenter -t 18496  -p   psPID TTY          TIME CMD
18648 pts/1    00:00:00 sh
20436 pts/1    00:00:00 bash
21368 pts/1    00:00:00 nsenter
21369 pts/1    00:00:00 bash
21529 pts/1    00:00:00 nsenter
21530 pts/1    00:00:00 ps

容器看到的是可以通过在主机上面nsenter看到的。这是日常去调试容器里面进程应用的一个法宝!

有些时候容器里面要做一些debug,缺一些工具,可以登入到主机上面进入到容器的namespace里面去看其网络配置,看其端口监听。这样就能够知道网络连接的状态是怎么样的。 

由于使用DOCKER的时候,ESTABLISHED连接不会出现在netstat中,在运行中的docker容器中列出打开的套接字的方法 ,查找docker的进程号:

$ sudo nsenter -t <Pid> -n netstat | grep ESTABLISHED 示例:
$ nsenter -t 1829 -n netstat |grep ESTABLISHED 
tcp        0      0 localhost:60353         localhost:epmd          ESTABLISHED
tcp        0      0 localhost:epmd          localhost:60353         ESTABLISHED
tcp        0      0 localhost.localdo:15672 192.168.56.1:59679      ESTABLISHED
tcp6       0      0 172.17.0.2:amqp         192.168.56.1:59898      ESTABLISHED
tcp6      21      0 172.17.0.2:amqp         192.168.56.1:59571      ESTABLISHED[root@jenkins dockerfile]# nsenter -t 14632 -n ping www.baidu.com
^C[root@jenkins dockerfile]# nsenter -t 14632 -n nslookup www.baidu.com
^C[root@jenkins dockerfile]# nsenter -t 14632 -n curl 127.0.0.1:8080
{"timestamp":"2024-05-09T06:29:54.346+00:00","status":404,"error":"Not Found","message":"","path":"/"}





查看docker pid的ns

要查看Docker容器的PID的命名空间,你可以使用docker inspect命令,结合--format参数来提取特定信息。以下是一个示例命令,它将显示指定容器的PID命名空间信息:

 
 
docker inspect --format '{{ .State.Pid }}' <container_name_or_id>

这个命令会返回容器的主进程的PID。然后,你可以使用lsns命令(需要安装utrace包)来查看这个PID的命名空间:

 
 
lsns -p <pid>

如果你没有lsns命令,你可以通过安装utrace包来获取它。对于基于Debian的系统,可以使用以下命令安装:

 
 
sudo apt-get install utrace

对于基于Red Hat的系统,可以使用以下命令安装:

 
 
sudo yum install utrace
 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/63676.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Js DOM(2)

(1).在DOM将各个标签分成很多类,实现了编程对象进行管理.通过id,name,class,等等的方式可以快速获取到对象. (2).获取对象之后可以对对象的各个属性进行修改,从而实现页面的调整,下面是一个样例开关灯,和全选反选 (3)这需要用到事件的监听功能实现监听有两种方式: a.给对象的属…

TSCTF-J 2024秋部分wp

TSCTF-J部分wpRCE ME !!! 一道签到,无参数RCE. <?php highlight_file(__FILE__); if(isset($_GET[cmd])){$cmd= $_GET[cmd];if (!preg_match(/data:\/\/|filter:\/\/|php:\/\/|phar:\/\/|zip:\/\//i, $cmd)) {if(; === preg_replace(/[a-z,_]+\((?R)?\)/, NULL, $cmd)) {…

数据库连接失败,请检查数据库服务

当你遇到数据库连接失败的问题时,可以按照以下步骤来检查和解决问题:确认数据库服务状态:检查数据库服务是否正在运行。你可以通过服务管理工具(如Windows的服务管理器或Linux的systemctl命令)来查看数据库服务的状态。 对于特定的数据库系统,也可以使用数据库自带的命令…

网站打不开数据库错误等常见问题解决方法

当遇到网站打不开且出现数据库错误等问题时,可以采取以下步骤进行排查和解决:检查默认页面:如果网站显示“主机开设成功!”或者“恭喜,lanmp安装成功!”这样的信息,这可能是服务器默认放置的页面。检查wwwroot目录下是否有自己的程序文件,如果没有,上传正确的文件,并…

网站数据库错误的原因通常包括配置错误、编码错误、硬件故障、网络问题、数据损坏、权限设置不当、软件更新不兼容、SQL注入攻击等

网站数据库错误可能由多种因素引起,主要包括以下几点:配置错误:数据库或应用程序的配置不当可能导致连接失败或其他运行时错误。 编码错误:程序中的逻辑错误或语法错误也可能导致数据库操作失败。 硬件故障:服务器硬件出现问题,如硬盘损坏、内存故障等,会影响数据库的正…

网站数据库为什么错误呢

当网站数据库出现错误时,可能有多种原因。以下是一些常见的原因及解决方法: 常见原因及解决方法内存限制问题症状:内存耗尽,如“Allowed memory size of 134217728 bytes exhausted”。 解决方法:修改 php.ini 文件中的 memory_limit 配置项。 在 PHP 脚本中使用 ini_set …

为什么数据库查询总是报错

数据库查询总是报错可能有以下几个常见原因:SQL语句错误:语法错误:SQL语句编写不正确,比如缺少分号、括号不匹配等。 表或列不存在:查询中引用了不存在的表名或字段名。 查询条件错误:WHERE子句中的条件表达式错误,比如比较运算符使用不当、值类型不匹配等。数据库连接问…