什么是nsenter?
nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令。它位于util-linux包中,
- util-linux 是一个开放源码的软件包,是一个对任何 Linux 系统的基本工具套件。含有一些标准Unix 工具,如 login。util-linux 软件包包含许多工具。其中比较重要的是加载、卸载、格式化、分区和管理硬盘驱动器,打开 tty 端口和得到内核消息。
nsenter用途 ?
进入容器的网络命令空间。相当多的容器为了轻量级,是不包含较为基础的命令的,比如说ip address,ping,telnet,ss,tcpdump等等命令,这就给调试容器网络带来相当大的困扰:只能通过docker inspect ContainerID命令获取到容器IP,以及无法测试和其他网络的连通性。这时就可以使用nsenter命令仅进入该容器的网络命名空间,使用宿主机的命令调试容器网络。
nsenter --help
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]:设置工作目录
nsenter安装
# 安装命令
yum install util-linux -y
# 命令查询容器的PID
docker inspect -f {{.State.Pid}} container_id
或者
docker inspect container_id | grep -w "Pid"
# 进入容器后台
nsenter --target pid --mount --uts --ipc --net --pid
- target 参数是容器PID
- mount参数是进去到mount namespace中 (文件系统),
- uts参数是进入到uts namespace中 (主机名与域名)
- ipc参数是进入到System V IPC namaspace中 (信号量、消息队列和共享内容)
- net参数是进入到network namespace中 (网络设备、网络栈、端口)
- pid参数是进入到pid namespace中 (进程编号)
- user参数是进入到user namespace中 (用户和用户组)