nsenter调试容器命令工具
原创大约 3 分钟
本文介绍,在Linux环境下nsenter调试容器命令工具的使用
服务器说明
以下命令在 Ubuntu 22.04.3 LTS 系统上测试
ubuntu@:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.3 LTS
Release: 22.04
Codename: jamm
背景介绍
在容器开发过程中,发现容器中一些网络命令不可用,由于生产环境不允许联网等限制,给容器调试带来困难,因此想在宿主机调试容器,执行一些网络命令,比如 ip addr,route -n 等来发现一些问题。
nsenter介绍
nsenter 是一个命令行工具,用于进入指定的 Linux 命名空间。Linux 命名空间是 Linux 内核提供的一种隔离机制,允许系统中的不同进程具有独立的视图,如独立的网络栈、进程空间、挂载点等。通过进入特定的命名空间,可以在其中执行操作,而不会影响系统中的其他部分。
nsenter 命令允许用户进入已经存在的命名空间,以便查看或修改命名空间中的状态,或在其中执行命令。
The nsenter command executes program in the namespace(s) that are specified in the command-line options (described below). If program is not given, then "${SHELL}" is run (default: /bin/sh). 特别注意,当命名空间内命令不可用时,shell将执行 /bin/sh 的默认命令
实战记录
安装基础软件
在实践过程中,发现route命令在主机中不可以执行,因此需要安装route命令工具包
apt update
apt install net-tools -y
在容器内执行命令工具查看route信息
# a8119e0f4d7c 为容器id , 也可以用容器名称代替
#step 1 用容器测试
docker exec -it a8119e0f4d7c route -n
# print route信息
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.88.1 0.0.0.0 UG 0 0 0 eth0
192.168.88.0 0.0.0.0
# step 2 获取容器pid
docker inspect --format {{.State.Pid}} a8119e0f4d7c
71553
# step 3 进入容器的网络命名空间
nsenter -t 71553 -n
#或
nsenter -n -t71553
root@ubuntu:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.88.1 0.0.0.0 UG 0 0 0 eth0
192.168.88.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
在容器内执行命令工具查看其他信息
#本文档是真实实践的记录,并不全是罗列命令说明性文档,重在实践,有实际的项目需要才会促进文档完善,期待下一次实际应用
参考信息
man nsenter
NSENTER(1) User Commands NSENTER(1)
NAME
nsenter - run program in different namespaces
SYNOPSIS
nsenter [options] [program [arguments]]
DESCRIPTION
The nsenter command executes program in the namespace(s) that are specified in the command-line options (described below). If program is not given, then "${SHELL}" is run (default: /bin/sh).
Enterable namespaces are:
.....
查看帮助
nsenter --help
Usage:
nsenter [options] [<program> [<argument>...]]
Run a program with namespaces of other processes.
Options:
-a, --all enter all namespaces
-t, --target <pid> target process to get namespaces from
-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
-C, --cgroup[=<file>] enter cgroup namespace
-U, --user[=<file>] enter user namespace
-T, --time[=<file>] enter time 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 do not fork before exec'ing <program>
-Z, --follow-context set SELinux context according to --target PID
-h, --help display this help
-V, --version display version
For more details see nsenter(1).