容器运行时管理
概述
参考:
容器运行时通常都是由实现容器的工具自己管理的,如果要说真正通用的管理,可能只有 runc 了,而 runc 本质就是通过类似 unshare、nsenter 等 Util-linux Utilities 包中的工具完成容器运行时的功能。
unshare - 创建 namesapce
参考:
- Manual(手册),unshare(1)
- Manual(手册),unshare(2) 这是 System call
在新的 namespace 中运行程序。unshare 命令创建新的 namespace(由下面描述的命令行选项指定),然后执行指定的程序。如果未给出程序,则运行"${SHELL}"(默认值:/bin/sh)
nsenter - 使用其他进程的名称空间运行程序
参考:
就像这个工具的名字一样,nsenter(namespace enter)。进入一个或多个其他进程的名称空间,然后运行指定的程序。如果没有给出指定的程序(语法中的 PROGRAM),则运行默认的 ${SHELL}。
Syntax(语法)
nsenter [OPTIONS] [PROGRAM[ARGUMENTS]]
OPTIONS:
- -a, –all # 进入所有名称空间
- -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]:设置工作目录
EXAMPLE
- 从普通用户进入到 root 用户空间
- sudo nsenter -t 1 -n
- 获取到容器的 PID
- docker inspect –format “{{.State.Pid}}” ContainerID
- 进入到 8514 进程的网络名称空间中
- nsenter -n -t 8514
- 进入 15928 进程的多个名称空间中
- nsenter -p -n -u -i -m -t 15928
- 进入 node-exporter 容器的 mount 名称空间中,并执行 /bin/sh 命令
- nsenter -m -t $(docker container inspect node-exporter –format ‘{{.State.Pid}}’) /bin/sh
- 这条命令可以直接查看容器内的文件系统,效果如下
~]# nsenter -m -t $(docker container inspect node-exporter --format '{{.State.Pid}}') /bin/sh
~]# ls
bin dev etc home host lib proc root sys tmp usr var
~]# which node_exporter
/bin/node_exporter
- 注意:进入 mount 名称空间时所指定的 /bin/sh 命令必须要在容器内真是有这个程序,才能实现类似于 “进入” 名称空间的效果。否则,若该容器本身不提供任何 shell 程序,则无法实现进入效果。
lsns - 列出名称空间,包括 NS TYPE NPROCS PID USER COMMAND 字段
Syntax(语法)
lsns [OPTIONS] [NAMESPACE]
OPTIONS:
EXAMPLE
- lsns # 列出所有名称空间信息
反馈
此页是否对你有帮助?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.