使用nsenter命令进入容器namespace

我们知道docker容器使用namespace实现资源隔离。

我们知道,有很多image内部是没有bash的,所以我们docker exec是无法进入容器的,此时如果还想看一下容器内的情况,其实只需要想办法加入到容器对应的namespace就可以了。

我们使用nsenter工具即可实现,该工具启动后会将自己加入到指定的namespace中,然后exec执行我们指定的程序(通常就是bash)。

找到容器的进程ID

首先确定你要进入哪个容器,找到它的容器ID。

然后docker inspect找到这个容器的1号进程ID:

执行:docker inspect 容器ID

“State”: {
“Status”: “running”,
“Running”: true,
“Paused”: false,
“Restarting”: false,
“OOMKilled”: false,
“Dead”: false,
“Pid”: 9991,
“ExitCode”: 0,
“Error”: “”,
“StartedAt”: “2020-04-17T06:56:24.208483135Z”,
“FinishedAt”: “0001-01-01T00:00:00Z”
},

那么9991就是这个容器的进程ID,我们要加入的就是这个进程所在的namespace。

加入namespace

这就需要使用nsenter(全称namespace enter)工具:

nsenter -t 指定加入哪个进程的namespace,而namespace其实有很多种。

因为容器内没有bash程序,因此通常我们不会使用-a加入所有namespace(因为它包含了mount namespace),而是使用啥就传啥。

比如,我们加入network namespace,那么就这样:

nsenter -t 9991 -n  bash

实际是运行了宿主机的bash程序,并加入了9991进程的network namespace,此时可以统计一下容器内有哪些网络端口:

可见,现在只能看到容器内的端口了。

参考

nsenter命令简介

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~