nsenter的使用
介绍
nsenter
是用来进入容器内部的一个命令,它的优势之处在于可以自己选择加载容器的那些namespaces
nsenter的安装
可以选择源码安装,下载地址
也可以直接选择yum安装
这里直接选择yum安装
$ yum install util-linux -y
nsenter的使用
先使用--help
查看一下nsenter
的帮助信息
$ nsenter --help
用法:
nsenter [options] <program> [<argument>...]
Run a program with namespaces of other processes.
选项:
-t, --target <pid> 要获取名字空间的目标进程
-m, --mount[=<file>] enter mount namespace
-u, --uts[=<file>] enter UTS namespace (hostname etc)
-i, --ipc[=<file>] enter System V IPC namespace
-n, --net[=<file>] enter network namespace
-p, --pid[=<file>] enter pid namespace
-U, --user[=<file>] enter user namespace
-S, --setuid <uid> set uid in entered namespace
-G, --setgid <gid> set gid in entered namespace
--preserve-credentials do not touch uids or gids
-r, --root[=<dir>] set the root directory
-w, --wd[=<dir>] set the working directory
-F, --no-fork 执行 <程序> 前不 fork
-Z, --follow-context set SELinux context according to --target PID
-h, --help 显示此帮助并退出
-V, --version 输出版本信息并退出
更多信息请参阅 nsenter(1)。
#更多信息可以使用man nsenter查阅
可以看到选项很多,但是大致上都是进入某个namespace
--mount参数是进去到mount namespace中
--uts参数是进入到uts namespace中
--ipc参数是进入到System V IPC namaspace中
--net参数是进入到network namespace中
--pid参数是进入到pid namespace中
--user参数是进入到user namespace中
在使用nsenter
命令之前需要获取到docker容器的进程,然后再使用nsenter
工具进去到docker容器中,具体的使用方法如下:
$ docker inspect -f {{.State.Pid}} 容器名或者容器id #查询容器的PID
$ nsenter -t 容器PID -m -u -i -n -p #输入该命令进入容器
但是我一般不会这么使用,通常我是不加-m
参数的,至于为什么容我先买个小关子
下面给大家演示一下加-m
和不加-m
的区别
#先run一个容器
$ docker run -d nginx
d9a41fc5b0848260e903528d08525edba872698602fa45442bf752cbe0d46dad
#查看容器的pid
$ docker inspect -f {{.State.Pid}} d9a41fc5b0848260e903528d08525edba872698602fa45442bf752cbe0d46dad
2655
进入容器,加-m
可以看到容器里ping
命令也是没有的
我们不加-m
再次进入容器
可以看到多了很多命令,那这是为什么呢?
总结
nsenter
机制是使用哪个参数,就进入该进程的哪个namespce
,不使用则使用宿主机的namespace
。而-m
是进入mount namespace
的,这个名称空间是用来文件系统名称空间,所以当我们不加-m
的时候,使用的是宿主机的文件系统,可以使用宿主机内的命令对容器进行问题的排查,当然你也可以选择使用宿主机的其他namespace
来帮助你排查问题
参考文档: