详解 RunC 里面Terminal 和 Run Modes

开发 前端
runc的用法,这里面有两个非常重要的参数,Terminal和启动模式(前台启动和后台启动),下面我们就针对这两个参数,详细讲解一下。这两个参数两两组合就有四种情况。

[[440721]]

runc的用法,这里面有两个非常重要的参数,Terminal和启动模式(前台启动和后台启动),下面我们就针对这两个参数,详细讲解一下。这两个参数两两组合就有四种情况。

在实验之前,我们将容器的启动脚本改成

  1. #!/bin/sh 
  2. read input 
  3. echo “THIS IS STANDARD OUTPUT” 
  4. echo “YOU PROVIDED THIS AS STANDARD INPUT:” 
  5. echo $input 
  6. sleep 15 

1、Terminal 为 true 前台启动

这种情况最简单,input 会一直hang住等待用户的输入,当我输入ddd 后,最后输出ddd

  1. # runc run abc 
  2. ddd 
  3. “THIS IS STANDARD OUTPUT” 
  4. “YOU PROVIDED THIS AS STANDARD INPUT:” 
  5. ddd 

程序一直会等待15 秒后退出。

2、 Terminal为false前台启动

在前台启动的时候,这个Terminal 为false没啥影响

  1. # runc run def 
  2. gg 
  3. “THIS IS STANDARD OUTPUT” 
  4. “YOU PROVIDED THIS AS STANDARD INPUT:” 
  5. gg 

我们还可以通过echo 输入内容

  1. echo “TEST INPUT FROM COMMAND LINE” |sudo runc run alpine >container.out 2>&1 

上面的命令会等待15s 执行完成,执行完输出如下:

  1. “THIS IS STANDARD OUTPUT” 
  2. “YOU PROVIDED THIS AS STANDARD INPUT:” 
  3. “TEST INPUT FROM COMMAND LINE” 

上面两种前台启动的方式,会启动两个进程,分别是runc和init_script 脚本。

  1. $ ps -f  -C runc -C sh 
  2. UID        PID  PPID  C STIME TTY          TIME CMD 
  3. root      4600  4598  0 15:42 pts/0    00:00:00 runc run alpine 
  4. centos    4609  4600  0 15:42 pts/0    00:00:00 /bin/sh init_script.sh 

3、Terminal为false 后台启动

后台启动通过 -d 的方式,如下

  1. echo “TEST INPUT FOR DETACHED FROM COMMAND LINE” |sudo runc run -d alpine 
  2.  > container_detached.out 2>&1 

对比前台启动hang在那里,后台启动迅速执行完,结果如下

  1. # cat container_detached.out 
  2. “THIS IS STANDARD OUTPUT” 
  3. “YOU PROVIDED THIS AS STANDARD INPUT:” 
  4. “TEST INPUT FOR DETACHED FROM COMMAND LINE” 

4、Terminal为true 后台启动

由于Terminal为true,需要用户的输入,如果直接后台启动会报如下错误,

  1. $ sudo runc run -d alpine 
  2. cannot allocate tty if runc will detach without setting console socket 

错误是说,需要一个控制台socket。runc官方提供了runc/contrib/cmd/recvtty/recvtty.go的脚本。我们可以打开一个新的shell窗口,通过recvtty启动一个监听。

  1. ./recvtty alpine_container_socket.sock 

然后通过-d 启动

  1. $ sudo runc run -d --console-socket alpine_container_socket.sock alpine 

然后在recvtty里面会得到如下输出

  1. TEST INPUT FROM SOCKET 
  2. TEST INPUT FROM SOCKET 
  3. THIS IS STANDARD OUTPUT 
  4. YOU PROVIDED THIS AS STANDARD INPUT: 
  5. TEST INPUT FROM SOCKET 

如果通过后台启动的话,就只有一个 init_script 脚本。

  1. $ ps -f -C runc -C sh 
  2. UID PID PPID C STIME TTY TIME CMD 
  3. centos 4916 1 0 16:16 pts/0 00:00:00 /bin/sh init_script.sh 

 

责任编辑:武晓燕 来源: 今日头条
相关推荐

2021-12-30 10:30:12

RunC命令Linux

2021-10-25 08:20:45

工具容器OCI

2020-09-22 12:22:32

Windows TerWindowsLinux

2024-02-05 22:31:01

2021-10-27 10:12:54

DockerContainerdRunC

2021-03-18 08:57:23

Windows 10Windows Ter资源管理器

2023-10-07 08:26:40

多线程数据传递数据共享

2012-03-29 10:44:22

TimerTimerTaskJava

2021-01-25 15:46:15

Windows TerGUI微软

2009-03-01 22:09:08

LinuxTerminal命令行终端

2009-05-26 16:33:48

PythonC#Run As

2019-01-21 15:57:29

VLANVXLAN局域网

2009-07-21 13:43:53

ASP和JSP比较

2017-04-26 08:51:36

MongoDB集群实战

2011-04-02 09:17:38

2023-09-27 16:29:55

开发团队信息

2009-06-11 10:00:50

Glassfish安装GlassFish配置

2009-06-22 16:19:45

JavaBeansEJBPOJO

2023-10-12 16:39:00

2021-01-22 14:43:03

Windows TerWindows操作系统
点赞
收藏

51CTO技术栈公众号