内容: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)