nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令,它位于util-linux包中。
一般可以用于在容器外 debug 容器中运行的程序。
其命令行格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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。
|
查询容器的PID
1 2 3
| # docker inspect --format {{.State.Pid}} <container_name_or_ID>
# nsenter -m -u -i -n -p -t $PID hostname
|
或者可以直接进入容器network ns,例如
1
| # nsenter --net=/var/run/docker/netns/1-7fe9ew67wh ip a
|
其原理基本就是Linux Namespace。