Cntr:使用主机工具检查和调试容器

2020-12-17 13:29:01

对容器中的$ apt install vim说不! cntr是docker exec的替代品,可将所有开发人员工具随身携带。通过在FUSE文件系统的帮助下创建嵌套容器,将文件系统从一个容器或主机装载到目标容器中来完成。生产中的运行时映像最少,并限制了漏洞利用的范围。

对于linux x86_64,我们为每个发行版构建静态二进制文件。可以根据要求添加更多平台。有关预构建tarball的信息,请参见发布选项卡。在运行时,仅需要有问题的容器引擎的命令行工具。

编译所需的全部是锈+货物。查看rustup.rs了解如何获得有效的锈工具链,然后运行:

对于离线构建,我们还提供了一个打包了所有依赖项的压缩包,可与货物供应商进行编译。

attach:允许您使用自己的本机shell /命令连接到容器.Cntr会将容器安装在/ var / lib / cntr。容器本身将不受影响,因为容器进程看不到安装更改。示例:cntr attach< container_id>其中container_id可以是容器标识符或进程ID(请参见下面的示例)。

exec:进入容器后,还可以从容器文件系统本身运行命令。由于那些可能需要在/而不是/ var / lib / cntr的本机挂载布局,因此cntr再次提供exec子命令chroot到container,并且还重置了可能已被Shell更改的环境变量。

注意:Cntr需要与容器在同一主机上运行。如果cntr在超级管理程序上运行时,如果容器在虚拟机中运行,则该容器不起作用。

$ cntr --help用法:cntr COMMAND [ARGUMENTS ...]在容器位置参数中输入或执行:command要运行的命令(" attach"或" exec")参数命令可选参数:-h,-help显示此帮助消息并退出

$ cntr attach --help用法:子命令attach [OPTIONS] ID [COMMAND] [ARGUMENTS ...]输入容器位置参数:id容器ID,容器名称或进程ID在附加后执行的命令命令(默认:$ SHELL)传递给命令可选参数的参数:-h,-help显示此帮助消息并退出--effective-user EFFECTIVE_USER有效用户名,应为主机上新创建文件的所有者--type TYPE容器类型(docker | lxc | rkt | process_id | nspawn,缺省值:全部)

$ cntr exec --help用法:子命令exec [COMMAND] [ARGUMENTS ...]在容器文件系统中执行命令位置参数:要执行的命令命令(默认:$ SHELL)参数传递给命令可选参数的参数:-h,- -help显示此帮助消息并退出

$ docker run --name boxbusy -ti busybox $ docker ps容器ID图像命令创建的状态端口名称55a93d71b53b busybox" sh" 22秒前上20秒boxbusy

$ cntr attach 55a93d71b53b [root @ 55a93d71b53b:/ var / lib / cntr]#echo"我在一个容器中! " [root @ 55a93d71b53b:/ var / lib / cntr]#ip addr 1:lo:< LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc无队列状态UNKNOWN组默认qlen 1000链接/环回00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8作用域主机lo永远有效valid_lft preferred_lft永远40 :eth0 @ if41:<广播,多播,UP,LOWER_UP> mtu 1500 qdisc无队列状态UP组默认链接/以太02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.2/16 brd 172.17.255.255作用域全局eth0永久有效_lft首选永久_ [lft @ 55a93d71b53b:/ var / lib / cntr]#vim etc / resolv.conf

...或容器名称。使用cntr exec执行容器本机命令(在cntr shell中运行)。

$ lxc映像导入映像:/ alpine / edge $ lxc启动映像:alpine / edge $ lxc list + ----------------- + --------- + ------ + ------ + ------------ + ----------- + | NAME |州| IPV4 | IPV6 | TYPE |快照| + ----------------- + --------- + ------ + ------ + ------- ----- + ----------- + |惊奇的鲑鱼|正在运行| | |持久0 | + ----------------- + --------- + ------ + ------ + ------- ----- + ----------- +

$ lxc-create --name ubuntu -t下载--d ubuntu -r xenial -a amd64 $ lxc-start --name ubuntu -F ... Ubuntu 16.04.4 LTS ubuntu控制台ubuntu登录:$ lxc-ls ubuntu

$ rkt run --interactive = true docker:// busybox $ rkt list UUID应用程序图像名称状态创建的启动网络c2d2e87e busybox Registry-1.docker.io/library/busybox:最新运行时间6分钟前6分钟前默认值:ip4 = 172.16.28.3

#确保您的容器仍在运行!$ cntr attach c2d2e87e#最后不是旧的难看的顶部了! [gen0 @ rkt-c2d2e87e-e798-4341-ae93-26f6cbb7c017:/ var / lib / cntr]#htop ...

使用cntr,您还可以调试rkt的stage1-即使rkt本身没有支持。

$ ps aux | grep stage1 joerg 13546 0.0 0.0 120808 1608 pts / 12 S + 11:10 0:00 grep --binary-files = without-match --directories = skip --color = auto stage1 root 22232 0.0 0.0 54208 2656 pts / 7 S + 10 :54 0:00 stage1 / rootfs / usr / lib / ld-linux-x86-64.so.2 stage1 / rootfs / usr / bin / systemd-nspawn --boot --notify-ready = yes --register = true --link-journal = try-guest --quiet --uuid = c2d2e87e-e798-4341-ae93-26f6cbb7c017 --machine = rkt-c2d2e87e-e798-4341-ae93-26f6cbb7c017 --directory = stage1 / rootfs --capability = CAP_AUDIT_WRITE,CAP_CHOWN,CAP_DAC_OVERRIDE,CAP_FSETID,CAP_FOWNER,CAP_KILL,CAP_MKNOD,CAP_NET_RAW,CAP_NET_BIND_SERVICE,CAP_SETUID,CAP_SETGID,CAP_SETPCAP,CAP_SETFCAP,CAP_SYS_CHUTOT =-默认-输出状态= 0

$ cntr attach 22232#新的和即将退出的领土! [root @ turingmachine:/ var / lib / cntr]#mount | grep在/ var / lib / cntr / var / lib / rkt / pods / run / c2d2e87e-e798-4341-ae93-26f6cbb7c017 / stage1 / rootfs / sys类型sysfs(ro,nosuid,nodev,noexec,relatime)上的sysfs tmpfs在/ var / lib / cntr / var / lib / rkt / pods / run / c2d2e87e-e798-4341-ae93-26f6cbb7c017 / stage1 / rootfs / sys / fs / cgroup类型tmpfs(ro,nosuid,nodev,noexec,mode = 755)/ var / lib / cntr / var / lib / rkt / pods / run / c2d2e87e-e798-4341-ae93-26f6cbb7c017 / stage1 / rootfs / sys / fs / cgroup /内存类型cgroup(ro,nosuid,nodev ,noexec,relatime,memory)

$ wget https://cloud-images.ubuntu.com/releases/16.04/release/ubuntu-16.04-server-cloudimg-amd64-root.tar.xz$ mkdir / var / lib / machines / ubuntu $ tar -xf ubuntu -16.04-server-cloudimg-amd64-root.tar.xz -C / var / lib / machines / ubuntu $ systemd-nspawn -b -M ubuntu $ machinectl list机器类服务操作系统版本地址ubuntu容器systemd-nspawn ubuntu 16.04-

cntr所需的最少信息是您要附加到的容器进程的进程ID。

#现在您是否也使用了名称空间?$ ps aux | grep' chromium --type = renderer' joerg 17498 11.7 1.0 1394504 174256? Sl 15:16 0:08 / usr / bin / chromium

$ cntr attach 17498#看起来与我们的系统非常相似,但是用户较少[joerg @ turingmachine cntr] $ ls -la /总数240 drwxr-xr-x 23 nobody nogroup 23 Mar 13 15:05。 drwxr-xr-x 23 none nogroup 23 Mar 13 15:05 .. drwxr-xr-x 2 none nogroup 3 Mar 13 15:14 bin drwxr-xr-x 4 none nogroup 16384 Jan 1 1970引导drwxr-xr-x 24无人nogroup 4120 Mar 13 14:56 dev drwxr-xr-x 52无人nogroup 125 3月13日15:14等drwxr-xr-x 3无人nogroup 3 Jan 8 16:17家drwxr-xr-x 8无人nogroup 8 2月9日22:10 mnt dr-xr-xr-x 306无人nogroup 0 Mar 13 09:38 proc drwx ------ 22无人nogroup 43 Mar 13 15:09根...

Cntr与容器无关:它不与容器引擎接口,而是实现底层操作系统API。它将每个容器视为一组进程,可以从中继承属性。

它在引擎盖下生成了一个外壳程序或用户定义的程序,该程序继承了容器的整个上下文并将其自身安装为保险丝文件系统。

我们使用xfstests和广泛的文件系统性能基准(iozone,pgbench,dbench,fio,fs-mark,postmark等)广泛评估了cntr文件系统的正确性和性能。

工具箱确实从容器连接到主机,这与Cntris所做的相反

@inproceedings {cntr-atc18,作者= {J {\" o} rg Thalheim和Pramod Bhatotia和Pedro Fonseca和Baris Kasikci},标题= {Cntr:轻量级{OS}容器},书名= {2018 {USENIX }年度技术会议({USENIX} {ATC} 18)},年份= {2018},}