容器运行时管理

概述

参考:

容器运行时通常都是由实现容器的工具自己管理的,如果要说真正通用的管理,可能只有 runc 了,而 runc 本质就是通过类似 unshare、nsenter 等 Util-linux Utilities 包中的工具完成容器运行时的功能。

unshare - 创建 namesapce

参考:

在新的 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 # 列出所有名称空间信息