当前位置: 首页 > article >正文

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

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


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


http://www.kler.cn/a/161808.html

相关文章:

  • RabbitMQ高效的消息队列中间件原理及实践
  • js 获取某日期到现在的时长 js 数字补齐2位
  • LabVIEW开发相机与显微镜自动对焦功能
  • 深入解析 OpenHarmony 构建系统-4-OHOSLoader类
  • 使用Python实现定期从API获取数据并存储到数据库的完整指南
  • 【C#设计模式(8)——过滤器模式(Adapter Pattern)】
  • 数据结构如何影响程序的错误检测和调试?
  • Django模板,Django中间件,ORM操作(pymysql + SQL语句),连接池,session和cookie, 缓存
  • N个数求和
  • 时间片轮转调度算法
  • 【CMake入门】第四节——静态库和共享库及安装、使用库的流程
  • [足式机器人]Part2 Dr. CAN学习笔记-数学基础Ch0-6复数Complex Number
  • mysql中information_schema.tables字段说明
  • Linux UUCP命令教程:如何在Linux系统中进行文件复制(附实例详解和注意事项)
  • 12.7作业
  • 【数据库】树形数据组织架构下的封锁并发控制,B树索引并发访问控制,树协议原理及案例分析
  • 【python爬虫】设计自己的爬虫 3. 文件数据保存封装
  • 『 C++ 』BinarySearchTree搜索二叉树
  • CA证书格式详解
  • SpringSecurity安全授权
  • 使用阿里巴巴同步工具DataX实现Mysql与ElasticSearch(ES)数据同步
  • Django回顾【五】
  • 折半查找(数据结构实训)
  • 用PHP和HTML做登录注册操作数据库Mysql
  • Appium获取toast方法封装
  • 套接字通信类的封装