【博客373】容器调试利刃:nsenter

内容:nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令

一般调试容器的方法:

1)使用ssh登陆容器。这种方法需要在容器中启动sshd,存在开销和攻击面增大的问题同时也违反
了Docker所倡导的一个容器一个进程的原则。 

2)使用自带命令docker attach登陆容器。命令格式:docker attach container_id。
不过docker attach存在的问题是:当多个窗口同时attach到同一个容器时,所有的窗口都会同步
的显示,假如其中的一个窗口发生阻塞时,其它的窗口也会阻塞,docker attach命令可以说是最
不方便的进入后台docker容器的方法。

3)使用自带命令docker exec登陆容器。命令格式:
docker exec -ti container_id /bin/bash

4)当容器里面没有用于调试的命令,比如:tcpdump时,上述方法不适用,可以采取:nsenter

nsenter用途:

一个最典型的用途就是进入容器的网络命令空间。容器为了轻量级,很多是不包含较为基础的命令的,
比如说ip address,ping,telnet,ss,tcpdump等,这就给调试容器网络带来相当大的困扰,
只能通过docker inspect ContainerID命令获取到容器IP,以及无法测试和其他网络的连通性。

这时就可以使用nsenter命令仅进入该容器的网络命名空间,使用宿主机的命令调试容器网络。
此外,nsenter也可以进入mnt, uts, ipc, pid, user命令空间,以及指定根目录和工作目录。

用法:

nsenter [options] [program [arguments]]

options:
-t, --target pid:指定被进入命名空间的目标进程的pid
-m, --mount[=file]:进入mount命令空间。如果指定了file,则进入file的命令空间
-u, --uts[=file]:进入uts命令空间。如果指定了file,则进入file的命令空间
-i, --ipc[=file]:进入ipc命令空间。如果指定了file,则进入file的命令空间
-n, --net[=file]:进入net命令空间。如果指定了file,则进入file的命令空间
-p, --pid[=file]:进入pid命令空间。如果指定了file,则进入file的命令空间
-U, --user[=file]:进入user命令空间。如果指定了file,则进入file的命令空间
-G, --setgid gid:设置运行程序的gid
-S, --setuid uid:设置运行程序的uid
-r, --root[=directory]:设置根目录
-w, --wd[=directory]:设置工作目录

如果没有给出program,则默认执行$SHELL。

用法:

1、获取容器第一个进程id:
用docker inspect -f {{.State.Pid}} 容器id

2、进入容器命名空间:
nsenter --target pid --type(net、ipc等namesapce)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值