学会使用这个魔法棒,再也不用在容器里安装乱七八糟的命令工具了!

在构建镜像的时候,我总是倾向于极简构建,一切没有必要的软件包都不安装,以此来缩小镜像的容量。但是这种做法为后续运维带来了一些困难,如在日常查询、排查问题的时候发现很多命令用不了,不得不在容器中安装额外的命令软件包,本文使用nsenter工具,实现既不在容器中安装软件包,又能使用命令的功能。

01 先来看看效果吧

  • 创建一个容器,使用大小仅5.59MB的alpine镜像

docker run -it  --rm -d --name test-nsenter alpine sleep 3600
  • 进入容器,执行一些命令

docker exec -it test-nsenter /bin/sh

图片

  • 使用nsenter工具

# 1、找到容器的pid
[root@txy201-51 ~]# docker inspect test-nsenter -f "{{.State.Pid}}"
7327
# 2、使用nsenter进入这个命名空间
[root@txy201-51 ~]# nsenter -t 7327 -n

图片

  • 查看nginx服务器的日志,可以看到ip地址是test-nsenter的地址

图片

02 来聊聊nsenter是怎么工作的
Linux系统里,nsenter是一个命令行工具,用于进入到另一个 namespace。譬如,nsenter -n -t 1 bash就是进入到pid1的进程所在的网络namespace里。

nsenter不仅可以进入网络命名空间,还支持文件命名空间、PID命名空间等。具体可以使用nsenter -h查看

[root@txy201-51 ~]# nsenter -h

用法:
 nsenter [options] [<program> [<argument>...]]

Run a program with namespaces of other processes.

选项:
 -a, --all              enter all namespaces
 -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
 -C, --cgroup[=<file>]  enter cgroup 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

 -h, --help             display this help
 -V, --version          display version

更多信息请参阅 nsenter(1)。
[root@txy201-51 ~]#

需要注意的是,如果需要查看容器内的日志,应该使用-m进入文件系统的命名空间而不是网络空间,不然可能发生找不到文件的尴尬事情。

图片

如果你的设备上没有nsenter命令,赶紧使用以下命令进行安装吧:

yum install util-linux


我是运维少年,如果文章对您有帮助,欢迎关注我的同名公众号~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值