首页 > 其他分享 >Docker nsenter 命令使用以及lsns命令(需要安装utrace包)

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

时间:2024-09-23 10:35:16浏览次数:7  
标签:容器 utrace -- pid 00 命令 nsenter docker

查看容器对应宿主机上面的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 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_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 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

[root@docker ~]# nsenter -t 18496  -p   ps
  PID 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    

标签:容器,utrace,--,pid,00,命令,nsenter,docker
From: https://www.cnblogs.com/cheyunhua/p/18426580

相关文章

  • Linux网络命令
    1.ping测试网络连通性-c指定ping次数      ping -c4   4次停-i   指定间隔时间-s   指定数据包的大小2.ifconfig查询本机网络信息  作用与  ipa|addr相同ifconfig命令使用方法命令:ifconfig              ......
  • linux命令行读写uboot环境变量
    1. fw_printenv& fw_setenvbuild,see: u-boot-2020.04/tools/env/READMEcd u-boot-2020.04makeCROSS_COMPILE=arm-linux-envtoolsYoushouldthencreateasymlinkfromfw_setenvtofw_printenv.2.test2.1read2.2write会自动保存到emmc/flash中3......
  • Linux 中sed命令实现大小写的转换
     001、大写转换为小写[root@PC1test]#lsa.txt[root@PC1test]#cata.txt##测试数据abcDEFHIKLmnOpqM[root@PC1test]#sed's/[A-Z]/\L&/g'a.txt##所有的大写转换为小写abcdef......
  • 命令模式:如何在一次请求中封装多个参数?
    命令模式使用频率不算太高,这里大家可能会问:命令和查询有什么区别?简单来说,查询是获取一个不可变的结果,而命令是改变状态,不一定获取结果。如果你熟悉函数式编程的话,会发现命令模式完全没有使用的必要,甚至在业务开发的场景中也很少使用到。不过对于想要找到正确抽象的设计者来说,命令......
  • Docker进入容器运行命令实例讲解
    Docker进入容器运行命令实例讲解在Docker中,要进入正在运行的容器并执行命令,主要使用dockerexec命令。这个命令允许你在运行中的容器内执行一个新的命令,这对于调试、运行附加的进程或在容器内部进行管理操作非常有用。基本语法dockerexec[OPTIONS]CONTAINERCOMMAND[ARG......
  • 思科交换机命令大全,网络工程师必收藏!
    基本的命令行界面(CLI)导航思科交换机的CLI界面分为以下几种模式,每种模式提供不同的命令集:用户模式(UserEXECMode):此模式提供有限的查看命令,不能进行配置操作。用户模式的提示符通常以>结尾。例如:Switch>特权模式(PrivilegedEXECMode):此模式提供更多的监控和配置命......
  • note.js与vue.js常用基本命令
    Note.js基本命令1、安装Node.js包npminstall<package-name>2、全局安装包npminstall-g<package-name>3、查看已安装的包npmlist4、初始化项目并创建package.json文件npminit5、更新包到最新版本npmupdate<package-name>6、卸载包npmuninstall<pack......
  • 如何通过命令查询代理服务器地址?
    一、什么是代理服务器地址及其重要性在讨论如何通过命令行查找代理服务器地址之前,我们先明确一个基本概念:代理服务器地址。简单来说,就是指代理服务器在网络中的唯一标识,通常包括IP地址和端口号,用于中转和转发网络请求。 代理服务器地址在绕过地域限制、保护隐私、加速网络访......
  • Acronis True Image 完整版的一些常用命令行参数:
    AcronisTrueImage完整版的一些常用命令行参数:常用命令参数备份:bashCopyCodeAcronisTrueImage.exe/backup/source:"源路径"/destination:"目标路径"/name:"备份名称"恢复:bashCopyCodeAcronisTrueImage.exe/restore/source:"备份文件路径"/destinatio......
  • docker阶段03 docker容器内hosts文件, DNS, 查docker空间占用, 部署自动化运维平台spu
    容器内部的hosts文件容器会自动将容器的ID加入自已的/etc/hosts文件中,并解析成容器的IP范例:修改容器的hosts文件[root@ubuntu1804~]#dockerrun-it--rm--add-hostwww.wangxiaochun.com:6.6.6.6--add-hostwww.wang.org:8.8.8.8busybox/#cat/etc/hosts127.0.0......